Java数据类型:基本数据类型

news2025/1/18 8:53:05

Java是一种强类型语言,定义变量时,必须指定数据类型。

// 变量必须指定数据类型
private String username;

初学者不免有个疑问:在实际编写代码的过程中,该如何选择数据类型呢?

回答这个问题之前,先来解决下面两个问题:

①Java中的数据类型有什么作用?
②Java有哪些数据类型呢?

一,数据类型的基本概念

1,定义

  • 数据类型是变量的属性
  • 决定了变量可以存储的数据的种类以及这些数据如何被操作

2,为什么要区分数据类型

Java是一门工业级的高级程序语言,区分不同的数据类型出于以下几个核心原因:

  • 内存效率:不同类型的数据需要不同的存储空间。例如,一个byte类型只需1字节的存储空间,而一个int类型需要4字节。这种区分允许程序仅使用必要的内存空间,从而节省资源,提高效率。

  • 精确表达数据:每种数据类型都有其特定的取值范围和精度。例如,float类型用于存储近似的小数,而double提供更高的精度。boolean类型则用于逻辑判断,只有truefalse两个值。通过精确匹配数据类型与数据需求,可以确保数据的准确表达和处理。

  • 安全性:类型检查机制是Java的一大特色。编译器会检查数据类型的正确性,防止不恰当的类型使用,如将字符串与整数进行算术运算,这会在编译阶段报错,避免了运行时错误。

  • 性能优化:不同的数据类型支持不同的操作集。例如,整型数据支持位操作,而浮点型则不支持。区分数据类型可以让编译器生成更优化的代码,利用特定类型的特性进行高效运算。

  • 清晰的代码可读性:通过数据类型命名,程序员可以直观地了解变量的用途和它可以存储的值的范围,这提高了代码的可读性和可维护性。

  • 面向对象编程的支持:Java是一种面向对象的语言,区分数据类型有助于实现面向对象的原则,如封装、继承和多态。基本类型可以被视为简单对象,而引用类型则用于复杂的对象操作,这符合面向对象设计的思想。

  • 避免数据溢出和精度损失:通过为不同大小和精度的数据指定不同类型,可以在设计时预防数据溢出(如将过大的数存储在int类型中)和精度损失(如使用float进行高精度计算)的问题。

3,分类

Java中的数据类型分为两类:

  • 基本数据类型
  • 引用数据类型

基本数据类型是Java语言预先定义的,它们不是对象,而是直接存储值。这篇文章仅介绍基本数据类型。

二,基本数据类型

1,分类

基本数据类型可以分为四类

  • 整数,包括 byte、short、int、long
  • 浮点数,包括double、float
  • 字符,仅有一个char类型
  • 布尔类型,仅有一个boolean类型
    在这里插入图片描述

2, 整型(Integer Types)

整型用于存储整数,主要有以下几种:

  • byte: 占1字节,范围-128到127
  • short: 占2字节,范围-32,768到32,767
  • int: 占4字节,是Java中最常用的整数类型,范围-231到231-1,能存储的数据范围大约是正负21亿
  • long: 占8字节,用于需要更大数值的情况,范围-263到263-1。能存储的数据范围大约是正负9千万亿long的数值范围远超int,适用于需要存储极大整数的场景。定义long常量时需以Ll结尾,以区分int,推荐以L结尾,避免与数字1混淆。

在这里插入图片描述

byte b = 100; // 正确
// byte bError = 128; // 错误:超出byte范围

short s = 30000; // 正确
// short sError = 32768; // 错误:超出short范围

int i = 2_147_483_647; // 使用下划线增加可读性
// int iError = 2_147_483_648; // 错误:超出int范围

long l = 9_223_372_036_854_775_807L; // long需加L/l

3, 浮点型(Floating-Point Types)

浮点型用于存储小数,主要有:

  • float: 占4字节,大约有6-7位有效数字
  • double: 占8字节,精度更高,约有15位有效数字,是Java中的默认浮点类型。doublefloat提供更高的精度,更适合需要高精度计算的场景。

在这里插入图片描述

float f = 3.14f; // 需要f/F后缀
// float fError = 1.0E39f; // 错误:超出float表示范围

double d = 3.141592653589793; // 不需要后缀,默认为double
// double dError = 1.0E309 + 1; // 错误:超出double表示范围

计算机在处理浮点数的计算时,容易出现误差,对于财务计算等精确度要求极高的情况,最佳实践是使用BigDecimal以避免浮点数运算的误差。BigDecimal采用了特殊的算法以避免直接进行浮点数的计算。

