博客
关于我
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/

你可能感兴趣的文章
opencv14-自定义线性滤波
查看>>
opencv15-边缘处理
查看>>
opencv16-Sobel算子
查看>>
opencv17-laplance算子
查看>>
opencv18-canny检测算法
查看>>
opencv19-霍夫直线变化
查看>>
opencv2-矩阵掩膜操作
查看>>
opencv20-霍夫圆检测
查看>>
opencv21-像素重映射
查看>>
opencv22-直方图均衡化
查看>>
opencv23-直方图计算
查看>>
opencv24-直方图比较
查看>>
opencv25-直方图反向投影
查看>>
opencv26-模板匹配
查看>>
opencv27-轮廓发现
查看>>
opencv28-凸包
查看>>
opencv29-轮廓周围绘制矩形框和圆形框
查看>>
OpenCV3 install tutorial for Mac
查看>>
opencv3-Mat对象
查看>>
opencv30-图像矩
查看>>