Java知识巩固(哈希)
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不能变