百度地图|你对 Java 中 HashCode 方法,有哪些思考?

百度地图|你对 Java 中 HashCode 方法,有哪些思考?

平时在学习Android和Java语言的时候总是碰倒equals和`==``这两个字符老感觉差不多;其实还是有一些区别的今天干脆把它们彻底弄清楚 。
一、java当中的数据类型和==的含义:

  • 基本数据类型(也称原始数据类型): byteshortcharintlongfloatdoubleboolean 。 他们之间的比较应用双等号(==)比较的是它们的值 。
  • 引用数据类型: 当它们用(==)进行比较的时候比较的是它们在内存中的存放地址(确切的说是堆内存地址) 。

对于第二种类型除非是同一个new出来的对象它们比较后的结果是true否则比较后的结果是false 。 因为每new一次都会重新开辟堆内存空间
二、equals()方法介绍:Java当中所有的类都是继承于Object这个超类的在Object类中定义了equals的方法equals源码是这样的:
public boolean equals(Object obj) {
   return (this == obj);


可以看到这个方法的初始默认行为是比较对象的内存地址值一般来说意义不大 。 所以在一些类库当中这个方法被重写了如StringIntegerDate 。 在这些类中equals有自己的实现(一般都是来比较对象的成员变量的值是否相同)而不是在比较类在堆内存中存放的地址了 。
所以说对于复合数据类型之间进行equals比较在没有复写equals方法的情况下它们之间的比较还是内存中的存放位置的地址值跟双等号(==)的结果相同;如果被复写按照复写的要求来
我们对上面的两段内容做下总结吧:
==的作用:
基本类型: 比较的就是值是否相同
引用类型: 比较的就是地址值是否相同
equals的作用:
引用类型: 默认情况下比较的是地址值 。
注: 不过我们可以根据情况自己重写该方法 。 一般重写都是自动生成 , 比较对象的成员变量值是否相同 。
三、String类的equals()方法:现在我们拿String类来举例:
我们去\\src\\java\\lang目录中找到String类 , 发现equals方法被重写如下:
public boolean equals(Object anObject) {
       if (this == anObject) {
           return true;
       
       if (anObject instanceof String) {
           String anotherString = (String)anObject;
           int n = value.length;
           if (n == anotherString.value.length) {
               char v1[
= value;
               char v2[
= anotherString.value;
               int i = 0;
               while (n-- != 0) {
                   if (v1[i
!= v2[i
)
                       return false;
                   i++;
               
               return true;
           
       
       return false;
   

上述代码可以看出 , String类中被复写的equals()方法其实是比较两个字符串的内容 。 下面我们通过实际代码来看看String类的比较 。