0 点赞 评论 收藏
分享
0 点赞 评论 收藏
分享
不知道做算法还是做p...:感觉挺简单的,19同面了三面的路过

0 点赞 评论 收藏
分享
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 点赞 评论 收藏
分享
2019-01-22 17:46
江西师范大学 安卓 0 点赞 评论 收藏
分享
创作者周榜
更多
关注他的用户也关注了: