天天看点

equal&==&hashcode

== 和 equals 的区别

Object类中的equals方法和“==”是一样的,没有区别,而String类,Integer类等等一些类,是重写了equals方法,才使得equals和“==不同”,所以,当自己创建类时,自动继承了Object的equals方法,要想实现不同的等于比较,必须重写equals方法。

“==”比”equal”运行速度快,因为”==”只是比较引用. 

hashcode 和 equals 的具体实现方式  

默认 equals 方法直接调用了 ==

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

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;      }

hashCode是根类Obeject中的方法。默认情况下,Object中的hashCode() 返回对象的32位jvm内存地址。也就是说如果对象不重写该方法,则返回相应对象的32为JVM内存地址。

String类源码中重写的hashCode方法如下:

public int hashCode() {     int h = hash;    //Default to 0 ### String类中的私有变量,     if (h == 0 && value.length > 0) {    //private final char value[]; ### Sting类中保存的字符串内容的的数组         char val[] = value;         for (int i = 0; i < value.length; i++) {             h = 31 * h + val[i];         }         hash = h;     }     return h;

总结:

(1)绑定。当equals方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。

(2)绑定原因。Hashtable实现一个哈希表,为了成功地在哈希表中存储和检索对象,用作键的对象必须实现 hashCode 方法和 equals 方法。同(1),必须保证equals相等的对象,hashCode 也相等。因为哈希表通过hashCode检索对象。

(3)默认。==默认比较对象在JVM中的地址。hashCode 默认返回对象在JVM中的存储地址。equal比较对象,默认也是比较对象在JVM中的地址,同==

上一篇: AngularJS 包含
下一篇: java的NIO和AIO