从jdk1.5开始,提供了5种基本类型包装类和String类的对象池,主要为了提升效率,避免频繁的创建、销毁对象。
String s1 = "abc";
String s2 = "abc";
String s3 = new String("abc");
System.out.println(s1 == s2);//true
System.out.println(s1 == s3);//false
jvm在运行到字符串字面量时,会从String对象池中查找是否有字符序列相同的对象,如果有,取现成的对象,如果没有,在String对象池中创建一个对象,并返回。使用new String()都是创建一个新对象。
Byte、Short、Integer、Long、Character均以静态内部类的方式实现-128到127之间的对象缓存,Boolean以static final修饰符实现,Float、Double未实现对象池。
Integer a1 = 1;
Integer a2 = 1;
Integer a3 = Integer.valueOf(1);
Integer a4 = Integer.valueOf(1);
Integer a5 = new Integer(1);
System.out.println(a1 == a2);//true
System.out.println(a1 == a3);//true
System.out.println(a1 == a4);//true
System.out.println(a3 == a4);//true
System.out.println(a1 == a5);//false
Integer b1 = 128;
Integer b2 = 128;
Integer b3 = Integer.valueOf(128);
Integer b4 = Integer.valueOf(128);
Integer b5 = new Integer(128);
System.out.println(b1 == b2);//false
System.out.println(b1 == b3);//false
System.out.println(b1 == b4);//false
System.out.println(b3 == b4);//false
System.out.println(b1 == b5);//false
网友评论