当前位置: 代码迷 >> 综合 >> HashMap、HashTable、TreeMap用法与区别分析篇
  详细解决方案

HashMap、HashTable、TreeMap用法与区别分析篇

热度:43   发布时间:2023-09-28 06:13:07.0

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 是否允许空值、空键

  1. HashMap允许空值、空键
  2. HashMap允许同时存在空值、空键
  3. HashMap不允许键重复,如果重复,新值覆盖旧值。

1.2 HashMap的遍历

  1. 通过keySet方法实现遍历,一次性把map集合中的所有键放入Set集合中再遍历,可使用增强型for循环。
Set<String> keySet=hashMap.keySet();
  1. 使用entrySet方法实现遍历,将集合中的所有键+值取出放入Set集合中,再进行遍历。
Set<Map.Entry<String,String>> entry=hashMap.entrySet();

注意:使用keySet方法遍历时先存储键值,再去循环查找值value,相当于两次循环。效率较低。

1.3 常用方法

  1. put:添加新元素
  2. 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 是否允许空值、空键

  1. 不允许空键
  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 父类方法不同

  1. HashMap继承AbstractMap方法,实现Map接口

HashMap、HashTable、TreeMap用法与区别分析篇
2. HashTable继承Dictionary方法,实现Map接口

HashMap、HashTable、TreeMap用法与区别分析篇
3. TreeMap继承AbstractMap方法,实现NavigableMap接口

HashMap、HashTable、TreeMap用法与区别分析篇

4.2 线程安全性的差异

  1. HashMap非线程安全
  2. HashTable线程安全
  3. TreeMap非线程安全

4.3 容量上的差别

4.3.1 HashMap

HashMap、HashTable、TreeMap用法与区别分析篇

HashMap、HashTable、TreeMap用法与区别分析篇

HashMap、HashTable、TreeMap用法与区别分析篇

只有在容量为2的n次方时,上述计算方式才等价于hash值对容量取余

HashMap、HashTable、TreeMap用法与区别分析篇

HashMap、HashTable、TreeMap用法与区别分析篇

4.3.2 HashTable

HashMap、HashTable、TreeMap用法与区别分析篇

默认的初始容量为11,负载因子为0.75。

HashMap、HashTable、TreeMap用法与区别分析篇

HashMap、HashTable、TreeMap用法与区别分析篇
HashMap、HashTable、TreeMap用法与区别分析篇

5. 优秀博客

  1. HashMap和Hashtable的详细比较
  2. 关于HashMap的一系列面试题的解答,这应该是最全的了
  3. HashMap和HashTable简介和区别
  4. HashMap和Hashtable有什么区别?与TreeMap有什么联系?
  5. Java 集合系列12之 TreeMap详细介绍(源码解析)和使用示例
  6. Java 8系列之重新认识HashMap
  相关解决方案