博客
关于我
Map linkedMap,HashTable
阅读量:659 次
发布时间:2019-03-15

本文共 1722 字,大约阅读时间需要 5 分钟。

哈希表和链表实现的Map接口,具有可预测的迭代次序。这种实现不同于HashMap,它通过维护双向链表来记录元素的位置。这种结构赋予了迭代操作可预测的顺序,通常称为插入顺序。也就是说,键按照第一次被插入时的顺序被组织起来。在重新插入键时,即当Map.containsKey(k)返回true之前调用的put(k, v)会更新键时,插入顺序不受影响。

展开阅读

哈希表和链表结合的结构使得这种Map实现既高效又具有可预测的行为。与HashMap不同,LinkedHashMap会记录元素的位置顺序,这使得迭代操作能够按照特定规则执行。这种设计使得LinkedHashMap非常不适合以插入顺序排序的场景。

底层原理

LinkedHashMap的底层结构包括一个哈希表,用于快速定位键的位置,以及一个双向链表,用于记录键的插入顺序。哈希表允许O(1)的平均时间复杂度进行查找、删除和插入操作,而链表则用于记录元素的访问顺序。

代码示例

下面的代码首先创建了一个HashMap,并在其基础上创建了一个LinkedHashMap。区别在于,当相同的键多次插入时,最后一次插入会覆盖前一次的值,但不影响键的位置顺序。

public class Demo05LinkedHashMap {    public static void main(String[] args) {        // 创建一个HashMap        Map
map = new HashMap<>(); map.put("a", "a"); map.put("c", "c"); map.put("b", "b"); map.put("a", "d"); System.out.println(map); // {a=d, b=b, c=c} key值不允许重复,无序 // 创建一个LinkedHashMap Map
map1 = new LinkedHashMap<>(); map1.put("a", "a"); map1.put("c", "c"); map1.put("b", "b"); map1.put("a", "d"); System.out.println(map1); // {a=d, c=c, b=b} key值不允许重复,有序 }}

显示效果

执行上述代码,可以看到以下输出结果:

{a=d, b=b, c=c}------------------------------------------------------------{a=d, c=c, b=b}

可以看到,HashMap的输出结果是无序的,而LinkedHashMap的输出结果则是按照插入顺序排列的。

Hashtable的特点

Hashtable<K, V> 是集合框架中最古老的Map实现之一。它具有以下特点:

  • 线程安全:适用于多线程环境,所有操作都是原子性的。
  • 哈希表结构:与HashMap类似,使用哈希表实现快速查找。
  • 性能:由于线程安全的设计,性能相对较慢,尤其是在单线程环境中,可以使用HashMap来替代。
  • 不允许存储null值:键和值都不能为null。
  • 历史意义:在Java 1.2之前,Hashtable和Vector是集合框架的核心类,但后来逐渐被HashMap和ArrayList取代。
  • 重要子类:Properties是Hashtable的子类,与IO流结合使用,广泛应用于读写配置文件。

总结

Hashtable是一个线程安全的Map实现,使用哈希表和链表结构,性能较慢。LinkedHashMap则通过额外的双向链表结构,记录元素的插入顺序,使其迭代行为具有可预测性。无论是Hashtable还是LinkedHashMap,都不允许存储null值,适用于键值对的存储和查找操作。在实际开发中,可以根据具体需求选择合适的实现类。

转载地址:http://xljmz.baihongyu.com/

你可能感兴趣的文章
Netty工作笔记0014---Buffer类型化和只读
查看>>
Netty工作笔记0050---Netty核心模块1
查看>>
Netty工作笔记0084---通过自定义协议解决粘包拆包问题2
查看>>
Netty常见组件二
查看>>
netty底层源码探究:启动流程;EventLoop中的selector、线程、任务队列;监听处理accept、read事件流程;
查看>>
Netty核心模块组件
查看>>
Netty框架的服务端开发中创建EventLoopGroup对象时线程数量源码解析
查看>>
Netty源码—2.Reactor线程模型一
查看>>
Netty源码—4.客户端接入流程一
查看>>
Netty源码—4.客户端接入流程二
查看>>
Netty源码—5.Pipeline和Handler一
查看>>
Netty源码—6.ByteBuf原理二
查看>>
Netty源码—7.ByteBuf原理三
查看>>
Netty源码—7.ByteBuf原理四
查看>>
Netty源码—8.编解码原理二
查看>>
Netty源码解读
查看>>
Netty的Socket编程详解-搭建服务端与客户端并进行数据传输
查看>>
Netty相关
查看>>
Network Dissection:Quantifying Interpretability of Deep Visual Representations(深层视觉表征的量化解释)
查看>>
Network Sniffer and Connection Analyzer
查看>>