考虑:
String s1 = new StringBuilder(“Cattie”)。append(“& Doggie”)。toString();System.out.println(s1.intern()== s1); //为什么呢?System.out.println(s1 ==“Cattie& Doggie”); //真的……
s2.intern() 将返回引用的实例 s2 仅当String池不包含 String 在该调用之前,其值为“java”。 JDK类实习生一些 String 在执行代码之前的s。 “java”必须是其中之一。因此, s2.intern() 返回先前实例化的实例而不是 s2 。
s2.intern()
s2
String
另一方面,JDK类没有实习 String 其价值等于“Cattie& Doggie”,所以 s1.intern() 回报 s1 。
s1.intern()
s1
我不知道任何预先实习的字符串列表。这样的列表很可能被认为是一个实现细节,它可能因不同的JDK实现和JDK版本而有所不同,不应该依赖。
字符串文字(像“字符串”这样硬编码的字符串文字)已由编译器为您实现。但是,以编程方式获取的那些字符串不会,并且只有在使用.intern()方法时才会被实现。
通常你不会手动实习字符串,除非你知道你将在内存中存储大量重复的字符串,这样你就可以节省大量的内存
这在这里解释: 什么是Java String interning?
当在String对象上调用intern()方法时,它会查找池中此String对象包含的字符串,如果在那里找到该字符串,则返回池中的字符串。否则,将此String对象添加到池中,并返回对此String对象的引用。
所以 java 字符串必须已经在池中。因此它是虚假的。
java
您可以在池中打印所有字符串
如何打印整个String池?
这是一个 例 如果你正在使用,获取所有字符串 的 OpenJDK的 强> 。