4,布尔类型(boolean)
在Java中,布尔数据类型的关键字是boolean,布尔类型的值只能是true或者false

boolean isTrue = true;
boolean isFalse = false;
System.out.println(isTrue);   // 输出:true
System.out.println(isFalse);  // 输出:false

布尔数据类型常用于条件判断语句中,例如if语句和while循环等。通过判断布尔值的真假,来决定程序的执行路径。

boolean isSunday= true;
if (isSunday) {
    System.out.println("今天是星期天");
} else {
    System.out.println("今天不是星期天");
}

布尔数据类型是高频使用类型,布尔值控制程序的行为,从而实现复杂的逻辑。

4,字符类型(char)

在Java中,字符数据类型的关键字是char,字符变量值用单引号包围。

char ch1 = 'A';
char ch2 = 'B';
System.out.println(ch1);  // 输出:A
System.out.println(ch2);  // 输出:B

除了使用单个字符外,还可以使用转义序列来表示特殊字符,例如换行符(\n)、制表符(\t)等。

char newLine = '\n';
char tab = '\t';
System.out.println("Hello" + newLine + "World");
System.out.println("Java" + tab + "Programming");

字符数据类型也支持直接使用Unicode编码来表示字符,使用反斜杠u后面跟上4位16进制数字。

char chineseChar = '\u4E2D';  // 表示中字
System.out.println(chineseChar);  // 输出:中

字符数据类型可以与整数数据类型互相转换,字符数据类型的底层存储是Unicode字符编码的整数值。

char ch = 'A';
int asciiValue = ch;  // 将字符转换为ASCII值
System.out.println(asciiValue);  // 输出:65
int intValue = 66;
char character = (char) intValue;  // 将ASCII值转换为字符
System.out.println(character);  // 输出:B

需要注意的是,字符数据类型只能用于表示单个字符,不能表示字符串。如果需要表示多个字符,应使用字符串数据类型(String)

三,类型转换

1,什么是数据类型转换

在进行数学运算、比较或者赋值等操作时,如果参与操作的数据类型不一致,Java会如何处理呢?

Java要求这些数据必须转换为相同的类型才能进行运算

例如,当你尝试将一个int类型的值与一个double类型的值相加时,int值会被自动转换为double,因为double的精度更高。

这就是Java的数据类型转换

2,如何进行类型转换

Java支持①自动类型转换(也称为隐式类型转换)(例如,byteint)和②强制类型转换(也称为显式类型转换)(如,(int) longValue)。

3, 自动类型转换(Auto Widening Conversion)

自动类型转换是指Java编译器在没有明确指示的情况下,自动将小范围的数据类型提升为大范围的数据类型,这通常是安全的,不会导致数据丢失。

自动类型转换遵循以下规则:

数据类型层次:Java的数据类型按照其存储容量从低到高排列为:byte -> short -> char -> int -> long -> float -> double。自动类型转换时,左边的类型自动提升为右边的类型,比如 int 可以提升为 double,但不会出现反方向的自动转换,即double 不可能自动转换为 int。注意,char可以直接转换为int,因为它们都代表整数。

兼容性:转换的类型必须是兼容的,即目标类型能够容纳源类型的值。例如,一个int值可以自动转换为long,因为long的范围比int

布尔型boolean类型与其他基本类型不兼容,不能进行自动转换

4,强制类型转换(Explicit Narrowing Conversion)

当目标类型小于源类型时,自动类型转换无法进行,此时就需要使用强制类型转换。

强制类型转换规则如下:

  • 显式声明:需要使用括号明确指定转换的目标类型,例如(int)longValue(longValue是一个long类型变量)。

  • 数据丢失风险:由于目标类型可能无法完全容纳源类型的所有可能值,强制类型转换可能会导致数据丢失或精度降低。例如,将double转换为float可能会丢失小数部分的精度。

        double a = 3.141593300001;// 有12小数,超出float表达范围
        float b = (float) a; // 强制转换后,后五位会被丢弃,出现精度损失
        System.out.println(b+"");

在这里插入图片描述

  • 范围检查:在进行强制类型转换前,开发者应确保源类型值的范围能够被目标类型安全地表示。如果超出目标类型的范围,可能会导致数据溢出,代码可以正常运行,但有可能出现不可以预知的结果。
        int a = 300000;// 超出short的最大值32767
        short b = (short) a;
        System.out.println(b+"");

运行结果:

在这里插入图片描述
强制转换后,变量b的值是-27680,原因是4字节的变量值强制转换为2字节的变量时,只截取了其中一部分,导致结果出现差异。

  • 特例:当将floatdouble转换为intlong时,小数部分会被直接丢弃(截断),而不是四舍五入。
       double a = 3.14159;// 有小数
        short b = (short) a; // 强制转换后,小数被丢弃
        System.out.println(b+""); // 打印 "3"

