list和set的区别

list和set的区别
list和set都实现同一个接口,

list是有序集合

ArrayList和linkedList都实现了List接口,ArrayList是线性结构,根据下标对数据进行操作,ArrayList查询快,增删慢。

LinkedList是链表结构,增加和删除快,查询慢。

Set是无序的

HashSet和TreeSet都实现了Set接口,内容不可重复,HashSet底层是哈希表,通过hashcode和eq来保证数据的一致性。

TreeSet底层是二叉树,根据比较的返回值确定元素的一致性。

LinkedHashSet:底层是链性+二叉树+哈希表。由链表保证元素有序,哈希表保证元素唯一

### 三、List Set 的基本特性 在 Java 集合框架中,`List` `Set` 是两个常用的接口,它们都实现了 `Collection` 接口,但在数据存储特性、元素顺序、重复性以及适用场景等方面存在显著差异。 #### 1. 元素顺序 `List` 是一个有序集合,它按照插入顺序存储元素,并且可以通过索引访问特定位置的元素。例如 `ArrayList` 或 `LinkedList` 都保留了插入顺序[^3]。 ```java List<String> list = new ArrayList<>(); list.add("A"); list.add("B"); list.add("C"); System.out.println(list); // 输出顺序为 [A, B, C] ``` 而 `Set` 是一个无序集合,不保证元素的插入顺序。例如 `HashSet` 不维护插入顺序,其元素的存储顺序是基于哈希值决定的[^5]。 ```java Set<String> set = new HashSet<>(); set.add("A"); set.add("B"); set.add("C"); System.out.println(set); // 输出顺序可能为 [A, C, B] ``` #### 2. 元素唯一性 `List` 允许包含重复的元素,可以多次添加相同的对象[^2]。 ```java List<String> list = new ArrayList<>(); list.add("A"); list.add("A"); System.out.println(list); // 输出 [A, A] ``` 而 `Set` 不允许包含重复的元素,每个元素必须是唯一的。如果尝试添加重复元素,`Set` 会自动忽略第二次及之后的添加操作。 ```java Set<String> set = new HashSet<>(); set.add("A"); set.add("A"); System.out.println(set); // 输出 [A] ``` #### 3. 实现类及性能特性 `List` 的常见实现类包括 `ArrayList`、`Vector` `LinkedList`。其中 `ArrayList` 提供了快速的随机访问能力,适合频繁读取索引操作的场景;而 `LinkedList` 更适合频繁插入删除的操作[^4]。 `Set` 的常见实现类包括 `HashSet`、`LinkedHashSet` `TreeSet`。`HashSet` 提供了快速的查找插入操作;`LinkedHashSet` 保持了插入顺序;而 `TreeSet` 则按照自然顺序或自定义比较器对元素进行排序。 #### 4. 使用场景 - **List** 适用于需要频繁通过索引访问元素、允许重复值、并且希望保持插入顺序的场景。例如:存储用户输入的历史记录、有序的事件队列等。 - **Set** 适用于需要保证元素唯一性的场景,例如:去重操作、集合运算(并集、交集等)、以及需要排序或按插入顺序存储的情况(如使用 `TreeSet` 或 `LinkedHashSet`)[^3]。 --- ### 代码示例 ```java // List 示例 List<Integer> list = new ArrayList<>(); list.add(1); list.add(2); list.add(1); // 允许重复 System.out.println(list); // 输出 [1, 2, 1] // Set 示例 Set<Integer> set = new HashSet<>(); set.add(1); set.add(2); set.add(1); // 重复元素不会被添加 System.out.println(set); // 输出 [1, 2] ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值