1 怎么样的对象在编译类时就放入字符串池中?
只有 定义为 final 并且在初始化时赋值的 字符串常量,才会在编译时就放入字符串池中的。
因为变量是在调用时才能确定其值的,所以在编译时不会将变量放入常量池中的。
也就是说只有常量才会放入字符串池中的。
2 关于“ + ”
只有两个引号包含文本的对象 相“+” 才会放入字符串池中。也就是前面说过的---只有常量才会放入字符串池中的。
3 关于 String.intern
String a = "ab";
String b = "cd";
String c = "abcd";
String a2 = a.intern();
if("ab"==a2){
System.out.println("a2 放入字符串池中");
}else{
System.out.println("a2 没有放入字符串池中");
}
String a3 = "ab"+"cd";
if("abcd"==a3){
System.out.println("a3 放入字符串池中");
}else{
System.out.println("a3 没有放入字符串池中");
}
String a4 = a.intern()+b.intern();
if("abcd"==a4){
System.out.println("a4 放入字符串池中");
}else{
System.out.println("a4 没有放入字符串池中");
}
String a5 = a3.intern();
if("abcd"==a5){
System.out.println("a5 放入字符串池中");
}else{
System.out.println("a5 没有放入字符串池中");
}
输出结果:
a2 放入字符串池中
a3 放入字符串池中
a4 没有放入字符串池中
a5 放入字符串池中
jdk 给出 intern() 的解释是:
返回字符串对象的规范化表示形式。
一个初始为空的字符串池,它由类 String
私有地维护。
当调用 intern 方法时,如果池已经包含一个等于此 String
对象的字符串(用 equals(Object)
方法确 定),则返回池中的字符串。否则,将此 String
对象添加到池中,并返回此 String
对象的引用。
它遵循以下规则:对于任意两个字符串 s
和 t
,当且仅当 s.equals(t)
为 true
时,s.intern () == t.intern()
才为 true
。
问题:
当 a2 = a.intern 时,池中已经有“ab” 所以输出为放入字符串池
同理 a.intern 时返回的是“ab”;
但是 同理 哪么 String a4 = a.intern()+b.intern(); 应该就等于 ="ab"+"cd"; 等于String a3 = "ab"+"cd";
但是返回的结果却是字符串池中有a3,没有a4,哪么 a.intern()+b.intern(); 返回的应该是什么?
当 a4执行完后 执行 String a5 = a3.intern();
返回是 a5 放入字符串池中 就是说 a4 执行得到结果不是“abcd” 而是另一个对象“????”
因为字符串池中没有“????”, 所以放入字符串池中,所以 执行a5 的时候 池中是有“????”这个对象的
哪么 String a4 = a.intern()+b.intern(); 到底返回的“????” 到底是什么
问题已经解决:
虽然 a.intern()+b.intern() 返回的是“ab”+“cd” 但是他们的值是在创建对象的相加运算的时候才确定的值,也就是 说他们 是变量,是不没有放入常量池中