在这里插入图片描述

示例

// 自动类型转换示例
byte b = 100;
int i = b; // 自动从byte转换为int

// 强制类型转换示例
double d = 123.45;
int i = (int) d; // 强制从double转换为int,小数部分丢失

四,如何选择基本数据类型

基于上面的学习,在编写Java代码时,选择合适的基本数据类型就有了理论依据。

选择Java基本数据类型,通常考虑如下几个方面:

  • 数据的用途和所需表达的值的范围

    如果数据是整数且在-128到127之间,byte可能是最佳选择;如果需要表示较大的整数,则考虑intlong

  • 精度要求

    对于浮点数,如果需要高精度计算(如财务计算),使用BigDecimal而非floatdouble,因为后者会有精度损失。对于一般科学计算,double足够使用。

  • 类型兼容性和运算规则

    当不同类型的数据进行运算时,Java会自动将较小类型转换为较大类型。理解这些规则有助于避免不必要的类型转换,比如知道intlong运算时,int会被自动提升为long

  • 性能考虑

    基本数据类型的操作通常比对象类型(如Integer)快,因为它们不需要通过对象引用来访问值。
    在循环和频繁操作的代码块中,尽量使用基本数据类型以提高性能。

  • 避免类型转换

    尽量减少不必要的类型转换,特别是强制类型转换,因为这可能导致数据丢失或异常。在设计阶段就做好类型规划,以减少转换的需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1674573.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vulhub靶机struts2环境下的s2-032(CVE-2016-3081)(远程命令执行漏洞)

影响范围 Struts 2.3.19至2.3.20.2、2.3.21至2.3.24.1和2.3.25至2.3.28 当用户提交表单数据并验证失败时,后端会将用户之前提交的参数值使用OGNL表达式%{value}进行解析,然后重新填充到对应的表单数据中。 漏洞搭建 没有特殊要求,请看 (3…

给定两点所能得到的数学关系

给定两点所能得到的数学关系 正文 正文 这里介绍一个基础问题,如果给定平面上的两个点的坐标,那么它们之间能够得到什么数学关系呢? ω arctan ⁡ y 1 − y 0 x 1 − x 0 x 1 − x 0 d cos ⁡ ω y 1 − y 0 d cos ⁡ ω d ( x 1 − x…

干部谈话考察:精准洞悉,助推成长

在组织人事管理的精细布局中,干部谈话考察扮演着举足轻重的角色。它不仅是组织深度了解干部、精准评价其表现的重要窗口,更是推动干部个人成长、优化组织人才配置的关键一环。通过深入的谈话考察,我们能够全面把握干部的思想脉搏、工作能力、…

AngularJS指令

指令分类: 1)装饰器型指令 装饰器指令的作用是为DOM添加行为,使其具有某种能力。在AngularS中,大多数内置指令属于装饰器型指令,例如ng-click(单击事件)、ng-hide/ng-show(控制DOM元素的显示和隐藏)等 2)组…

uniapp 生成安卓证书没有md5指纹怎么办?

由于最新的jdk版本对应的keystore工具无法查看到md5指纹信息 但是不代表它没有md5指纹信息,只是看不到而已 解决方案: 登录uniapp开发者后台生成安卓云端证书

SSM【Spring SpringMVC Mybatis】—— Spring(二)

如果对于Spring的一些基础理论感兴趣可见👇 SSM【Spring SpringMVC Mybatis】—— Spring(一) 目录 1、Spring中bean的作用域 1.1 语法 1.2 四个作用域 2、Spring中bean的生命周期 2.1 bean的生命周期 2.2 bean的后置处理器 2.3 添加后…

【Vue】Vue指令与生命周期以及组件化编码

目录 常用内置指令v-text与v-htmlv-text : 更新元素的 textContentv-html : 更新元素的 innerHTML注意:v-html有安全性问题!!!! v-once与v-prev-oncev-pre ref与v-cloakrefv-cloak 自定义指令案例定义语法配置对象中常…

一键批量合并视频:掌握视频剪辑技巧解析,轻松创作完美影片

在数字时代的浪潮下,视频已成为人们记录和分享生活的重要工具。然而,对于许多非专业视频编辑者来说,将多个视频片段合并成一个完整的影片却是一项复杂且耗时的任务。幸运的是,云炫AI智剪一键批量合并视频功能的出现,让…

QT切换控件布局

