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
浙公网安备 33010602011771号