hashCode,equals都是属于Object类里面的方法,hashCode是根据内存地址通过算法计算出来的散列码,equals是比较对象的内存地址是否相同。equals相等的对象,其hashCode一定相等,hashCode相等的对象,equals不一定相等。hashCode和equals会应用于HashSet,HashMap,HashTable这一类的散列集合,所以一般自定义实现equals的时候也要重新实现hashCode方法。实现equals时候需要注意通用约定,自反性(a.equals(a) == true),对称性(a.equals(b) == true; b.equals(a) == true),传递性(a.equals(b) == true; b.equals(c) == true; a.equals(c) == true),一致性(参与比较的对象引用没有发生变化,其结果也不会变),非空性(a.equals(null) == false)
HashMap
内部通过数组和链表实现,保存一个新的对象,先根据hashCode计算出hash,再通过hash计算出对应于存放数组的下标,如果当前位置已经有对象,则通过链表的形式,进行链接,然后将原来的值替换成插入的值。
HashMap&HashTable
HashMap不是线程安全的,HashTable是线程安全的,HashMap允许key,value都为null,HashTable则都不允许。
ConcurrentHashMap&HashTable
同样适用于多线程的环境,但是当容量增加到一定程度的时候,HashTable的性能会下降很多,应该迭代器遍历的时候,会锁住整个表,而ConcurrentHashMap仅仅锁住部分map