HashMap、HashTable、TreeMap学习篇
- 1. HashMap基本使用篇
-
- 1.1 是否允许空值、空键
- 1.2 HashMap的遍历
- 1.3 常用方法
- 1.4 程序示例
- 2. Hashtable基本使用篇
-
- 2.1 关于常用方法和遍历
- 2.2 是否允许空值、空键
- 2.3 测试代码
- 3. TreeMap基本使用篇
-
- 3.1 关于常用方法和遍历
- 3.2 是否允许空值、空键
- 3.3 测试代码
- 4. HashMap、HashTable、TreeMap区别
-
- 4.1 父类方法不同
- 4.2 线程安全性的差异
- 4.3 容量上的差别
-
- 4.3.1 HashMap
- 4.3.2 HashTable
- 5. 优秀博客
1. HashMap基本使用篇
1.1 是否允许空值、空键
- HashMap允许空值、空键
- HashMap允许同时存在空值、空键
- HashMap不允许键重复,如果重复,新值覆盖旧值。
1.2 HashMap的遍历
- 通过keySet方法实现遍历,一次性把map集合中的所有键放入Set集合中再遍历,可使用增强型for循环。
Set<String> keySet=hashMap.keySet();
- 使用entrySet方法实现遍历,将集合中的所有键+值取出放入Set集合中,再进行遍历。
Set<Map.Entry<String,String>> entry=hashMap.entrySet();
注意:使用keySet方法遍历时先存储键值,再去循环查找值value,相当于两次循环。效率较低。
1.3 常用方法
- put:添加新元素
- get:利用键查找值
1.4 程序示例
package Map;import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;import java.util.HashMap;
import java.util.Map;
import java.util.Set;public class TestHashMap {public static void main(String[] args) {HashMap<String,String> hashMap=new HashMap<>();hashMap.put("重庆985","重庆大学");hashMap.put("重庆211","西南大学");hashMap.put(null,"键为空");hashMap.put("值为空",null);hashMap.put(null,null);// System.out.println(hashMap.get("重庆211"));Set<String> keySet=hashMap.keySet();System.out.println("使用KeySet方法遍历HashMap");for (String keyset:keySet){System.out.println("键: "+keyset+" 值: "+hashMap.get(keyset));}System.out.println("-----------------------------");for (String k:hashMap.keySet()){System.out.println("键: "+k+" 值: "+hashMap.get(k));}System.out.println("-----------------------------");System.out.println("使用entrySet方法遍历HashMap");Set<Map.Entry<String,String>> entry=hashMap.entrySet();for(Map.Entry e:entry){System.out.println("键: "+e.getKey()+" 值: "+e.getValue());}System.out.println("-----------------------------");for(Map.Entry e:hashMap.entrySet()){System.out.println("键: "+e.getKey()+" 值: "+e.getValue());}}
}
2. Hashtable基本使用篇
2.1 关于常用方法和遍历
与HashMap类似,此处不再赘述。
2.2 是否允许空值、空键
不允许任何的空键、空值。
2.3 测试代码
package Map;import java.util.Hashtable;
import java.util.Set;
import java.util.Map;public class TestHashTable {public static void main(String[] args) {Hashtable<String,String> hashtable=new Hashtable<>();hashtable.put("重庆985","重庆大学");hashtable.put("重庆211","西南大学");//hashtable.put(null,"键为空");//hashtable.put("值为空",null);// hashtable.put(null,null);// System.out.println(hashtable.get("重庆211"));Set<String> keySet=hashtable.keySet();System.out.println("使用KeySet方法遍历HashMap");for (String keyset:keySet){System.out.println("键: "+keyset+" 值: "+hashtable.get(keyset));}System.out.println("-----------------------------");for (String k:hashtable.keySet()){System.out.println("键: "+k+" 值: "+hashtable.get(k));}System.out.println("-----------------------------");System.out.println("使用entrySet方法遍历HashMap");Set<Map.Entry<String,String>> entry=hashtable.entrySet();for(Map.Entry e:entry){System.out.println("键: "+e.getKey()+" 值: "+e.getValue());}System.out.println("-----------------------------");for(Map.Entry e:hashtable.entrySet()){System.out.println("键: "+e.getKey()+" 值: "+e.getValue());}}
}
3. TreeMap基本使用篇
3.1 关于常用方法和遍历
与HashMap类似,此处不再赘述。
3.2 是否允许空值、空键
- 不允许空键
- 允许空值
3.3 测试代码
package Map;import java.util.Set;
import java.util.TreeMap;
import java.util.Map;public class TestTreeMap {public static void main(String[] args) {TreeMap<String,String> treeMap=new TreeMap<>();treeMap.put("重庆985","重庆大学");treeMap.put("重庆211","西南大学");//treeMap.put(null,"键为空");treeMap.put("值为空",null);// treeMap.put(null,null);// System.out.println(treeMap.get("重庆211"));Set<String> keySet=treeMap.keySet();System.out.println("使用KeySet方法遍历HashMap");for (String keyset:keySet){System.out.println("键: "+keyset+" 值: "+treeMap.get(keyset));}System.out.println("-----------------------------");for (String k:treeMap.keySet()){System.out.println("键: "+k+" 值: "+treeMap.get(k));}System.out.println("-----------------------------");System.out.println("使用entrySet方法遍历HashMap");Set<Map.Entry<String,String>> entry=treeMap.entrySet();for(Map.Entry e:entry){System.out.println("键: "+e.getKey()+" 值: "+e.getValue());}System.out.println("-----------------------------");for(Map.Entry e:treeMap.entrySet()){System.out.println("键: "+e.getKey()+" 值: "+e.getValue());}}
}
4. HashMap、HashTable、TreeMap区别
4.1 父类方法不同
- HashMap继承AbstractMap方法,实现Map接口
2. HashTable继承Dictionary方法,实现Map接口
3. TreeMap继承AbstractMap方法,实现NavigableMap接口
4.2 线程安全性的差异
- HashMap非线程安全
- HashTable线程安全
- TreeMap非线程安全
4.3 容量上的差别
4.3.1 HashMap
只有在容量为2的n次方时,上述计算方式才等价于hash值对容量取余
4.3.2 HashTable
默认的初始容量为11,负载因子为0.75。
5. 优秀博客
- HashMap和Hashtable的详细比较
- 关于HashMap的一系列面试题的解答,这应该是最全的了
- HashMap和HashTable简介和区别
- HashMap和Hashtable有什么区别?与TreeMap有什么联系?
- Java 集合系列12之 TreeMap详细介绍(源码解析)和使用示例
- Java 8系列之重新认识HashMap