JVM-常量池
概要:
1.Java 基本类型的包装类的大部分都实现了常量池技术,即 Byte、Short、Integer、Long、Character、Boolean;
2.且数值 [-128,127] 的相应类型的缓存数据,但是超出此范围仍然会去创建新的对象。
3.两种浮点数类型的包装类 Float、Double 并没有实现常量池技术。
实例:
Integer i = 1; double d2 = 1.0; /** * 有小数点的时候必须加上f后缀 * 编译器可以自动向上转型,如int 转成 long 系统自动转换没有问题,因为后者精度更高 * byte--short--char--int--long--float--double,由左到右等级升高,double为最高级; * double 转成 float 就不能自动做了,所以后面的加上个 f;也就是说必须写成float f=(float)3.4 或float f = 3.4f */ float f2 = 1.0f; Double d3 = 1.0; /** * true * 常量池技术 */ System.out.println(i == d2); System.out.println(i == f2); /** * false */ System.out.println(i.equals(d3)); Integer i1 = 33; Integer i2 = 33; /** * 输出true */ System.out.println(i1 == i2); Integer i11 = 128; Integer i22 = 128; /** * 输出false * 范围是-128到127 */ System.out.println(i11 == i22); Double i3 = 1.2; Double i4 = 1.2; /** * 输出false */ System.out.println(i3 == i4); String a = "11"; String b = "11"; /** * 输出true * 因为只在常量池创建了对象 * 对于字符串:其对象的引用都是存储在栈中的, * 如果是编译期已经创建好(直接用双引号定义的)的就存储在常量池中, * 如果是运行期(new出来的)才能确定的就存储在堆中。对于equals相等的字符串, * 在常量池中永远只有一份,在堆中可能有多份。 */ System.out.println(a == b); String c = new String("129222"); String d = new String("129222"); /** * 输出false */ System.out.println(c == d);