Java中List、Set、Map三者的区别

本文详细介绍了Java集合框架中的List、Set、Map三者的主要区别,包括重复性、空值性、排序性以及常用实现类。List允许元素重复并保持插入顺序,Set不允许重复,而Map则是键值对存储,键唯一。此外,还讨论了它们在不同场景下的适用性,如List适合索引查询,Set用于不重复数据,Map适用于键值映射。

    前言:笔者为21届应届毕业生,渣渣二本学校,昨天去面试的时候面试官问了我这个问题。当时有点懵圈了,因为平时在项目中只是使用它们,并没有深入了解三者的具体区别。因此,我记录一下自己的面试随笔,希望加深自己印象的同时也解决一些大家的疑惑。

  • List、Set、Map都是实现了Collection接口的接口
  • 重复性

    List允许存在重复的元素,可以在不影响现有元素的值及其索引的情况下插入一个新的重复元素。

    Set不允许存在重复的元素,所以不能插入重复元素。

    Map是一种以键值对的形式存储元素的映射类集合,key(键)是唯一的,value(值)可以为重复的。

  • 空值性

    List允许任意数量的空值。

    Set只允许一个空值。

    Map只允许出现一个空键(key),但可以是任意数量的空值(value)。

  • 排序性

    List保持每个插入元素的排序,有序排列。

    Set中的元素都是无序的,但是某些Set的实现类可以以某种顺序对其中的元素进行排序,例如LinkedHashSet按照元素的插入顺序进行排序。

    Map也属于无序存储,但是某些Map的实现类可以对元素进行排序,例如TreeMap按照元素的升序进行排列,LinkedHashMap按照元素的插入顺序进行排列。

  • 实现类

    List:ArrayList、LinkedList等

    Set:HashSet、LinkedHashSet、TreeSet、SortedSet等

    Map:HashMap、LinkedHashMap等

  • 使用场景

    如果你经常需要对元素的索引值进行查询,可以使用List(ArrayList)。

    如果你的数据不允许重复值存在,可以使用Set。

    如果你需要对元素的插入顺序进行保留,可以使用List或者LinkedHashSet。

    如果你需要对元素进行键值映射,可以使用Map。

 

ListSetMap是不同的集合类型,以下为它们的区别: - **继承关系**:ListSet继承自Collection接口,而Map并不继承自Collection接口 [^1][^3]。 - **元素特性**:List中的元素有放入顺序,且可以重复;Set中的元素无放入顺序,且不可重复,重复元素会被覆盖;Map以键值对形式存放数据,不能包含重复的键,每个键最多只能映射一个值,但值可以重复 [^1][^3][^4][^5]。 - **访问与遍历方式**:List支持通过下标进行for循环遍历,也可以使用迭代器;Set只能使用迭代器遍历,因为它是无序的,无法通过下标获取元素 [^3]。 - **操作效率**:Set检索元素效率低下,但删除和插入效率高,且插入和删除操作不会引起元素位置改变;List可以动态增长,查找元素效率高,但插入和删除元素效率低,因为会引起其他元素位置改变 [^3]。 - **适用场景**:List适合需要存储和按顺序访问重复元素的场景,以及按索引访问和维护插入顺序的场景;Set适合需要确保元素唯一性、去重的场景;Map适合需要键值对映射,以及快速根据键查找值的场景 [^2][^5]。 ```java import java.util.*; public class CollectionDifference { public static void main(String[] args) { // List示例 List<String> list = new ArrayList<>(); list.add("apple"); list.add("banana"); list.add("apple"); System.out.println("List: " + list); // Set示例 Set<String> set = new HashSet<>(); set.add("apple"); set.add("banana"); set.add("apple"); System.out.println("Set: " + set); // Map示例 Map<String, Integer> map = new HashMap<>(); map.put("apple", 1); map.put("banana", 2); map.put("apple", 3); System.out.println("Map: " + map); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值