为什么 String.intern() 方法 return 有两个不同的结果?
Why does the String.intern() method return two different results?
我有这样的代码:
String str1 = new StringBuilder("计算机").append("软件").toString();
System.out.println(str1.intern() == str1); //true
String str2 = new StringBuilder("ja").append("va").toString();
System.out.println(str2.intern() == str2); //false
String str3 = new StringBuilder("Str").append("ing").toString();
System.out.println(str3.intern() == str3); //true
我能理解为什么str1.intern() == str1
和str3.intern() == str3
是对的,但我不明白str2.intern() == str2
。
为什么这是错误的?
我的java版本是:1.8.0_73
String.intern() returns 字符串文字池中的一个字符串。但是,如果字符串已存在于池中,它将 return 现有字符串。
如果您选择一个新字符串,它应该 return 您创建的字符串,但如果您使用恰好已经存在于池中的字符串,您将获得现有字符串。
假设在这种情况下 "java"
已经存在于池中是合理的,所以当您调用 intern() 时它 return 是一个不同的对象,因此 ==
是错误的。
注意:string.intern().equals(string)
应始终为真。
常量String
"java"
已经存在于Java常量池中,但是你可以通过更改
来验证
String str2 = new StringBuilder("ja").append("va").toString();
System.out.println(str2.intern()==str2);
到
String str2 = new StringBuilder("ja").append("va").toString();
System.out.println(str2.intern() == "java");
这将得到相同的常量和输出
true
或者,你可以将"计算机软件"
和"String"
添加到常量池中,如
String a = "计算机软件";
String b = "String";
String str1 = new StringBuilder("计算机").append("软件").toString();
System.out.println(str1.intern() == str1);
String str3 = new StringBuilder("Str").append("ing").toString();
System.out.println(str3.intern() == str3);
然后你会得到(与你的观察一致)
false
false
我有这样的代码:
String str1 = new StringBuilder("计算机").append("软件").toString();
System.out.println(str1.intern() == str1); //true
String str2 = new StringBuilder("ja").append("va").toString();
System.out.println(str2.intern() == str2); //false
String str3 = new StringBuilder("Str").append("ing").toString();
System.out.println(str3.intern() == str3); //true
我能理解为什么str1.intern() == str1
和str3.intern() == str3
是对的,但我不明白str2.intern() == str2
。
为什么这是错误的?
我的java版本是:1.8.0_73
String.intern() returns 字符串文字池中的一个字符串。但是,如果字符串已存在于池中,它将 return 现有字符串。
如果您选择一个新字符串,它应该 return 您创建的字符串,但如果您使用恰好已经存在于池中的字符串,您将获得现有字符串。
假设在这种情况下 "java"
已经存在于池中是合理的,所以当您调用 intern() 时它 return 是一个不同的对象,因此 ==
是错误的。
注意:string.intern().equals(string)
应始终为真。
常量String
"java"
已经存在于Java常量池中,但是你可以通过更改
String str2 = new StringBuilder("ja").append("va").toString();
System.out.println(str2.intern()==str2);
到
String str2 = new StringBuilder("ja").append("va").toString();
System.out.println(str2.intern() == "java");
这将得到相同的常量和输出
true
或者,你可以将"计算机软件"
和"String"
添加到常量池中,如
String a = "计算机软件";
String b = "String";
String str1 = new StringBuilder("计算机").append("软件").toString();
System.out.println(str1.intern() == str1);
String str3 = new StringBuilder("Str").append("ing").toString();
System.out.println(str3.intern() == str3);
然后你会得到(与你的观察一致)
false
false