Java重温学习笔记,基本数据类型
一、 float/double类型对后缀大小写不敏感。如:
float f1 = 234.5f; float f2 = 234.5F;
效果等同。
double d1 = 7.; double d2 = 7.d; double d3 = 7.0D;
效果等同。
二、long类型,如果赋值时数据过大,必须加后缀L(建议养成习惯)。不加后缀默认按整型处理,易报错。
如:
long g1 = 9223372036854775807; long g2 = (long)9223372036854775807;
编译时都会报错:错误: 过大的整数: 9223372036854775807
正确方式为:
long g1 = 9223372036854775807L; long g2 = 9223372036854775807l;
三、IntegerCache缓存的问题
public static void main(String[] myarg) { Integer i1 = 5678; Integer i2 = 5678; System.out.println(i1==i2); Integer i3 = 101; Integer i4 = 101; System.out.println(i3==i4); }
上面这段代码的输出是:
false
true
原因参考IntegerCache类的实现代码:
public static Integer valueOf(int i) { assert IntegerCache.high >= 127; if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); }
从上面可以看出, i >= -128 && i <= 127 时,Integer.valueOf(i) 会将 i 存储在内部类 IntegerCache的static final Integer cache[]里,这一字节的缓存内存地址是静态的。
注意:如果Integer不是通过自动装箱赋值,而通过new关键字赋值,则结果又不同。如:
public class MyDemo { public static void main(String args[]){ Integer i1 = 100; Integer j1 = 100; System.out.print(i1 == j1); //true Integer i2 = new Integer(100); Integer j2 = new Integer(100); System.out.print(i2 == j2); //false } }
四、char与byte的区别
byte 是字节数据类型,是有符号型的,占1 个字节,大小范围为:-128—127 。char 是字符数据类型 是无符号型的,占2字节(Unicode码 ),大小范围 为:0—65535。char是一个16位二进制的Unicode字符,Java用char来表示一个字符 。
public static void main(String[] myarg) { char c1 = (char) -9; // char不能识别负数,必须强制转换,否则报错。 System.out.println(c1); // 注意:即使强制转换之后,也无法识别,显示为?号。 char c2 = 'B'; char c3 = '民'; byte b1 = (byte)c2; // 必须强制转换否则报错 byte b2 = (byte)c3; // 必须强制转换否则报错 System.out.println(b1); System.out.println(b2); }
五、顺带补充八种基本数据类型的基本知识
byte 数据类型是8位、有符号的,以二进制补码表示的整数;
short 数据类型是 16 位、有符号的以二进制补码表示的整数
int 数据类型是32位、有符号的以二进制补码表示的整数;
long 数据类型是 64 位、有符号的以二进制补码表示的整数;
float 数据类型是单精度、32位、符合IEEE 754标准的浮点数;
double 数据类型是双精度、64 位、符合IEEE 754标准的浮点数;
boolean数据类型表示一位的信息;
char类型是一个单一的 16 位 Unicode 字符;