关于HashMap HashSet Hashtable TreeMap的一点总结

HashMap put(key , value) 的大致过程 :

在HashMap 中 ,值是存储在 Entry<k , v> 类型 的数组table里面

而这个Entry 就是链表节点类型 , 也就是说它是利用拉链法来处理冲突的;

如果发生冲突,它会检查是否两者的key也相等,如果相等,直接替换,如果不等,那么就会插入在链表的头部

key的hashcode()方法用来找到Entry对象所在的桶。 table的索引在逻辑上叫做“桶”(bucket),它存储了链表的第一个元素。
key的equals()方法用来确保key的唯一性。 所以 , 如果自定义类型做key的话,一定要注意hashcode() 和 equals()方法的重写

Map.entrySet : 条目集合,这里存放整个map的key-value视图,通过它利用迭代器,可以遍历map;

网上看到一个问题,关于key的选择, **为什么String, Interger这样的wrapper类适合作为键?** 
String, Interger这样的wrapper类作为HashMap的键是再适合不过了,而且String最为常用。因为String是不可变的,也是final的
而且已经重写了equals()和hashCode()方法了。其他的wrapper类也有这个特点。不可变性是必要的,因为为了要计算hashCode(),就
要防止键值改变,如果键值在放入时和获取时返回不同的hashcode的话,那么就不能从HashMap中找到你想要的对象。不可变性还有其他的
优点如线程安全。如果你可以仅仅通过将某个field声明成final就能保证hashCode是不变的,那么请这么做吧。因为获取对象的时候要用
到equals()和hashCode()方法,那么键对象正确的重写这两个方法是非常重要的。如果两个不相等的对象返回不同的hashcode的话,那么
碰撞的几率就会小些,这样就能提高HashMap的性能。

## HashSet ##
- HashSet内部就是一个HashMap来替他完成所有的工作!add(E e) , 这个e就是hashmap的key ,所以不可能有重复,如果有重复,就会被替换,
- hashmap返回该值,然后hashset 拿它与null 比较,所以返回false;

## Hashtable ##
- 通过给每一个方法加锁synchronize 来达到线程安全 , 太慢 , 而且,它不支持key == null

## TreeMap ##
 - 他可以根据key和你提供的comprartor 排序
 - 内部通过二叉排序树,红黑树实现的


 

  

猜你喜欢

转载自kainever7.iteye.com/blog/2195296