基本数据类型
boolean、byte、char、short、int、long、float、double及其包装类型Boolean、Byte、Character、Short、Integer、Long、Float、Double
整形包装类型比较
Integer比较时,取值范围在-128~127时,使用==能够比较出结果(虽然不建议);但是超过了这个范围,使用==比较就不能正确比较了;
原因:范围在-128~127时,Integer对象会从内部类IntegerCache中获取,超过范围会从Heap中获取;因为对于对象来说比较时比较的是地址;
类似的包装类型及从cache取值范围如下:
Character | Short | Integer | Long |
0~127 | -128~127 | -128~127 | -128~127 |
源码:
System.out.println("==========================Character========================"); Character character1 = 127; Character character2 = 127; Character character3 = 0; Character character4 = 0; Character character5 = 128; Character character6 = 128; System.out.println(character1 == character2); System.out.println(character3 == character4); System.out.println(character5 == character6); System.out.println(character5.equals(character6)); System.out.println("==========================Short========================"); System.out.println(Short.valueOf((short) -128) == Short.valueOf((short) -128)); System.out.println(Short.valueOf((short) 127) == Short.valueOf((short) 127)); System.out.println(Short.valueOf((short) 128) == Short.valueOf((short) 128)); System.out.println(Short.valueOf((short) -129) == Short.valueOf((short) -129)); Short short1 = -129; Short short2 = -129; System.out.println(short1.equals(short2)); System.out.println("==========================Integer========================"); System.out.println(Integer.valueOf(-128) == Integer.valueOf(-128)); System.out.println(Integer.valueOf(127) == Integer.valueOf(127)); System.out.println(Integer.valueOf(128) == Integer.valueOf(128)); System.out.println(Integer.valueOf(-129) == Integer.valueOf(-129)); Integer integer1 = -129; Integer integer2 = -129; System.out.println(integer1.equals(integer2)); System.out.println("==========================Long========================"); System.out.println(Long.valueOf(-128) == Long.valueOf(-128)); System.out.println(Long.valueOf(127) == Long.valueOf(127)); System.out.println(Long.valueOf(128) == Long.valueOf(128)); System.out.println(Long.valueOf(-129) == Long.valueOf(-129)); Long long1 = -129L; Long long2 = -129L; System.out.println(long1.equals(long2));
运行结果:
==========================Character========================
true
true
false
true
==========================Short========================
true
true
false
false
true
==========================Integer========================
true
true
false
false
true
==========================Long========================
true
true
false
false
true
浮点类型
float:精度为8位,超过8位丢弃;定义float变量时后面要指定f,例如:float f1 = 1.34f;
double:精度为17位,超过17位丢弃;定义double时,可以不指定d
源码:
System.out.println("==========================Float========================"); float f1 = 1.123456789f; System.out.println(f1); System.out.println("==========================Double========================"); double d1 = 1.123456789012345678; System.out.println(d1);
运行结果:
==========================Float========================
1.1234568
==========================Double========================
1.1234567890123457
注:浮点数只能用于科学计算和商业计算,不适合数学运算;原因:计算机计算时转换为二进制,这个时候可能会失去精度导致计算结果偏差;
个人理解:只要浮点数不进行运算,那么无影响;如果进行了运算,那么得到的值可能不是预期的
浮点包装类比较
不能用==或者.equals比较,可以使用compareTo比较大小,但是不能比较是否相等;可以考虑使用BigDecimal做比较