“==”和equals小结

在java中,"=="和"equals()"区别是什么?

恐怕大多数人都会回答,第一个是用来比较地址,第二个是用来比较内容的吧。这个回答并不准确

例如


输出的结果为false,而用String输出的却是true


这是为什么呢? 查看object的qeuals方法发现


Object的equals方法就是使用"=="来比较对象和传入的参数的。

而String类中equals方法是比较的内容


再看StringBuilder类,其源码无equals方法,即继承使用object类的equals方法,用“==”来比较参数,这也是为什么会输出false的原因。

另外,两个对象用equals方法比较结果为true,他们的hashcode值相同么?

    不一定相同。正常情况下,因为equals()方法比较的就是对象在内存中的值,如果值相同,那么Hashcode值也应该相同。但是如果不重写hashcode方法,就会出现不相等的情况。

参考JDK中的一段话:

     hashCode 
        public int hashCode()返回该对象的哈希码值。支持此方法是为了提高哈希表(例如 Java.util.Hashtable 提供的哈希表)的性能。
        hashCode 的常规协定是: 
        在 Java 应用程序执行期间,在对同一对象多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是将对象进行 equals 比较时所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。 
        如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用 hashCode 方法都必须生成相同的整数结果。 
        如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么对这两个对象中的任一对象上调用 hashCode 方法不 要求一定生成不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同整数结果可以提高哈希表的性能。 

        实际上,由 Object 类定义的 hashCode 方法确实会针对不同的对象返回不同的整数。(这一般是通过将该对象的内部地址转换成一个整数来实现的,但是 JavaTM 编程语言不需要这种实现技巧。)

即:重写equals方法时请必须重写hashcode,以保证equals方法相等时两个对象hashcode返回相同的值。如果你不按照规范来,就不一定相同了。


猜你喜欢

转载自blog.csdn.net/qq_36744695/article/details/81016598