HashMap、Hashtable、LinkedHashMap、和TreeMap介绍和区别

本文详细介绍了 Java 中 Map 接口的不同实现类,包括 HashMap、Hashtable、LinkedHashMap 和 TreeMap 的特点及适用场景。探讨了它们之间的性能差异、线程安全性、排序方式等关键特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

映射表(map)用来存放键/值对,如果提供了键,就能够找到对应的值。一个映射不能包含重复的键;每个键最多只能映射一个值,因为如果key相同,新的value将取代旧的

 java类库为映射定义了一个接口java.util.Map,它有四个实现类,分别是HashMap Hashtable LinkedHashMap 和TreeMap

  •  1.hashmap中元素的排列顺序是随机的

   TreeMap按键值排序,默认是按升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。散列或比较函数只能作用于键,与键关联的值不能进行散列或  比较

   LinkedHashMap按照插入元素项的顺序排序

   注:方法: LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder): 构建一个拥有特定容量、加载因子和访问顺序排序的空的链接哈希映像

 如果将accessOrder设置为true,链接散列映像将用访问顺序,而不是插入顺序,对映射表条目进行迭代。每次调用get或者put方法时,受影响的条目将从当前位置上删除,然后放到链表的尾处。(只有条目在链表中的位置受到影响,而散列表元不受影响,一个表元总位于与键散列码对应的哈希表元中)。访问顺序对于实现高速缓存的“最近最少使用”原则十分重要。

  • 2.hashmap、hashtable性能好些,是基于hash;treemap是基于红黑树(一种自平衡二叉查找树)实现的,性能较差。

   在Map 中插入、删除和定位元素,HashMap 是最好的选择。

   如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。

   如果需要输出的顺序和输入的相同,那么用LinkedHashMap可以实现,它还可以按读取顺序来排列,像连接池中可以应用。

  • 3.HashTable的方法是同步的,即任一时刻只有一个线程能写Hashtable,因此也导致了 Hashtable在写入时会比较慢。treemap、HashMap不支持线程的同步,即任一时刻可以有多个线程同时写treemap/HashMap;可能会导致数据的不一致。如果需要同步,可以用Collections的synchronized方法使treemap/HashMap具有同步的能力.
  • 4.HashTable,TreeMap不允许null值,key和value都不可以,HashMap允许null值,key和value都可以,但只能由一个null值,因为hashmap如果key值相同,新的key, value将替代旧的。   
  • 5.HashTable使用Enumeration,HashMap使用Iterator。   
  • 6.HashTable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。   
  • 7.LinkedHashMap在遍历的时候比HashMap慢,不过有种情况例外,当HashMap容量很大,实际数据较少时,遍历起来可能会比LinkedHashMap慢,因为LinkedHashMap的遍历速度只和实际数据有关,和容量无关,而HashMap的遍历速度和他的容量有关。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值