# Java知识巩固(哈希)

Java知识巩固(哈希)


  1. hashcode()和equals()
//hashCode()源码
public int hashCode() {
    int h = hash;
    if (h == 0 && value.length > 0) {
        char val[] = value;

        for (int i = 0; i < value.length; i++) {
            h = 31 * h + val[i];
        }
        hash = h;
    }
    //返回一个hash值
    return h;
}
//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;
}

​ Java中的HashMap使用hashCode()和equals()方法来确定键值对的索引,当根据键获取的时候也会用到这两个方法
2. Java中HashMap的工作原理
HashMap类有一个叫做Entry的内部类,这个Entry类包含了key-value作为实例变量,hashmapset的时候会实例化一个Entry对象,对象会存到Entry数组table中,具体存在table中的为位置根据key的hashCode()方法计算出来的Hahs值决定
3. 什么是HashMap?

public class HashMap<K,V> extends AbstractMap<K,V>
    	implements Map<K,V>, Cloneable, Serializable {}

HashMap继承AbstractMap实现了Map、Cloneable、java.io.Searializable接口,HashMap的实现不是同步的,所以它不是线程安全的。他的key、value都可以为null,此外hashMap中的映射不是有序的

   //指定容量大小和‘加载因子’的构造函数
	public HashMap(int initialCapacity, float loadFactor) {
        if (initialCapacity < 0)
            throw new IllegalArgumentException("Illegal initial capacity: " +
                                               initialCapacity);
        if (initialCapacity > MAXIMUM_CAPACITY)
            initialCapacity = MAXIMUM_CAPACITY;
        if (loadFactor <= 0 || Float.isNaN(loadFactor))
            throw new IllegalArgumentException("Illegal load factor: " +
                                               loadFactor);
        this.loadFactor = loadFactor;
        this.threshold = tableSizeFor(initialCapacity);
    }
	//指定‘容量大小的构造函数’
    public HashMap(int initialCapacity) {
        this(initialCapacity, DEFAULT_LOAD_FACTOR);
    }
	//默认的构造函数
    public HashMap() {
        this.loadFactor = DEFAULT_LOAD_FACTOR; // all other fields defaulted
    }
	//包含子Map的构造函数
    public HashMap(Map<? extends K, ? extends V> m) {
        this.loadFactor = DEFAULT_LOAD_FACTOR;
        putMapEntries(m, false);
    }

loadFactor = DEFAULT_LOAD_FACTOR;
putMapEntries(m, false);
}


4. Objece作为HashMap的Key:Object中hashCode不能变 
发布了123 篇原创文章 · 获赞 9 · 访问量 3996

猜你喜欢

转载自blog.csdn.net/qq_37248504/article/details/103467124
今日推荐