interface Map<K,V>:
HashMap:HashMap采用链表+平衡二叉树的存储方式。使用HashMap存储时,会根据其hashCode的值得大小对对象数组进行取余运算。哈希表默认长度为16,下标为0~15 。当相同余数小于8时,采用链表存储,当大于8时采用平衡二叉树存储。当数据变为小于等于6时变成链表存储。从7 变为8,则7采用链表;从8变7,则7是平衡二叉树,6是链表。
public static void main(String[] args) {
HashMap<String,String> data = new HashMap<>();
data.put("k1","zxcv");
String value = data.get("k1");//通过唯一键k1取值
System.out.println(value);//输出
data.put("k2","asdf");
data.put("k3","qwer");
Set<String> set = data.keySet();//返回此映射中包含的键的Set视图。
for (String key : set){//通过keyset生成一个关于k的集合遍历打印,并输出值
System.out.println(key+"-->"+data.get(key));
}
Collection<String> values = data.values();//返回此映射中包含的值的Collection视图。
for (String v : values){//通过遍历values直接打印值
System.out.println(v);
}
}
运行结果:
相同的代码 HashTable运行结果:
ConcurrentHashMap运行结果:
三者之间的区别:
HashMap:效率高,但是线程不安全,不保障顺序
HashTable:线程安全,效率低
ConcurrentHashMap:分段锁机制,保障线程安全,效率比较高
TreeMap:有序存储
LinkedHashMap:数据存储到HashMap中的同时也会存储到链表中,存储有序,也可以快速查找