java基础一

java中==和equals和hashCode的区别
在JAVA中利用"=="比较变量时,系统使用变量在栈中所存的值作为比较的依据。

equals:
equals是Object类提供的方法之一,默认的 equals方法实现如下
public boolean equals(Object obj) {

return (this == obj);
}
}

总结: ==和equals意思一样,但equals只能给对象使用。

equals和hashCode()
java.lnag.Object中对hashCode的约定:
1、equals()为true,则hashCode方法必须产生相同的整数结果
2、equals()方法是不相等的,则hashCode()可能产生相同的整数结果。但如果能不同,则可能提高散列表的性能。

重写equals的原则:
重写equals()方法的类不作为集合类的key值,则可以不重写hashCode()方法
Map/Set的key为自定义对象时,则必须重写equals和hashCode。

hashcode()和equals()的作用:
 HashMap是基于散列函数,以数组和链表的方式实现的,数组的每个元素是一个链表。
 查询key-value的方式是先根据key的hashcode来定位到是哪个链表,然后在该链表中用equals()来依次进行比较。

比如
Stirng a1 = new String("a");
String a2 = new String("a");
String value = "value";
<a1, value> <a2, value>这两个对象存入到hashMap中是相等的。
但如果你不重写 String的hashcode()方法的话,结果通常是不相等的。

HashMap查找key对应的value是这样的,先求出key的hashcode()%(bucket大小) 找到是哪个链表,再使用key.equals(),若相等则认为找到。
如果不重写String的hashcode()方法, 那么a1和a2的hash值不同,在查找hash表时会出现a1对应的链表不同于a2对应的链表。

String中重写了equals()和hashcode(),所以平常我们使用它作为key值才不会出错

public final class String ... {
    public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String) anObject;
            int n = count;
            if (n == anotherString.count) {
                int i = 0;
                while (n-- != 0) {
                    if (charAt(i) != anotherString.charAt(i))
                            return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

    //s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
    public int hashCode() {
        int h = hash;
        final int len = length();
        if (h == 0 && len > 0) {
            for (int i = 0; i < len; i++) {
                h = 31 * h + charAt(i);
            }
            hash = h;
        }
        return h;
    }
}

 

posted @ 2018-04-13 12:43  牧 天  阅读(102)  评论(0)    收藏  举报