LIST、MAP、SET总结

List、Set 和 Map 都是实现了 Collection 接口的接口。本文将讨论 Java 语言中这三者之间的区别。

List Vs Set Vs Map

1) 重复性

  • List 允许有重复元素。任何数量的重复元素都可以在不影响现有重复元素的值及其索引的情况下插入到 List。
  • Set 不允许重复。Set 以及所有实现了 Set 接口的类都不允许重复值的插入。
  • Map 以键值对的形式对元素进行存储。Map 不允许重复键但允许重复值

    2) 空值

    • List 允许任意数量的空值
    • Set 最多允许一个空值的出现。
    • Map 只允许出现一个空键但允许任意数量的空值

    3) 排序

    • List 及其所有实现类保持了每个元素的插入顺序
    • Set 中的元素都是无序的;但某些 Set 的实现类以某种顺序对其中的元素进行排序,比如 LinkedHashSet 按照元素的插入顺序进行排序。
    • Map 跟 Set 一样对元素进行无序存储,但其某些实现类对元素进行了排序。比如,TreeMap 依据键对其中的元素进行升序排序而 LinkedHashMap 则按照每个元素的插入次序进行排序。

    4) 常用实现类

    • List:ArrayList、LinkedList 等等。
    • Set:HashSet、LinkedHashSet、TreeSet、SortedSet 等等。
    • Map:HashMap、TreeMap、WeakHashMap、LinkedHashMap、IdentityHashMap 等等。

    什么时候使用 Java 里的 List、Set 和 Map?

    1) 如果你的数据不允许有重复值,Set 是最适合的选择,因为其所有实现类都不允许有重复值。
    2) 如果需要经常根据元素的索引值进行一些查询操作,那么 List(ArrayList)将是一个不错的选择。
    3) 如果需要保留每个元素的插入次序,那么还是首选 List。
    4) 如果你的数据需要进行 key - value 映射,那么就是 Map 了。

    原文链接:http://blog.youkuaiyun.com/defonds/article/details/47837867


    ### Java 中 ListMapSet 的使用方法与差异 #### 1. **List 接口及其特点** `List` 是一种有序集合,允许存储重复元素,并可以通过索引来访问其中的元素。常用的 `List` 实现类包括 `ArrayList` 和 `LinkedList`。 - **创建和初始化** ```java // 使用 ArrayList 初始化 List<String> list = new ArrayList<>(); list.add("Apple"); list.add("Banana"); // 使用 LinkedList 初始化 List<String> linkedList = new LinkedList<>(); linkedList.add("Orange"); linkedList.add("Grapes"); ``` - **主要特性** - 元素有序[^4]。 - 支持重复元素。 - 可通过索引快速访问元素。 - **性能对比** - 对于随机访问,`ArrayList` 更高效,因为它基于数组结构[^1]。 - 对于频繁插入和删除操作,`LinkedList` 更优,因为它的内部实现为双向链表。 --- #### 2. **Set 接口及其特点** `Set` 是一种不允许存储重复元素的集合,具体实现依赖于底层的数据结构。常见的实现类有 `HashSet` 和 `TreeSet`。 - **创建和初始化** ```java // 使用 HashSet 初始化 Set<String> hashSet = new HashSet<>(); hashSet.add("Dog"); hashSet.add("Cat"); // 使用 TreeSet 初始化 Set<String> treeSet = new TreeSet<>(); treeSet.add("Lion"); treeSet.add("Tiger"); ``` - **主要特性** - 不允许重复元素[^5]。 - 存储顺序可能不同(取决于实现类),例如 `HashSet` 基于哈希码存储,而 `TreeSet` 提供自然排序或自定义排序。 - **性能对比** - 如果需要快速查找而不关心顺序,可以选择 `HashSet`。 - 如果需要对集合中的元素进行排序,则应选择 `TreeSet`。 --- #### 3. **Map 接口及其特点** `Map` 表示键值对的集合,每个键最多对应一个值,且键不可重复。常用实现类包括 `HashMap`、`TreeMap` 和 `LinkedHashMap`。 - **创建和初始化** ```java // 使用 HashMap 初始化 Map<String, Integer> hashMap = new HashMap<>(); hashMap.put("John", 28); hashMap.put("Jane", 32); // 使用 TreeMap 初始化 Map<String, String> treeMap = new TreeMap<>(); treeMap.put("Key1", "Value1"); treeMap.put("Key2", "Value2"); // 使用 LinkedHashMap 初始化 Map<Integer, String> linkedHashMap = new LinkedHashMap<>(); linkedHashMap.put(1, "First"); linkedHashMap.put(2, "Second"); ``` - **主要特性** - 键唯一,值可以重复。 - 访问方式基于键值对。 - 部分实现类保留插入顺序(如 `LinkedHashMap`) 或提供按键排序功能(如 `TreeMap`)。 - **性能对比** - 对于非线程安全场景下的高性能需求,推荐使用 `HashMap`。 - 若需按键排序,可选用 `TreeMap`;若需保持插入顺序,建议使用 `LinkedHashMap`。 --- #### 差异总结表格 | 属性/接口 | List | Set | Map | |-----------|-------------------------------|-------------------------------|--------------------------------| | 数据结构 | 数组(`ArrayList`)、链表(`LinkedList`) | 哈希表(`HashSet`)、红黑树(`TreeSet`) | 哈希表(`HashMap`)、红黑树(`TreeMap`)、链表+哈希表(`LinkedHashMap`) | | 是否有序 | 有序 | 无序(部分实现有序) | 无序(部分实现有序) | | 是否支持重复 | 支持 | 不支持 | 键不支持重复 | | 主要用途 | 索引访问 | 去重 | 键值关联 | --- ### 性能比较 - **遍历效率** - `ArrayList` 和 `HashMap` 在随机访问上表现更佳。 - `LinkedList` 和 `HashSet` 在动态增删方面更具优势。 - **内存占用** - `ArrayList` 和 `HashMap` 内存分配较为紧凑。 - `LinkedList` 和 `TreeSet` 则因额外指针或节点信息而导致更高的内存消耗。 --- ### 示例代码综合展示 以下是三种集合类型的简单应用: ```java import java.util.*; public class CollectionExample { public static void main(String[] args) { // List 示例 List<String> list = new ArrayList<>(); list.add("A"); list.add("B"); list.add("C"); System.out.println("List: " + list); // Set 示例 Set<String> set = new HashSet<>(); set.add("X"); set.add("Y"); set.add("Z"); System.out.println("Set: " + set); // Map 示例 Map<String, Integer> map = new HashMap<>(); map.put("One", 1); map.put("Two", 2); map.put("Three", 3); System.out.println("Map: " + map); } } ``` ---
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

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

    抵扣说明:

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

    余额充值