LinkedHashMap集合
- 1. 概述
- 2. 方法
- 3. 遍历方式
- 4. 代码示例
- 5. 注意事项
其他集合类
祖父类 Map
父类 HashMap
集合类的遍历方式
具体信息请查看 API 帮助文档
1. 概述
LinkedHashMap 是 Java 中的一种特殊类型的 HashMap,它继承自 HashMap 类,并实现了 Map 接口。它是一个有序的集合,它保留了元素插入的顺序,并且允许使用它们的插入顺序进行迭代。
与普通的 HashMap 不同,LinkedHashMap 使用了一个双向链表来维护元素的插入顺序。这个链表将所有的条目按照插入的顺序连接在一起。这样一来,通过迭代链表,我们可以遍历 LinkedHashMap 这个有序集合。
LinkedHashMap集合:
-
由键决定:有序、不重复、无索引
-
有序:保证存储和取出的顺序一样
-
原理:底层数据结构依然是哈希表,只不过每个键值对元素又额外多了一个双链表的机制记录存储的顺序。
LinkedHashMap 的特点:
-
有序性:LinkedHashMap 中的元素按照它们被插入的顺序进行排序。这样,当遍历 LinkedHashMap 时,得到的元素的顺序将与插入顺序相同。
-
快速访问:LinkedHashMap 的 get 操作具有常量时间复杂度 O(1)。
-
更多的内存占用:相比于普通的 HashMap,LinkedHashMap 需要维护额外的双向链表结构,因此它在内存占用方面要稍微多一些。
2. 方法
LinkedHashMap
集合是HashMap
集合的子类,是Map
集合的孙子类,因此HashMap
集合和Map
集合的方法LinkedHashMap
集合都能使用。
Map集合
HashMap集合
方法名 | 说明 |
---|---|
V put(K key,V value) | 添加元素 |
V remove(Object key) | 根据键删除键值对元素 |
void clear() | 移除所有的键值对元素 |
boolean containsKey(Object key) | 判断集合是否包含指定的键 |
boolean containsValue(Object value) | 判断集合是否包含指定的值 |
boolean isEmpty() | 判断集合是否为空 |
int size() | 集合的长度,也就是集合中键值对的个数 |
3. 遍历方式
与共有的 集合遍历方式 一样
4. 代码示例
- 代码示例
package text.text02;import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;
import java.util.function.BiConsumer;/*
LinkedHashMap集合:
1.由键决定:有序、不重复、无索引
2.有序:保证存储和取出的顺序一样
3.原理:底层数据结构依然是哈希表,只不过每个键值对元素又额外多了一个双链表的机制记录存储的顺序。*/
public class text51 {public static void main(String[] args) {//创建集合LinkedHashMap<String, String> lhm = new LinkedHashMap<>();//添加元素lhm.put("刘备", "01孙尚香");lhm.put("李白", "02王昭君");lhm.put("孙策", "03小乔");lhm.put("周瑜", "04小乔");lhm.put("孙悟空", "05露娜");lhm.put("亚瑟", "06安琪拉");//遍历集合//1.利用键找值遍历System.out.println("===================1.利用键找值遍历===================");Set<String> set = lhm.keySet();for (String key : set) {String value = lhm.get(key);System.out.println(key + " = " + value);}//2.利用键值对遍历System.out.println("===================2.利用键值对遍历===================");Set<Map.Entry<String, String>> entries = lhm.entrySet();for (Map.Entry<String, String> entry : entries) {String key = entry.getKey();String value = entry.getValue();System.out.println(key + " = " + value);}//3.结合Lambda表达式遍历System.out.println("===================3.结合Lambda表达式遍历===================");lhm.forEach(new BiConsumer<String, String>() {@Overridepublic void accept(String key, String value) {System.out.println(key + " = " + value);}});}
}
- 输出结果
-
1.利用键找值遍历
-
2.利用键值对遍历
-
3.结合Lambda表达式遍历
-
5. 注意事项
-
有序性:LinkedHashMap 是有序的集合,它保持元素插入的顺序。这意味着当你插入元素时,它们将按照插入的顺序排列,并且在迭代时也将按照相同的顺序返回。但是需要注意的是,如果使用访问顺序(accessOrder)启用了 LinkedHashMap,在访问已存在的元素时,该元素会被移动到链表的尾部。
-
性能:LinkedHashMap 的访问操作具有常量时间复杂度 O(1),但相对于普通的 HashMap,LinkedHashMap 需要维护额外的双向链表结构,因此在内存占用方面可能会更高一些。
-
线程安全:LinkedHashMap 是非线程安全的,如果需要在多线程环境下使用,可以通过使用 Collections.synchronizedMap 方法包装 LinkedHashMap,或者使用 ConcurrentHashMap 来实现线程安全的操作。
-
使用迭代器:遍历 LinkedHashMap 时,使用迭代器或者 for-each 循环可以保证元素的有序性。如果在遍历过程中对 LinkedHashMap 进行修改(如添加、删除元素),可能会导致 ConcurrentModificationException 异常。