常用的Map——HashMap和LinkedHashMap

一、HashMap基础用法:

public class Main {

    public static void main(String[] args) {

        HashMap<String,String> hashMap=new HashMap<>();
        hashMap.put("s","Sean");
        hashMap.put("d","Dam");
        hashMap.put("j","James");
        hashMap.put("b","Bryant");

        System.out.println(hashMap);
        System.out.println(hashMap.get("s"));
        System.out.println(hashMap.containsKey("s"));

        System.out.println(hashMap.keySet());
        System.out.println(hashMap.isEmpty());

        Iterator it=hashMap.keySet().iterator();//第一种遍历方法
        while(it.hasNext())
        {
            String key=(String)it.next();
            System.out.println("key:"+key);
            System.out.println("value:"+hashMap.get(key));
        }

        Set<Map.Entry<String,String>> sets=hashMap.entrySet();//第二种遍历方法
        for(Map.Entry<String,String> entry:sets)
        {
            System.out.println(entry.getKey()+" "+entry.getValue());
        }
    }
}

运行结果:

{b=Bryant, s=Sean, d=Dam, j=James}
Sean
true
[b, s, d, j]
false
key:b
value:Bryant
key:s
value:Sean
key:d
value:Dam
key:j
value:James
b Bryant
s Sean
d Dam
j James

可以看到HashMap是无序的


二、LinkedHashMap基础用法和HashMap基本一致但唯一不同的是,LinkedHashMap是有序的,和插入顺序一致:

public class Main {

    public static void main(String[] args) {

        LinkedHashMap<String,String> hashMap=new LinkedHashMap<>();
        hashMap.put("s","Sean");
        hashMap.put("d","Dam");
        hashMap.put("j","James");
        hashMap.put("b","Bryant");

        System.out.println(hashMap);
        System.out.println(hashMap.get("s"));
        System.out.println(hashMap.containsKey("s"));

        System.out.println(hashMap.keySet());
        System.out.println(hashMap.isEmpty());

        Iterator it=hashMap.keySet().iterator();
        while(it.hasNext())
        {
            String key=(String)it.next();
            System.out.println("key:"+key);
            System.out.println("value:"+hashMap.get(key));
        }

        Set<Map.Entry<String,String>> sets=hashMap.entrySet();
        for(Map.Entry<String,String> entry:sets)
        {
            System.out.println(entry.getKey()+" "+entry.getValue());
        }
    }
}

运行结果:

{s=Sean, d=Dam, j=James, b=Bryant}
Sean
true
[s, d, j, b]
false
key:s
value:Sean
key:d
value:Dam
key:j
value:James
key:b
value:Bryant
s Sean
d Dam
j James
b Bryant

HashMap和LinkedHashMap不同的原因就是:

HashMap和LinkedHashMap对Entry的存储结构(哈希表和拉链法)

这里写图片描述

但是LinkedHashMap多了该链表就可以记录插入顺序了

### 1. ### ArrayList 的特性及适用场景 `ArrayList` 是基于动态数组实现的集合类,支持随机访问。它的内部维护了一个对象数组,随着元素数量的增长可以自动扩容。以下是其主要特点: - 支持快速随机访问(通过索引),时间复杂度为 O(1)[^2]。 - 插入删除操作较慢,特别是在中间位置插入或删除时需要移动大量元素[^3]。 - 不是线程安全的,如果多个线程同时修改同一个 `ArrayList` 实例,则可能引发不一致状态[^3]。 ```java // 创建并初始化 ArrayList List<String> arrayList = new ArrayList<>(); arrayList.add("First Element"); arrayList.get(0); // 快速获取第一个元素 ``` --- ### 2. ### HashMap 的特性及适用场景 `HashMap` 是基于哈希表实现的键值对存储容器,具有以下特征: - 键值都可以为 null,但每个键最多只能有一个对应的值[^3]。 - 存储无序,即迭代顺序不一定等于插入顺序。 - 平均情况下提供常数级别的查找效率 O(1),但在极端情况下(如哈希冲突严重)可能导致退化到链表的时间复杂度 O(n)。 - 同样是非线程安全的设计[^3]。 ```java // 使用 HashMap 示例 Map<String, Integer> hashMap = new HashMap<>(); hashMap.put("Key", 42); int value = hashMap.get("Key"); // 获取对应值 ``` --- ### 3. ### LinkedHashMap 的特性及适用场景 作为 `HashMap` 的子类,`LinkedHashMap` 增强了对其内部条目顺序的支持能力。它不仅保留了父类高效的存取优势,还引入了一种双向链表用于跟踪节点间的相对关系。这使得它可以记住元素的插入次序或者最近最少使用(LRU)模式下的访问频率排序。 - 默认保持插入顺序,这意味着当你用 Iterator 遍历整个映射集时,所获得的结果总是遵循最初加入这些项时的确切序列[^2]^。 - 对于某些特定场合下(比如缓存系统),能够依据访问频次调整排列有助于优化内存利用率以及提升检索效能[^2]. - 普通的 `HashMap` 相比,在遍历过程中稍微耗费更多资源,除非遇到特殊情形——当原生 `HashMap` 容量设定得过大而填充率较低之时,反而可能出现后者表现更差的现象. ```java // 使用 LinkedHashMap 示例 Map<String, String> linkedHashMap = new LinkedHashMap<>(); linkedHashMap.put("A", "Value A"); linkedHashMap.put("B", "Value B"); for (String key : linkedHashMap.keySet()) { System.out.println(key + ": " + linkedHashMap.get(key)); } // 输出将严格按照“A -> Value A”,接着“B -> Value B”的形式呈现出来 ``` --- ### 4. ### 主要区别总结表格 | 属性/类别 | **ArrayList** | **HashMap** | **LinkedHashMap** | |----------------|-------------------------------------|----------------------------------------|---------------------------------------| | 数据结构类型 | 动态数组 | 哈希表 | 继承自 HashMap 加上双向链表 | | 是否有序 | 按照添加顺序 | 无序 | 记录插入顺序 | | Key/Value 结构 | 单列 | 双列 | 双列 | | Null 处理 | 元素可为null | 键值均可为null | 键值均可为null | | 查找性能 | 根据索引O(1), 其他情况O(n) | 平均为O(1) | 平均为O(1) | | 删除性能 | 中间删除耗时较高 | 较快 | 较快 | | 线程安全性 | 非线程安全 | 非线程安全 | 非线程安全 | --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值