Coder小北 level
获赞
252
粉丝
9
关注
18
看过 TA
16
江西师范大学
2019
安卓
IP属地:广东
专注于计算机编程技术分享。
私信
关注
2019-08-12 08:46
江西师范大学 安卓
0 点赞 评论 收藏
分享
2019-08-11 08:02
江西师范大学 安卓
0 点赞 评论 收藏
分享
2019-08-10 10:05
江西师范大学 安卓
0 点赞 评论 收藏
分享
2019-08-09 06:50
江西师范大学 安卓
0 点赞 评论 收藏
分享
2019-08-08 12:36
江西师范大学 安卓
0 点赞 评论 收藏
分享
2019-08-07 12:34
江西师范大学 安卓
0 点赞 评论 收藏
分享
2019-08-06 11:41
江西师范大学 安卓
0 点赞 评论 收藏
分享
2019-08-05 23:55
江西师范大学 安卓
0 点赞 评论 收藏
分享
2019-08-03 21:12
江西师范大学 安卓
0 点赞 评论 收藏
分享
2019-05-20 18:39
已编辑
江西师范大学 安卓
单身一时爽,一直单身一直爽🙄🙄🙄
我家的狗不咬人:材质不错,手感应该也不错
0 点赞 评论 收藏
分享
2019-03-06 08:06
已编辑
江西师范大学 安卓
SFISH:没有亲身读过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相等,因为本质都是他们在编译器看来,没有涉及到任何引用,都是常量!都可以直接放在字符串常量池里!
0 点赞 评论 收藏
分享

创作者周榜

更多
关注他的用户也关注了:
牛客网
牛客网在线编程
牛客网题解
牛客企业服务