JVM的字符串常量池问题

下面这段代码,结果不同是因为java已经存在字符串常量池中。

String str1 = new StringBuilder("hel").append("lo").toString();
System.out.println( str1.intern() == str1); // true
String str2 = new StringBuilder("ja").append("va").toString();
System.out.println(str2.intern() == str2); // false

我有以下疑问:

    1.String str1 = new StringBuilder("hel").append("lo").toString();创建了几个对象
    2.str1指向的是常量池中的对象吗?str1.intern()为什么等于str1?
阅读 2.3k
2 个回答
  1. 语句层面生成了一个String对象,JVM层面会因为这条语句涉及了两个字面量会额外生成两个对象,这两个对象算不算这个语句生成的看你自己怎么理解了
  2. 常量池本质也是个索引,str1.intern()让常量池中hello对应的索引指向了str1对应的对象(在该语句之前,常量池没有"hello"对应的对象),所以两者的地址是相同的,至于为什么str2那里不等于,是因为java虚拟机中涉及到了"java"这个字面量,所以常量池中已经保存了,str2.intern()返回的是常量池中的地址而不是str2所指向的后生成的对象,所以不相等

楼上其实说得很好了,我在补充下,“hello”不存在常量池中,所以str1.intern() 是先把str1的堆内存地址放入了常量池,并返回了堆地址,所以是相等的

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题