首页 > 技术文章 > String intern的理解

driveliu 2019-06-09 15:52 原文

 

String s1 = "Programming";   s1在栈内存中,Programming在常量池中。

String s2 = new String("Programming");    s2在栈内存中,new String("Programming")在堆内存中,Programming字面量在常量池中(方法区?还不太清楚是不是一回事)。

s1指向常量池,s2指向堆内存中的new对象,故s1==s2为false。

 

s3和s4和s1道理相同。

 

s5在JVM优化后同s1相同。故s1==s5为true。

 

s6相当于创建了新的对象,把s3+s4赋值给s6。

s1指向常量池,s6指向堆内存中的新创建对象,故s1==s6为false。

 

s6.intern(),首先检查s6的值是否在常量池中,如果在,则返回对常量池中的引用(此处是jdk1.7以上版本,以下的则是返回指向堆内存中的引用),如果不在则把值加入到常量池中后并返回指向常量池的引用。故s1==s6.intern()为true。

 

同理,s2.intern(),因常量池中已存在值,故返回指向常量池的引用,s2本身是指向堆内存的引用,故s2==s2.intern()为false。

推荐阅读