爱笑的果子狸 2023-05-06 00:51 采纳率: 100%
浏览 13
已结题

Java String的intern以及StringBuilder


package string_;

public class String02 {
    public static void main(String[] args) {
        String str00 = new StringBuilder().append("purple").toString();
        String str01 = new StringBuilder("zxcvasdf").toString();
        String str02 = str00.intern();
        String str03 = str01.intern();
        String str04 = new StringBuilder().append("pi").append("nk").toString();
        String str05 = str04.intern();
        System.out.println(str00 == str02);//false
        System.out.println(str01 == str03);//false
        System.out.println(str04 == str05);//true
    }
}

输出结果

img

上述代码中为何一个append和两个append结果不一样呢?

  • 写回答

2条回答 默认 最新

  • pzzhao 2023-05-06 08:20
    关注

    个人理解:
    一个append的情况,因为你代码里直接声明了这个字符串,所以都会直接在常量池中创建对应的字符串,而后面stringbuild tostring则是在堆上创建了对象,所以你的str00是堆上的对象,而str00, intern之后返回的是常量池中的字符串对象,所以二者不是同一个对象。

    两个append的情况,没有直接在池中生成完整的字符串对象,str04是堆上的对象,调用intern的时候,因为池中没有,返回的是str04。

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 5月15日
  • 已采纳回答 5月7日
  • 创建了问题 5月6日

悬赏问题

  • ¥15 c++ gmssl sm2验签demo
  • ¥15 关于模的完全剩余系(关键词-数学方法)
  • ¥15 有没有人懂这个博图程序怎么写,还要跟SFB连接,真的不会,求帮助
  • ¥15 关于移动机器人坐标计算
  • ¥30 模拟电路 logisim
  • ¥15 PVE8.2.7无法成功使用a5000的vGPU,什么原因
  • ¥15 is not in the mmseg::model registry。报错,模型注册表找不到自定义模块。
  • ¥15 安装quartus II18.1时弹出此error,怎么解决?
  • ¥15 keil官网下载psn序列号在哪
  • ¥15 想用adb命令做一个通话软件,播放录音