创建String字符串的方式有两种
1.String a = “123”;
2.String a = new String(“123”);
它们大有区别(字符串常量池-为了避免字符串对象过多)
第一种,JVM在创建的时候会去字符串常量池中,判断有没有已经存在的"123"该字符串,有则不创建,直接返回该字符串的引用地址。 没有的话才创建新的,并返回新的引用地址。
第二种:不管任何情况,都直接在堆内存中创建一个新的地址值对象。
@Test
public void test06(){
String a = "123";
String b ="123";
String c = new String("123");
String d = new String("123");
System.out.println("a = " + a);
System.out.println("b = " + b);
System.out.println("System.identityHashCode(a) = " + System.identityHashCode(a));
System.out.println("System.identityHashCode(b) = " + System.identityHashCode(b));
System.out.println("System.identityHashCode(c) = " + System.identityHashCode(c));
System.out.println("System.identityHashCode(d) = " + System.identityHashCode(d));
}
运行结果
a = 123
b = 123
System.identityHashCode(a) = 758529971
System.identityHashCode(b) = 758529971
System.identityHashCode(c) = 2104457164
System.identityHashCode(d) = 1521118594
直接输出,因为String重写了hashcode和equals方法输出的是值。
a,b地址值相同因为都是字符串常量池中指向同一个地址。
c,d不同因为创建都是在堆内存中新建的对象。
String a = “100” ,String b=“100” , a==b ? true or false
答案肯定是 true 但里面却大有来头。
String a = “100” 是Java中唯一的一种,不用new可以直接创建对象的方式。它会先查看JVM的常量池中是否有"100"该字符串,没有的话就创建并指向该地址值,有的话就直接把指针指向该字符串的地址值。然而 String b = new String(“100”); 该方式创建的对象,会直接在JVM的堆区中,创建一个对象。
回到题目中又有一个疑问:
a==b比较的是什么,a.equals(b)比较的是什么?
答: a==b 比较的是指针指向的地址值是否相同。而equals()是Object类下的一个方法也是比较地址值是否相同,但在String 类中对该方法进行了重写,重写后比较的是值是否相同。
测试下:
@Test
public void test08(){
String a = "100";
String b = "100";
String c = new String("100");
String d = new String("100");
System.out.println(a==b); //true ==比较地址值,相同的值对应JVM常量池中的同一个地址值
System.out.println(a==c); //false ==比较地址值,new创建新的对象
System.out.println(a==d); //false ==比较地址值,new创建新的对象
System.out.println(c==d); //false ==比较地址值,new创建的每一个对象都是新的。
System.out.println(a.equals(b)); // true equals()在String类中进行了重写,比较的是值。
System.out.println(a.equals(c)); //true equals()在String类中进行了重写,比较的是值。
System.out.println(a.equals(d)); //true equals()在String类中进行了重写,比较的是值。
}
}
结果符合预期
总结下:
ps:
System.identityHashCode(a)方法:
无论给定的x对象是否覆盖了hashCode()方法,都会调用默认的hashCode()方法返
回hashCode,如果x == null, 返回0。
这个默认的hashCode()方法就是Object类中的hashCode方法