2.4、数据类型
Java是一种强类型语言,所有的变量必须先定义后使用,且定义时需要指定数据类型。强类型语言在编译过程能发现源代码的错误,保证代码的健壮性
-
强类型语言:如Java,必须明确数据类型,标明是什么类型就是什么类型。
int a = 1; //整型 String str = "Java"; //字符串
-
弱类型语言:如Python、JavaScript,不需要明确数据类型,可直接定义,语言解析器会自动进行隐式的转换。
a = 1; str = "python";
数据类型的分类:
其中字符型数据本质是Unicode编码,所以也可以看成是数值类型。数值类型之间是可以进行类型转换的,转换方式分为强制类型转换和自动类型转换。
2.4.1、基本数据类型
在 Java 中,基本数据类型是预定义的和特殊支持的数据类型,它们不是对象。Java 提供了 8 种基本数据类型,分为整数类型、浮点类型、字符类型和布尔类型。
1、整型
即没有小数部分的数。可以为负数。
类型 | 存储大小 | 取值范围(有符号) | 默认值 | 说明 |
---|---|---|---|---|
byte | 1个字节8位,有符号、以二进制补码表示 | -128(-2^7)~ 127(2^7-1) 0~255 | 0 | 字节型 |
short | 2个字节 16 位 | -32768(-2^15)~ 32767(2^15 - 1) | 0 | 短整型 |
int | 4个字节32位 | -2,147,483,648(-2^31) ~ 2,147,483,647(2^31 - 1) | 0 | 整型,最常用的整数类型 |
long | 8个字节 64 位 | -9,223,372,036,854,775,808(-2^63) ~ 9,223,372,036,854,775,807(2^63 -1) | 0L | 长整型,主要使用在需要比较大整数的系统上,long必须以L或l结尾 |
其中int 整型
是最常用的整数类型,一般地整型变量默认为 int 类型。
在需要用到较大数据时,首先选择long,而byte和short主要用于特定的应用场景。
注意点:
进制表示:
- 八进制:以数字 0 开头(例如:int octVal = 032;)。
十六进制:以 0x 或 0X 开头(例如:int hexVal = 0x1a;)。
二进制:以 0b或 0B开头(例如:int binVal = 0b11010;)。
下划线:在 Java 7 及以上版本中,整数字面量中可以使用下划线(_)作为分隔符,以提高可读性
类型转换:在不同整型之间进行操作时,需要进行类型转换。范围小的类型可以自动转换为大的类型,但从较大的类型转换到较小的类型时需要显式转换。
算术运算:整型数据类型可以进行加、减、乘、除等基本的算术运算。需要注意的是,整数除法会丢弃小数部分(例如:5 / 2 的结果是 2)。
Java中整型的范围是固定的,它的长度和机器无关,这样就解决了在不同机器之间的移植问题。
2、浮点型
浮点类型用于表示有小数部分的数值。它是有限、离散的,有舍入的误差,结果为约等于,应避免使用浮点数进行计算等操作,银行业务可以用BigDecimal工具类
-
float 单精度小数:
1、float 数据类型是单精度、 4个字节 32位、符合 IEEE 754标准的浮点数;(32位中:第一位是符号位,后面8位为指数位,剩下的23为表示为尾数) 2、float 在储存大型浮点数组的时候可节省内存空间; 3、默认值是 0.0f;(后缀为f或F) 4、浮点数不能用来表示精确的值
-
double 双精度小数
1、double 数据类型是双精度、 8个字节 64 位、符合IEEE 754标准的浮点数;(64位中:第一位是符号位,后面11位为指数位,剩下的52为表示为尾数) 2、浮点数的默认类型为double类型; 3、double类型同样不能表示精确的值,如货币; 4、默认值是 0.0d;
在Java用浮点数除以0不会报错,因为它表示无穷大。而整数除以0会报错。
正无穷大为:POSITIVE_INFINITY
负无穷大为:NEGATIVE_INFINITY
注意点:
默认类型:在没有后缀的情况下,浮点字面量默认被视为 double类型。
精度问题:由于计算机二进制存储的限制,某些十进制小数不能被精确表示为二进制小数。因此,浮点运算可能存在精度损失的问题。
所以通常不推荐使用 浮点型 存储精确值,如货币。在这种情况下,通常使用 BigDecimal类。
类型转换:在不同的浮点类型和整型之间进行操作时,需要进行类型转换。较小的类型可以自动转换为较大的类型,但从较大的类型转换到较小的类型时需要显式转换。
浮点异常:浮点类型的运算可能产生“非数”(NaN)和“正无穷大”(Infinity)的结果。
3、char 字符
1、char类型是一个单一的 2个字节16位 Unicode 字符;必须用''单引号括起来
2、最小值是 \u0000(即为 0),最大值是 \uffff(即为65535),共65536个
3、char 数据类型可以储存任何字符,有且只能有一个字符;
4、可以进行加减乘除的计算,实质为Unicode编码间的计算。
注意事项:
- Unicode 字符:Java 使用 Unicode 字符集,因此 char类型可以存储任何 Unicode 字符。
- ASCII字符集:早期美国人对英文字母、数字、标点符号进行的编号。只有100多个,占1字节
- Unicode字符集:美国人位世界上所有书面语言的字符进行统一编号。共用65536个,占用2字节
- 字符算术:char 类型的变量可以参与算术运算,它们实际上存储的是字符的 Unicode 编码值。例如,‘A’ + 1的结果是 ‘B’。
- 字符和数字:字符和数字是不同的。例如,‘3’ 是字符 3 的 Unicode 编码,而不是数字 3。
- 自动类型转换:char 类型可以自动转换为整型或浮点型,转换时使用字符的 Unicode 编码值。
4、boolean
boolean的值只有true和false,用于表示逻辑上的真和假。
1、boolean数据类型虽然只需要1位就可以表示,但计算机实际分配内存时最小是1字节8位,所以boolean实际上也是占8位
2、只有两个取值:true (1)和 false(0);
3、这种类型只作为一种标志来记录 true/false 情况;
4、默认值是 false;
5、布尔型用于逻辑运算、条件控制语句、循环语句等
特点和注意事项:
- 非整型:在某些编程语言中,布尔类型可能与整数(如 0 和 1)互换使用,但在 Java 中,boolean与整数类型是严格分开的,不能互相转换。
- 逻辑运算:boolean 类型的变量可以进行逻辑运算
- 条件语句:boolean 类型常用于条件判断,例如 if 语句、while 循环等。
- 返回值:方法可以返回 boolean 类型的值,通常用于检查某些条件是否满足。
2.4.2、基本类型转换
-
自动类型转换(隐式):自动类型转换是指小的数据类型自动转换为大的数据类型。这种转换是安全的,不会丢失数据。转换的顺序通常是这样的:
byte -> short -> int -> long -> float -> double char -> int
-
强制类型转换(显式):强制类型转换是指将大的数据类型转换为小的数据类型。这种转换可能会丢失数据,因此需要显式地进行转换,通过在变量前面加上目标类型进行转换。
java为强类型语言,数字表示范围小的数据类型可以自动转换
成范围大的数据类型,但是大范围的数据转换成小范围数据需要强制类型转换
,在计算时会自动向范围表示大的值的数据类型提升
。
1、布尔值不参与类型转换
2、不能把对象类型转换为不相干的类型
3、大范围的数据转换成小范围数据需要强制类型转换(类型)value,强制转换存在内存溢出的问题,容易影响精度
比如:double a = 9.96d; int b = (int)a; b结果为9
4、浮点数到整数的转换是通过舍弃小数得到,而不是四舍五入
5、整数的常量默认为int类型,浮点型常量默认是double类型
6、当一个表达式中含有多种类型的值时,表达式的类型会自动提升,提升到其中最高级别的类型:byte、short、char → int → long → float → double(布尔值不参与)
当表达式中包含 byte、short、char 和 int 类型的值时,这些值首先会被提升至 int 类型。
如果表达式中包含 long 类型的值,那么所有更低级别的类型(包括 int)都会被提升至 long 类型。
如果表达式中包含 float 类型的值,那么所有更低级别的类型(包括 long)都会被提升至 float 类型。
如果表达式中包含 double 类型的值,那么所有更低级别的类型(包括 float)都会被提升至 double 类型。
注意事项:
- 数据丢失:在强制类型转换中,如果将较大的数据类型转换为较小的数据类型,可能会丢失数据。
- 精度丢失:在涉及浮点数和整数之间的转换时,可能会丢失精度。
- 范围问题:在强制类型转换中,如果数据超出目标类型的范围,可能会得到不可预测的结果。
- 字符转换:字符可以被转换为整数类型,转换结果是字符的 Unicode 编码值。反之,整数也可以转换为字符,结果是对应的 Unicode 字符。