Java语言提供了8种基本数据类型,分别是 byte、short、int、long、float、double、boolean、char。String 类型虽然存在,但它属于对象,不属于基本数据类型。
这8种基本数据类型可以分为两大类:数值型和布尔型。数值型包括 byte、short、int、long、float、double,布尔型只有 boolean。这些基本数据类型在进行操作时,如使用 "==" 比较都是比较值。对于 Boolean 类型,《Java 虚拟机规范》给出了4个字节,但虚拟机实现方式可能不同,所以1个字节或4个字节都有可能。
在Java中,使用 Integer 类型创建数据,实际上是一个 Integer.valueOf 过程。这个过程会根据值的范围决定是否从高速缓存返回实例或 new 一个Integer对象。这样就涉及到了 "装箱" 和 "拆箱" 的问题。当两个Integer对象比较时,实际上比较的是内存地址,所以如果两个Integer对象存放的地址不同,即使它们的值相等,比较结果也是 false。在判断时,如果与基本数据类型(如 int)进行比较,Integer会自动拆箱成基本数据类型进行比较。
在进行 int 和 Integer 类型比较时,结果永远为 true,因为会把 Integer 类型自动拆箱为 int 类型,相当于两个 int 类型进行比较。
Java中的默认值问题涉及到浮点数的表示。如果没有在浮点数后面加 f,它默认就是 double 类型。解决方法是使用 float 或者 float 类型的修饰符。
Integer.parseInt() 和 Integer.valueOf() 都是将字符串转换为 Integer 类型的方法。parseInt() 将字符串作为带符号十进制整数转换,如果无法转换会抛出异常。valueOf() 则返回初始化为指定字符串值的新 Integer 对象,同样,如果无法转换会抛出异常。
当涉及到不同类型数据的运算时,Java会自动进行类型转换,如从低精度类型向高精度类型转换。然而,double 类型数值运算时常因二进制表示的精度问题而出现精度丢失。在这种情况下,可以使用 Java.math.BigDecimal 类来进行高精度计算。
在进行字符串与整数拼接时,Java会从左到右按顺序运算。在表达式 a + b + c 中,a + b 的结果是一个 String 类型,然后与 c 拼接,最终结果为 String 类型。类似地,在表达式 b + c + a 中,b + c 的结果是 int 类型,然后与 a 拼接,最终结果也是 String 类型。
在Java基本数据类型的学习中,了解这些细节能有效避免常见错误。例如,正确理解赋值语句 a = 10; b = a; 中的含义,理解 a 和 b 的类型和值的关系。同样,理解表达式 (short)10/10.2*2 的结果类型,明确 Java 中浮点数默认为 double 的原则,以及不同类型运算时的自动类型转换机制。