一、HashMap
实现了Map接口,并且允许null values和null keys,并不能保证map的顺序会不变,因为如果这个map rebuild以后就会发生变化。
判断key是否存在
因为HashMap中key和value都可以为null,所以不能通过get()为null来断定key不存在,也可能是key本身为null。应该用containsKey()来判断
快速访问
对于get和put都是常数时间,迭代的时间和实例的容量(桶数量)以及大小(映射对的数量)成正比。
一个HashMap实例有initial capacity(初始容量)和load factor(加载因子)会影响性能。
capacity: 哈希表中桶的数量,默认是16
*load factor:*允许一个hash table可以被允许有多少被占用。目的使降低hash冲突的
如果entries超过了load factor *capacity 就需要rehash 哈希表,capacity就会扩大到原来的两倍。
0.75的load factor时间和空间消耗都比较少,load factor大,会增加空间存储,但是也会增加查找的时间
线程不安全:
如果多线程并发访问hash map,并且至少有一个线程结构上修改了map,必须要在hash map外部进行同步操作。(结构上:是指增加或者删除了mappings,仅仅是改变了value并不算结构上的改变)
那么外部实现同步操作通常是在封装了这个map的对象里完成。如