探寻LinkedList,HashMap,TreeMap的区别

本文探讨了LinkedList、HashMap和TreeMap的特点及应用场景。详细介绍了散列与散列码的概念,解释了HashMap为何高效,以及LinkedList和TreeMap的工作原理。适合对数据结构有兴趣的读者。

探寻LinkedList,HashMap,TreeMap的区别:
- 散列与散列码
- HashMap快的原因
- LinkedList
- TreeMap


散列与散列码:

散列 的价值主要在于速度,键没有按照任何特定顺序进行保存,所以只能进行简单的线性查找,而线性是最慢的查询方式了。存储一组元素最快的数据结构是数组,可以通过键的对象生成一个数字,作为数组的下标,这个数字就是散列码,数组并不保存值,而是保存值的list,然后对list的值使用equal()进行线性查找,使用散列的话,不是查询整个list而是快速的跳到数组的某个位置,只对很少的元素进行比较。

HashMap快的原因

在映射表中使用使用get()进行线性搜索时,执行速度会相当慢,HashMap使用了特殊的值,称作散列码,来取代对键的缓慢搜索。散列码是唯一的,用以代表对象的值,他通过将该对象的某些信息进行转换而生成的。hashCode()是根类object中的方法,默认使用对象的地址计算散列码,因此所有java对象都能产生散列码。Map相当于一个数组,数组并不保存”键“本身,而是通过”键“对象生成一个数字,将其作为数组的下标索引,这个数字就是散列码。可以通过构造器设置的容量和负载因子,调整容器的性能。

LinkedHashMap

LinkedHashMap 使用的是LRU算法,最近最少的算法,没有被访问过的元素会出现在队列的前面,类似于HashMap,比他慢一点,但是迭代访问的时候反而更快,因为他使用链表维护内部次序,正如官方文档介绍
Hash table and linked list implementation of the Map interface, with predictable iteration order. This implementation differs from HashMap in that it maintains a doubly-linked listrunning through all of its entries. This linked list defines the iteration ordering, which is normally the order in which keys were inserted into the map (insertion-order).
LinkedHashMap是Hash表和链表的实现,并且依靠着双向链表保证了迭代顺序是插入的顺序。它是HashMap的一个子类,如果需要输出的顺序和输入的相同,那么用LinkedHashMap可以实现,它还可以按读取顺序来排列,像连接池中可以应用。

—— [官方文档 ]

TreeMap

TreeMap的实现是红黑树算法的实现,所以要了解TreeMap就必须对红黑树有一定的了解

转载 —— [Java提高篇(二七)—–TreeMap ]

TreeMap特点在于所有的结果都是进行过排序的,是一个唯一带有subMap()方法的Map,可以返回一个子树
TreeMap实现SortMap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,通过comparator接口我们可以对TreeMap的内部排序进行精密的控制
TreeMap取出来的是排序后的键值对。但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。

### 数据结构特点与区别 #### Stack Stack 是一种后进先出(LIFO, Last In First Out)的数据结构。它通常基于数组或链表实现,支持的主要操作包括 `push`(将元素压入栈顶)、`pop`(从栈顶移除元素)和 `peek`(查看栈顶元素而不移除)。Stack 的特点是只允许在一端进行插入和删除操作[^1]。 ```java Stack<Integer> stack = new Stack<>(); stack.push(1); // 入栈 stack.pop(); // 出栈 ``` #### List List 是一种有序集合,允许存储重复元素,并且可以通过索引访问元素。Java 中最常用的实现类是 `ArrayList` 和 `LinkedList`。`ArrayList` 基于动态数组实现,适合随机访问;`LinkedList` 基于双向链表实现,适合频繁的插入和删除操作[^2]。 ```java List<String> list = new ArrayList<>(); list.add("A"); // 添加元素 list.get(0); // 根据索引获取元素 ``` #### Map Map 是一种键值对(Key-Value)存储结构,不允许键重复。常见的实现有 `HashMap`、`TreeMap` 和 `LinkedHashMap`。Map 的特点是通过键快速查找对应的值[^3]。 #### Queue Queue 是一种先进先出(FIFO, First In First Out)的数据结构,支持的主要操作包括 `offer`(添加元素到队尾)、`poll`(移除队首元素)和 `peek`(查看队首元素而不移除)。Java 中常见的实现类有 `LinkedList` 和 `PriorityQueue`[^4]。 ```java Queue<String> queue = new LinkedList<>(); queue.offer("A"); // 入队 queue.poll(); // 出队 ``` #### HashMap HashMap 是基于哈希表实现的 Map 接口实现类,其数据结构在 JDK 1.8 中为 **数组 + 链表 + 红黑树**。当链表长度超过阈值(默认为 8)时,链表会转换为红黑树以提高性能。HashMap 不保证键值对的顺序,但提供了非常快的插入、删除和查找速度[^5]。 ```java Map<String, Integer> map = new HashMap<>(); map.put("key", 1); // 插入键值对 map.get("key"); // 获取值 ``` #### TreeMap TreeMap 是基于红黑树实现的 Map 接口实现类,能够按照键的自然顺序或自定义比较器排序。TreeMap 提供了有序的键值对访问,因此在需要按键排序的场景中表现优异。然而,由于红黑树的特性,TreeMap 的插入、删除和查找操作的时间复杂度为 O(log n)[^6]。 ```java Map<String, Integer> map = new TreeMap<>(); map.put("key", 1); // 插入键值对 map.firstKey(); // 获取最小键 ``` --- ### 数据结构特点总结 | 数据结构 | 特点 | 时间复杂度(常见操作) | |----------|----------------------------------------------------------------------------------------|------------------------| | Stack | 后进先出(LIFO),仅在一端操作 | O(1) | | List | 有序集合,支持随机访问和重复元素 | O(1)(访问),O(n)(插入/删除) | | Map | 键值对存储,通过键快速查找值 | O(1)(HashMap),O(log n)(TreeMap) | | Queue | 先进先出(FIFO),支持队列操作 | O(1) | | HashMap | 基于哈希表,不保证顺序,提供快速的插入、删除和查找 | O(1) | | TreeMap | 基于红黑树,按键排序,提供有序的键值对访问 | O(log n) | --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值