1、切换前垂直布局 2、切换后水平布局 3、关键代码 qDebug() << "开始切换布局";QWidget *widget centralWidget();QLayout *layout widget->layout();if(layout){while(layout->count()){QLayoutItem *item layout->takeAt(0);if(item->layout…

自动化神器Autolt,让你不再重复工作!

随着互联网不断发展&#xff0c;它给我们带来便利的同时&#xff0c;也带来了枯燥、重复、机械的重复工作。今天&#xff0c;我要和大家分享一款老牌实用的自动化工具&#xff1a;AutoIt&#xff0c;它能够让你告别繁琐的重复性工作&#xff0c;提高工作效率。 这里透露一下&am…

C++中的complex

在 C 中&#xff0c;std::complex 是一个模板类&#xff0c;用于表示和操作复数。这个类是标准模板库&#xff08;STL&#xff09;的一部分&#xff0c;包含在 头文件中。std::complex 提供了一套丰富的功能&#xff0c;包括基本的算术运算、比较运算、数学函数等&#xff0c;使…

大语言模型LLM原理篇

大模型席卷全球&#xff0c;彷佛得模型者得天下。对于IT行业来说&#xff0c;以后可能没有各种软件了&#xff0c;只有各种各样的智体&#xff08;Agent&#xff09;调用各种各样的API。在这种大势下&#xff0c;笔者也阅读了很多大模型相关的资料&#xff0c;和很多新手一样&a…

苹果 iPhone 15 Pro Max 称霸:智能手机市场势不可挡

苹果 iPhone 15 Pro Max 称霸&#xff1a;智能手机市场势不可挡 概述 在拥挤且竞争激烈的智能手机市场中&#xff0c;苹果的 iPhone 15 Pro Max 成为明显的赢家&#xff0c;在 2024 年第一季度最畅销智能手机排行榜上名列前茅。根据 Counterpoint Research 的数据&#xff0c…

css: 动态设置网格线

参考这个博客做了网格线&#xff1a; http://t.csdnimg.cn/y20vM 把网格颜色&#xff0c;宽高和透明度做成可配置项。 <e-collapse title"网格线" :expand"false"><t-form-item label"颜色"><el-color-picker v-model"fo…

vue2+Ts中openLayer绘图工具组件封装

vue2Ts中openLayer绘图工具组件封装 效果&#xff1a; 封装组件代码&#xff1a; <!-- openLayer绘图工具 --> <template><a-button-group v-show"isShow"><a-button v-if"shouldShowButton(point)" click"draw(Point)"…

Axure10_win安装教程(安装、汉化、授权码,去弹窗)

1.下载Axure10 链接&#xff1a;https://pan.baidu.com/s/1fc8Bgyic8Ct__1IOv-afUg 提取码&#xff1a;9qew 2.安装Axure10 因为我的电脑是Windows操作系统&#xff0c;所以我下载的AxureRP-Setup-Beta v10.0.0.3816 (Win).exe 一直点下一步就行 3.Axure10中文 打开Axure…

(python)cryptography-安全的加密

前言 cryptography 是一个广泛使用的 Python 加密库&#xff0c;提供了各种加密、哈希和签名算法的实现。它支持多种加密算法&#xff0c;如 AES、RSA、ECC 等&#xff0c;以及哈希函数&#xff08;如 SHA-256、SHA-384 等&#xff09;和数字签名算法(如 DSA、ECDSA 等). 目录 …

Linux下Code_Aster源码编译安装及使用

目录 软件介绍 基本依赖 其它依赖 一、源码下载 二、解压缩 三、编译安装 四、算例运行 软件介绍 Code_aster为法国电力集团&#xff08;EDF&#xff09;自1989年起开始研发的通用结构和热力耦合有限元仿真软件。Code_aster可用于力学、热学和声学等物理现象的仿真分析&…

诺基亚3210复古风再起:情怀与现实的碰撞

在数字科技日新月异的今天&#xff0c;诺基亚的复古风潮却意外地掀起了波澜。这款曾经风靡一时的诺基亚3210&#xff0c;在时隔二十五年后&#xff0c;以全新的面貌再次回归市场&#xff0c;引发了无数人的怀旧与好奇。 诺基亚的这次“千禧回归”策略&#xff0c;无疑是对Y2K潮…

Java——类和对象第二节——封装

1.什么是封装 封装是面向对象程序的三大特性之一&#xff0c;面向对象程序的三大特性分别是封装&#xff0c;继承&#xff0c;多态 而封装简单来说就是套壳隐藏细节 打个比方&#xff1a; 在一些电脑厂商生产电脑时&#xff0c;仅对用户提供开关机键&#xff0c;键盘输入&a…