Java中==与equals()以及hashCode()

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zl_StepByStep/article/details/82469717

    说起==和equals()方法,心里大概明白,若是要详解,可能会有些说不清,hashCode()方法用的不是很多,要说它和equals()方法的联系,一时也说不太清,本篇详细分析一下!

*Java中==与equals的区别?

    对于八大基本数据类型(包括数组)的比较,那一定是用==,因为只有引用类型才有方法嘛!所以对于==和equals()方法的讨论仅限于引用类型。

String str1 = new String("aaa");
String str2 = "aaa";
System.out.println(str1 == str2);      //false
System.out.println(str1.equals(str2)); //true

    对于==比较的是引用数据类型的引用是否相等,也就是所指向的内存地址是否一样,根据之前总结的String及常量池的那篇,我们知道str1所指向的内存地址是在堆内存中的,str2是在字符串常量池中的,两者指向的字符串内容都是"aaa",但是地址不同。对于equals()就是比较引用地址所指向的内存地址所对应的内容是否一致,不过这里引用数据类型仅限于String,因为String类型重写了老祖宗Object的equals()方法,Object的equals()方法默认是这样的:

public boolean equals(Object obj) {
    return (this == obj);
}

可以看到,Object的equals()方法底层还是用的==,所以这个equals()方法是等着我们去重写的,补充些的话,和==又有什么区别呢?

*hashCode()方法是?

    hashCode()和equals()方法一样都是Object类的方法,一个对象调用hashCode方法会得到一个hashCode值,这个值一般就是一串数字,上个问题中说到equals方法要被重写,不然等同于使用==,不过要记住一点,当equals被覆盖时,hashCode方法也要被覆盖

    hashCode叫做散列码,也叫做哈希码,其实就是一串数字。看下面这个例子:

String s1 = "hello";
String s2 = new String("hello");
System.out.println(s1.hashCode() + "\t" + s2.hashCode());    //99162322 99162322

两者的结果是一样的,这是为什么呢?请看下面几个关于hashCode方法的知识点:

①对于字符串对象是根据字符内容得出的hashCode,因为这里s1和s2最终指向的都是"hello",字符内容相同,所以得出的哈希码相同。

如果两个对象通过equals比较是相同的,那么他们调用各自的hashCode方法得出的哈希码也是相同的。

如果两个对象的哈希码相同,他们则不一定相同,但是如果两个对象是一样的,那他们的哈希码则一定相同。

*hashCode在Set集合中的应用?

    Set集合中是不允许元素重复的,那么如何保证集合不重复呢?equals可以比较字符内容,但是当数据较多时,比如有10000和数据,当添加第10001个数据的时候,就要调用10000次equals方法来比较,这样肯定会使效率大大降低,所以就用到了hashCode()方法。

    当添加一个新元素时,首先调用这个元素的hashCode方法,然后得到一个哈希码,然后这个哈希码作为这个元素的存储地址,如果这个哈希码制定的位置上没有元素,就直接存储在这个位置上如果有元素,就用equals()方法比较,相同则不在存储,不同的话就会产生冲突,这时会产生一个链接表,将这两个元素串起来放在同一个哈希码指定的位置上而实际上会尽量避免哈希冲突。这样使用hashCode()方法会极大的提升存储效率,所以在集合查找的时候,hashCode会降低元素的比较次数,极大的提高查询效率,一般两个对象,他们的哈希码是不同的,当然之前那个字符串例子是因为字符串内容一样!

有关equals()方法和hashCode()方法的小结

①equals()方法和hashCode()方法都是Object中的方法(所有类都继承Object类);在其他类中,这两个类会一起被重写。

②Object中equals()方法比较的是两个对象的内存地址,hashCode返回这个对象的内存地址。

③常见的String等包装类,重写equals()方法来比较对象内容,重写equals来获得哈希码,如果通过equals()方法比较相等,则哈希码相同。

④一般不同的对象,哈希码是不同的。

猜你喜欢

转载自blog.csdn.net/zl_StepByStep/article/details/82469717