一、HashMap
底层:hash表实现(数组+链表+红黑树)当桶中的数据超过8个,把结构当前链表结构变为红黑树
初始容量:16
加载因子:0.75(当16*0.75达到临界点12时进行扩容)
扩容:扩容位桶的大小
HashMap:线程不安全,效率较高,可以存储null值
Hashtable:线程安全的hash表,不能存储null值
处理HashMap线程安全问题:
可以使用Hashtable
在Collections的提高了一个方法synchronizedMap(Map<K,V> m) 返回一个线程安全的map
juc包(java.util.concurrent )下ConcurrentHashMap是一个线程安全的HashMap(推荐使用,效率高)
/*
* 自定义简单实现HashMap
*/
public class MyHashMap {
Node[] table;//位桶数组
int size; //存储数据的个数
public MyHashMap() {
table = new Node[16]; //默认初始容量为16 length为2的整数幂
}
//添加put
public void put(Object key,Object value){
int hash=myHash(key.hashCode(),table.length);
Node newNode=new Node(); //存储当前键值对的节点
newNode.hash=hash;
newNode.key=key;
newNode.Value=value;
newNode.next= null;
Node node=table[hash];//hash是刚刚根据key计算出来的桶的位置|数组的索引
//现在桶中没有节点数据,我当前节点newNode就作为第一个
if(node=