【问题标题】:the method StringBuilder.append() , has changed the result of String.intern() [duplicate]方法 StringBuilder.append() 改变了 String.intern() [重复]
【发布时间】:2022-01-02 19:56:26
【问题描述】:
String s1 = new StringBuilder("dsada").append("dfgdfgd").toString();
String s3 = new StringBuilder("aaaa").toString();

System.out.println(s1.intern() == s1);  //true
System.out.println(s3.intern() == s3);  //false

s1 和 s3 最终调用 StringBuilder.toString, toString()方法委托一个新的String(),然后调用String.intern(),结果不一样,让我很困惑。

  @Override
public String toString() {
    // Create a copy, don't share the array
    return new String(value, 0, count);
}

【问题讨论】:

  • "aaaa" 是您代码中的字符串文字,因此它已经在实习池中。 "dsadadfgdfgd" 不是您代码中的字符串文字,因此当您调用 intern() 时它会添加到实习池中。

标签: java string stringbuilder


【解决方案1】:

来自https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/String.html#intern()

如果池中已包含一个字符串,该字符串等于由equals(Object) 方法确定的此 String 对象,则返回池中的字符串。否则,将此 String 对象添加到池中并返回对该 String 对象的引用。

"aaaa" 是代码中的字符串文字,因此它已经在实习池中。当您在值为"aaaa" 的字符串上调用intern() 时,它会返回它从池中检索到的现有字符串对象。这与s3 不是同一个对象。

"dsadadfgdfgd" 在您的代码中不是字符串文字,因此当您调用 intern() 时,它会将该字符串对象添加到池中,然后返回它,即同一个对象。

【讨论】:

  • 请注意,可以像“a”+“b”这样静态计算的字符串字面量在现代编译器上仍然会被作为“ab”来执行
  • thx,结果 s3.intern() == s3 我明白了。但是 s1.intern() == s1 我不明白。s3 是一个字符串对象
  • @concurrentScott s1.intern() 将字符串对象 s1 添加到实习池中,然后返回相同的字符串对象。
  • 哦,我读了 intern() 的注释,谢谢
猜你喜欢
  • 1970-01-01
  • 2019-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-30
  • 2020-12-18
  • 2010-10-04
  • 1970-01-01
相关资源
最近更新 更多