PDF 课件和源代码下载地址:
https://gitee.com/geektime-geekbang/LetsJava
作者回复: 这是Java虚拟机对字符串的优化,具体的行为可能是因不同的jdk版本而不同。
作者回复: 从道理上讲,如果一个class直接继承Object,然后又没有任何属性,那这个类除了类名之外,其实就是Object类嘛。所以不能生成有意义的hashcode和equals也是合理的。因为是在没有逻辑可以做。
作者回复: 👍 👍,你完全get了 https://xie.infoq.cn/article/38f5ad03242b79b46e30bfa1b
作者回复: 这个也看JDK具体的实现和优化。因为String太常用了,JVM是有缓存优化的。String的intern方法,可以将一个String加入缓存,完全相同的String,JVM会直接从缓存里返回,不会创建新的实例,即使是new String。 这里讲解equals和==的区别,用String是略有不妥的,原因就是上面这些复杂的原因。但是String是对象,但是其内容又简单可读,所以用String举例子比较简单直观。
作者回复: ✅✅
作者回复: hashcode只是对比了特征值,就好像人的名字一样。
作者回复: 其实不是jdk优化了==,而是jdk尽力优化了String对象的创建,减少重复创建相同的对象。Integer这些也是一样的
作者回复: 源代码来一套看看? 字符串 == 比较确实是和JDK具体的实现先相关的,出于学习的目的可以这么深究一下,但是真正写代码的时候,不要依赖于== 返回true或者false,可以认为 == 的结果是薛定谔的tomcat