先看下面一共输出几个true?
package com.example.demo.concurrent;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class StringDemo {
public static void main(String[] args) {
String s1 = "11";
String s2 = new String("1")+new String("1");
s2.intern();
System.out.println(s1 == s2 );
System.out.println(s2.intern() == s1);
String s3 = "3";
String s4 = new String("3");
System.out.println(s3 == s4.intern());
//s6在堆内存中与常量池中地址不一致
String s5 = "55";
String s6 = new String("5")+new String("5");
s6.intern();
System.out.println(s5 == s6);
//s7在堆内存中,调用s7.intern()时,因为常量池不存在字符串,所以复制一份到常量池中,常量池中引用对内存
String s7 = new String("7") + new String("7");
s7.intern();
String s8 = "77";
System.out.println(s7 == s8);
//s9在堆内存中,s10在常量池中
String s9 = new String("9") + new String("9");
String s10 = "99";
s9.intern();
System.out.println(s9 == s10);
}
}
输出是:
false
true
true
false
true
true
通过new String("1")出来的对象放在堆中,不在常量池中。只有在常量池中的字符串才会地址相等。
调用s.intern()方法时,如果常量池不存在该字符串,将字符串放入常量池中,并且指向堆内存地址。当常量池存在时,直接返回常量池地址。