equals与 == 的区别
初学Java的人(me),有很长一段时间对equals()这个方法感到很懊恼,实在是弄不明白到底何时比较的是地址,又什么时候比较内容呢?因为要找工作,要面试。本人通过查阅很多前辈的博客,也记载了很多笔记,死记硬背的去记住在Object下比较的是地址,在String类下比较的是值。但是,碰到了StringBuffer,就又不知道比较的是什么了?所以,痛定思痛,查看源代码,揭开迷雾。
1. 首先,我们要知道equals()方法是定义在Object类下的方法,但是java所有的类都间接或直接的继承自Object类。所以,根据java的继承原理,所有的类都有equals()这个方法。那么,我们作为开发人员甚至是JDK的编写人员是否重写了equals()这个方法,对我们来说尤为重要。
让我们来看看Object类下的equals()方法吧。
我们通过Outline看到了Object类中的所有方法,点击进入equals()这个方法,看看源代码。
所以,结果一目了然。
2.看看String类的equals()方法
有一个instanceof 运算符,进行类型检查(是否属于String这个类,或者是否是String类的派生类),如果不是,则退出if语句,return false。否则,将传入的Object转换为String类型,然后采用一个char数组,通过while循环挨个比较每个字符是否一致,若一致,返回true。否则返回false。
3.看看包装类,例如Integer
但是,基本类型包装类还有一点需要大家注意的,就是缓存机制,
如果传入的值是(-128,127)直接的数字,不论是传入int还是Integer在JDK5之后都会自动包装。所以,都会缓存到IntegerCache.cache中,并返回同一个对象。