为什么 String.toLowerCase() 返回的字符串没有被保留?
Why the String returned by String.toLowerCase() is not interned?
我被要求预测这段代码的输出:
String party1 = "party";
String party2= "PARTY".toLowerCase();
if(party1==party2){
System.out.println("EQUAL");
}else{
System.out.println("NOT EQUAL");
}
我认为 toLowerCase()
的结果会自动被保留,因此对 party1
的相同引用将被 returned,但我错了,因为代码输出 "NOT EQUAL".
toLowerCase()
(toUpperCase()
以及)return 是新的 String
吗?
Edit :我没有使用 == 来比较字符串,我只是想了解 toLowerCase() 方法的行为
据我所知,对字符串的任何操作都会复制字符串,因此切勿使用“==”,而是使用 .equals()
String party1 = "party";
String party2= "PARTY".toLowerCase();
System.out.println(party1);
System.out.println(party2);
if(party1.equals(party2)){
System.out.println("EQUAL");
}else{
System.out.println("NOT EQUAL");
}
结果相等
答案在String.toLowerCase()
方法本身..因为你可以通过你自己的toLowerCase()
方法检查returns一个新的小写字符串(一个新的String对象)和==
检查对象引用和 returns 如果它们相同则为 true,这在你的情况下是不同的。这就是它返回 false 的原因。希望你明白了。
public String toLowerCase(Locale locale) {
if (locale == null) {
throw new NullPointerException();
}
........
............
return new String(result, 0, len + resultOffset);
}
如果任何 String 操作的结果被内部化,池将以极度且不必要的速度增长。 Spring 上的任何中间操作都会在池中产生一个新元素。对于非常特定领域内的极少数情况,这将是有益的。因此,这不是默认策略,这就是 intern()
存在的原因。
String party1 = "party";
String party2 = "PARTY".toLowerCase().intern();
System.out.println(party1 == party2 ? "EQUAL" : "NOT EQUAL");
toLowerCase()
没有什么特别之处:任何 String
方法都会 return 一个新的 String
,因为 String
是不可变的。
字符串是 immutable.Generally 每当我们尝试修改字符串时,都会在常量文字池中创建一个新的字符串文字,并且对它的新引用是 returned.Although "party" 和 "PARTY".toLowerCase() 具有相同的值,即 party 但在常量池中,它们引用两个不同的文字并具有两个不同的引用。通过使用 ==
运算符,您正在比较引用而不是 values.Since 他们有不同的引用它打印 NOT Equal
。尝试使用 party1.equals(party2)
它将打印 EQUAL
因为它比较内容而不是参考。
我被要求预测这段代码的输出:
String party1 = "party";
String party2= "PARTY".toLowerCase();
if(party1==party2){
System.out.println("EQUAL");
}else{
System.out.println("NOT EQUAL");
}
我认为 toLowerCase()
的结果会自动被保留,因此对 party1
的相同引用将被 returned,但我错了,因为代码输出 "NOT EQUAL".
toLowerCase()
(toUpperCase()
以及)return 是新的 String
吗?
Edit :我没有使用 == 来比较字符串,我只是想了解 toLowerCase() 方法的行为
据我所知,对字符串的任何操作都会复制字符串,因此切勿使用“==”,而是使用 .equals()
String party1 = "party";
String party2= "PARTY".toLowerCase();
System.out.println(party1);
System.out.println(party2);
if(party1.equals(party2)){
System.out.println("EQUAL");
}else{
System.out.println("NOT EQUAL");
}
结果相等
答案在String.toLowerCase()
方法本身..因为你可以通过你自己的toLowerCase()
方法检查returns一个新的小写字符串(一个新的String对象)和==
检查对象引用和 returns 如果它们相同则为 true,这在你的情况下是不同的。这就是它返回 false 的原因。希望你明白了。
public String toLowerCase(Locale locale) {
if (locale == null) {
throw new NullPointerException();
}
........
............
return new String(result, 0, len + resultOffset);
}
如果任何 String 操作的结果被内部化,池将以极度且不必要的速度增长。 Spring 上的任何中间操作都会在池中产生一个新元素。对于非常特定领域内的极少数情况,这将是有益的。因此,这不是默认策略,这就是 intern()
存在的原因。
String party1 = "party";
String party2 = "PARTY".toLowerCase().intern();
System.out.println(party1 == party2 ? "EQUAL" : "NOT EQUAL");
toLowerCase()
没有什么特别之处:任何 String
方法都会 return 一个新的 String
,因为 String
是不可变的。
字符串是 immutable.Generally 每当我们尝试修改字符串时,都会在常量文字池中创建一个新的字符串文字,并且对它的新引用是 returned.Although "party" 和 "PARTY".toLowerCase() 具有相同的值,即 party 但在常量池中,它们引用两个不同的文字并具有两个不同的引用。通过使用 ==
运算符,您正在比较引用而不是 values.Since 他们有不同的引用它打印 NOT Equal
。尝试使用 party1.equals(party2)
它将打印 EQUAL
因为它比较内容而不是参考。