char[] a={'a','d','f','r'};
String s = new String(a,0,4);
System.out.println(s==s.intern());
String s1 = new String("hello");
System.out.println(s1==s1.intern());
输出:
true
false
用的是jdk1.8
猜测:
- s.intern()是把对象的引用加到方法区的常量池,并返回该引用,两个引用指向同一个对象。为true
- s1.intern()是把这个对象拷贝到方法区的常量池,并返回该引用,两个引用指向不同对象。s1.intern()指向常量池里的对象,s1指向堆里的对象。为false。
- 可见string的创建不同,产生的影响也不同。
注意:
- “java” 和"Java"在main函数运行前在常量池就有引用(猜测也可能是相应的对象)。
- String s2 = new String(“jav”)+new String(“a1”); 和 String s3 = new StringBuilder(“Ja”).append(“va2”).toString(); 也是true。