如果不存在,则在字符串池中创建"abc"这个对象,然后将池中"abc"这个对象的引用地址返回给"abc"对象的引用s1,这样s1会指向池中"abc"这个字符串对象;如果存在,则不创建任何对象,直接将池中"abc"这个对象的地址返回,赋给引用s2。
示例程序2中,第一次比较为true是因为s2变量导致常量池中已经有java1了,所以调用intern方法返回的是池中字符串,而不是引用,所以s1和s2比较就是false。 所以就如intern方法注释,intern可能返回字符串也可能返回引用。 最后再补两段程序: String s1=newString("java1");System.out.println(s1.intern()==s1);Stri...
,运行时常量池(包括字符串常量池); 1.7,字符串常量池移到堆中,其他不动。1.8,用元空间(直接内存)代替永久代,即元空间是方法区的实现方式,原来方法区的东西都搬到元空间去了(除了字符串常量...String常量池是包含在动态常量池里的,但在jdk1.8后,将String常量池放到了堆中。最后用网上的一张图来解释这些内存区...