List和map集合相关问题

自己看了很多相关资料,自己整理的部分内容,希望大家多多斧正,有遗漏的地方可以直接指出来

ArrayList和linkedlist的区别及应用场景?

Arraylist:

  1. 底层是动态数组
  2. 查询速度较快(有具体的索引下标可以直接获取对应的值)
  3. 插入删除效率低(要删除或插入的值后所有数据需要向前或向后移动)

linkedlist

  1. 底层是双向链表
  2. 查询效率较慢(需要遍历整个链表,先判断值是在前半部分还是后半部分)
  3. 插入删除效率高(只需要将指针执行需要插入的元素或其下一个元素即可)

ArrayList适合查询比较频繁的场景;linkedlist适合插入删除比较频繁的场景

 

HashMap、linkedhashMap、treeHashMap的区别?

相同点:都是线程不安全的

不同点:

HashMap:

  • 底层是数组+链表+红黑树(jdk1.8后链表深度大于8时转为红黑树);
  • 无序的

linkedHashMap:

  • 基于HashMap加了一个双向链表(用于排序)
  • 有序的(通过链表实现排序,默认是插入顺序)

TreeMap:

  • 底层是红黑树
  • 有序的(默认是按key升序排序,也可以自定义排序{要实现Comparator接口,进行比较排序})

一般情况hashMap的效率比linkedHashMap高,但当hashMap容量很大时比LinkedHashMap高

数据量很大时:

1.key是随机的情况下获取map的value时的性能表现 HashMap>LinkedHashMap>TreeMap

 

下面是找的一个HashMap/linkedHashMap/treeMap的性能比较案例

https://www.cnblogs.com/zhjh256/p/11626524.html

 

### JavaList Map 的区别与使用场景 #### 一、基本概念 List MapJava 集合框架中的两个主要接口,分别用于不同的数据结构需求。 - **List** 是一种有序的集合,允许重复元素。它通过索引来访问其中的元素[^1]。 - **Map** 则是一种键值对(key-value pair)的数据结构,不允许存在相同的键(Key)。每个键最多对应一个值(Value)。 --- #### 二、功能对比 ##### 1. 数据存储方式 - **List**: 存储一组顺序排列的对象,可以通过整数索引快速定位到某个位置上的对象。支持按插入顺序迭代。 - **Map**: 使用键来唯一标识对应的值,不依赖于索引操作。键不可重复,而值可以重复。 ##### 2. 是否允许重复项 - **List**: 支持存储多个相同的内容实例。 - **Map**: 键必须唯一,如果尝试放入已存在的键,则会覆盖旧值并返回原值。 ##### 3. 访问效率 - 对于随机访问单个元素而言: - **List**: 如果知道确切的位置编号,那么时间复杂度接近 O(1)。 - **Map**: 查找特定 key 所关联 value 的平均性能也是常量级即O(1),但在最坏情况下可能退化至线性查找速度取决于哈希冲突情况。 --- #### 三、典型实现类及其特点 | 类型 | 实现类 | 主要特性 | |------------|----------------------------|-------------------------------------------------------------------------------------------| | **List** | `ArrayList` | 基于动态数组实现,默认容量为10;适合频繁读取但较少修改的操作 | | | `LinkedList` | 双向链表结构,适用于大量增删动作 | | **Map** | `HashMap` | 不保证任何遍历次序;提供最快存取速度 | | | `LinkedHashMap` | 维护插入时记录下来的先后关系,在某些应用场合下既保持高效又能满足一定的逻辑连续性 | | | `TreeMap` | 自动按照自然排序或者自定义比较器指定的方式整理内部条目 | 上述表格展示了不同实现之间的差异以及它们各自的优势所在[^2]。 --- #### 四、代码示例 以下是关于如何创建初始化这两种类型的简单例子: ```java // 创建 ArrayList 并添加一些字符串 List<String> listExample = new ArrayList<>(); listExample.add("Apple"); listExample.add("Banana"); System.out.println(listExample.get(0)); // 输出第一个项目 "Apple" // 创建 HashMap 并设置几组键值配对 Map<Integer, String> mapExample = new HashMap<>(); mapExample.put(1,"Red"); mapExample.put(2,"Green"); String color = mapExample.get(1); System.out.println(color); // 获取键 '1' 关联的颜色名称 “Red” ``` --- #### 五、适用场景分析 当决定选用哪种容器类型时需考虑实际业务需求: - 当需要维护项目的固定序列或是处理含有冗余信息的情况可以选择 **List**; - 而对于那些更关注属性之间一对一映射关系的应用程序来说则更适合采用 **Map** 来管理这些成对出现的信息单元。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值