String::intern()是一个本地方法,它的作用是如果字符串常量池中已经包含了一个等于String对象的字符串,则返回代表池中这个字符串的String对象的引用;否则,会将此String对象包含的字符串添加到常量池中,并且返回此String对象的引用。

String str1 = "a";
String str2 = "b";
String str3 = "ab";
String str4 = str1 + str2;
String str5 = new String("ab");
 
System.out.println(str5.equals(str3));
System.out.println(str5 == str3);
System.out.println(str5.intern() == str3);
System.out.println(str5.intern() == str4);

结果:

true
false
true
false

分析:

1,str5.equals(str3)比较的是字符串值的内容。

2,str5 == str3比较地址是否相同,由于str5采用new String方式定义的,所以地址引用一定不相等。

3,str5.intern() == str3 当str5调用intern的时候,会检查字符串池中是否含有该字符串。由于之前定义的str3已经进入字符串池中,所以会得到相同得到相同的引用。

4,str5.intern() == str4,当str4=str1+str2后,str4的值也是"ab"。采用new创建的字符串对象不进入字符串池,并且字符串相加的时候,都是静态字符串的结果会添加到字符串池,如果其中含有变量则不会进入字符串池中。但是字符串一旦进入字符串池,就会先查找池中有无此对象。如果有此对象,则让对象引用指向此对象。如果没有此对象,则先创建此对象,再让对象引用指向此对象。

"java"字符串是默认在字符串常量池中的。

 posted on 2020-12-19 12:03  会飞的金鱼  阅读(767)  评论(0)    收藏  举报