public static void main(String[] args) throws Exception {
String a = "a";
String param = "b" + a;
System.out.println(param.intern() == "ba");
System.out.println(param == "ba");
}
输出为 :
true
true
public static void main(String[] args) throws Exception {
String a = "a";
String param = "b" + a;
System.out.println("ba" == param.intern());
System.out.println(param == "ba");
}
却是输出为:
true
false
我想知道为啥俩次输出的结果不一样,仅是调换了 == 俩边参数的位置,==前后有啥特殊的特性嘛?
String a = "a";
String param = "b" + a;
// System.out.println(param.intern() == "ba"); //param.intern放在前面,此时常量池还没有 "ba",
// 因此将自身放入了常量池,后面的"ba"也就指向了自身,比较也就是true了
System.out.println("ba" == param.intern()); //放在 == 后面时,此时"ba"已经存在了,因此param.intern()并不会将自身放在常量池中,
// 只是返回值是常量池中的对象。所以自身已用和常量池中的不再是同一个对象
System.out.println(param == "ba");
intern()方法的本意是:【当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(用 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并返回此 String 对象的引用。】
intern在前会先一步添加到常量池中 在后 是后一步加入常量池
顶,我也很好奇。 先执行 System.out.println(param == "ba"); 比较param变量和“ba”的值和地址值是否相等; 我们都知道他们是不相等的。那么是param.intern()这个方法对变量做了什么引起的吧
@Test
public void printEqual(){
String a = "a";
String param = "b" + a;
System.out.println(param == "ba");
System.out.println(param.intern() == "ba");
}
@Test
public void printEqual2(){
String a = "a";
String param = "b" + a;
System.out.println(param == "ba");
System.out.println("ba" == param.intern());
}
```java
```
public static void main(String[] args) throws Exception {
String a = "a";
String param = "b" + a;
System.out.println(param.intern() == "ba");
System.out.println(param == "ba");
}
这一段,param.intern()执行时,串池中没有“ba”,于是param的值被放进了串池中,这样 == 后面的“ba” 是从串池中拿来的。也就是说“ba”跟param所指向的串是同一个,param与param.intern()所指向的串也是同一个。
public static void main(String[] args) throws Exception {
String a = "a";
String param = "b" + a;
System.out.println("ba" == param.intern());
System.out.println(param == "ba");
}
这一段param.intern()执行时,==左边的“ba”已经放进了串池中,param.intern执行拿回的是开始的这个“ba”,也就是在串池中equal("ba")的这个“ba”,而param 所构造的“ba” 并没有被放入串池中,也就是说param与param.intern()指向的是不同的两个“ba”。