32.jvm内存结构部分——StringTable_intern_1.8

 

 StringTable特性有这些

1.常量池中的字符串仅是符号,第一次用到时才变为对象

2.利用串池的机制,来避免重复创建字符串对象

3.字符串变量拼接的原理是StringBuilder (1.8)

4.字符串常量拼接的原理是编译期优化

5.可以使用intern方法,主动将串池中还没有的字符串对象放入串池

前4点,我们在前面的章节也都讲述了,我们看第5点特性。

在前面29章的时候,简单提了一下intern方法是可以将堆中的字符串对象,放入串池中。我们来看看。

 我们先看这个例子:

package design.wlb.studyjava.demo.restudy.c4jvm专题.chapter02.c32StringTable_intern_jdk8;

public class Client {
	//StringTable["a","b"]
	public static void main(String[] args) {
		String s = new String("a") + new String("b"); //new StringBuilder  new String("ab")

		//堆 new String("a") new String("b") new String("ab")
		String s2 = s.intern(); //我们知道现在ab是在堆中,并不在串池,我们调用intern方法将其放入串池						StringTable["a","b","ab"]
								//将这个字符串对象尝试放入串池中,如果有则并不会放入,如果没有则放入串池,会把串池中的对象返回。

		System.out.println(s2 == "ab");	//true
		System.out.println(s == "ab");	//true
	}
}
String s = new String("a") + new String("b"); 
我们知道现在s这个"ab"是在堆中,并不在串池,我们调用intern方法将其放入串池
intern方法会将字符串对象尝试放入串池中,如果有则并不会放入,如果没有则放入串池,会把串池中的对象返回。(细品)

经过了intern方法后,我们查看s2 == "ab"是 true , s =="ab" 是true.

好,那我们变一变,一来就让ab字符串进入串池,s2 == "ab", s == "ab" 结果又是如何呢?

package design.wlb.studyjava.demo.restudy.c4jvm专题.chapter02.c32StringTable_intern_jdk8;

public class Client2 {
	//StringTable["a","b"]
	public static void main(String[] args) {
		String x = "ab";
		String s = new String("a") + new String("b"); //new StringBuilder  new String("ab")

		//堆 new String("a") new String("b") new String("ab")
		String s2 = s.intern(); //我们知道现在ab是在堆中,并不在串池,我们调用intern方法将其放入串池						StringTable["a","b","ab"]
								//将这个字符串对象尝试放入串池中,如果有则并不会放入,如果没有则放入串池,会把串池中的对象返回。

		System.out.println(s2 == "ab");	//true		[s2直接返回的是串池中的ab,故而是相等的,但s它没放进去,所以s没变]
		System.out.println(s == "ab");	//false
	}
}

 可以看到s2 == "ab" 是true , s == "ab"是 false,为什么和第一个例子不一样了呢?那是因为,当执行String x = "ab"时,jvm已经将"ab"放入串池中,而s本身是堆的对象,它执行了intern方法,但是由于串池里面有"ab"了,s放入堆的操作就被忽略了,但s2的值就直接从串池中取了。所以s2 == "ab" 为true , s == "ab" 答案为false.

好,这一篇就讲到这里。

上一篇:31.jvm内存结构部分——StringTable字符串延迟加载_tgbyhn31的博客-CSDN博客

下一篇:33.jvm内存结构部分——StringTable_intern_1.6_tgbyhn31的博客-CSDN博客


版权声明:本文为tgbyhn31原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。