关注
没有亲身读过JVM源码,不过看过一些关于JVM的书,谈谈理解吧。从两个过程来看吧,编译和JVM运行时加载编译的时候,如果字符串就是常量,比如s1的时候就直接在字符串常量池放ABC,并让s1指向它,编译s2那行,发现它也是常量,就去池里找,发现没有DEF,就同样建立起来,s3也同理。到了s4,编译器发现是可以被优化的,因为没有其它对象的引用,即两个常量相加成了ABCDEF,这个串常量池里有了,所以就直接让s4也指向这个常量。到了s5.s6.s7,虽然在我们看来还是常量相加,但是编译器看来,这里涉及到的是对象引用,所以它会替换成引用符号,不做字符串常量池的查询和建立操作。JVM运行时加载的时候,常量池是最先分配完成的,也就是这时候s1.s2.s3.s4都有具体的常量池地址指向了,但是s5.s6.s7还需要解析里面的引用,这个过程中会分配新的内存地址让s5他们去指向,所以他们是完全不同的对象了。注: ==比较的应该不是引用所在的地址,而是引用的对象所在的地址,s3和s4是两个不同引用,但是都指向了同一个字符串常量池里的值。当然这里还有一个点,就是new String("ABCDEF"),你会发现还是跟s3相等,因为本质都是他们在编译器看来,没有涉及到任何引用,都是常量!都可以直接放在字符串常量池里!
查看原帖
点赞 6
相关推荐
点赞 评论 收藏
分享
点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 在大厂上班是一种什么样的体验 #
10316次浏览 129人参与
# 你认为工作的意义是什么 #
249079次浏览 1498人参与
# 程序员找工作至少要刷多少题? #
17823次浏览 244人参与
# 为了减少AI幻觉,你注入过哪些设定? #
4309次浏览 145人参与
# 我现在比当时_,你想录用我吗 #
8506次浏览 111人参与
# 机械人避雷的岗位/公司 #
43276次浏览 296人参与
# 一张图晒一下你的AI员工 #
4855次浏览 112人参与
# 论秋招对个人心气的改变 #
10471次浏览 154人参与
# 关于春招/暑期实习,你想知道哪些信息? #
7225次浏览 119人参与
# 刚入职的你踩过哪些坑 #
6587次浏览 127人参与
# AI Coding的使用心得 #
4446次浏览 99人参与
# 晒晒你司的新年福利 #
8292次浏览 104人参与
# 牛客AI体验站 #
6527次浏览 180人参与
# 12306一秒售罄,你抢到回家的票了吗? #
1863次浏览 47人参与
# 柠檬微趣工作体验 #
14762次浏览 83人参与
# 总结:哪家公司面试体验感最差 #
92930次浏览 430人参与
# 程序员能干到多少岁? #
8379次浏览 115人参与
# 你认为小厂实习有用吗? #
117974次浏览 679人参与
# 互联网公司评价 #
485466次浏览 4109人参与
# 应届生进小公司有什么影响吗 #
118211次浏览 1159人参与