集合之list(数组,队列),set

本文深入解析Java集合框架,重点对比ArrayList与LinkedList特性,探讨Vector线程安全性,以及HashSet与TreeSet在Set接口下的应用差异。

对于java中的集合来说,List接口充当着重要的身份,再我们实际的开发过程中也经常用,面试过程中经常问的集合容器。

首先:Object 衍生出Collection(父级接口)接口,然后List继承了Collection
在这里插入图片描述

这里是接口基本层次图,注意一下,map并不是继承了Collection。这也导致了map和其他2大接口的区别。

由于list继承Collection接口 所以Collection对集合操作的基本方法,list同样也有。比如 add(),size()等。同时list的元素都是有序的,类似于java数组一样。顺序的话就是插入的顺序。

list接口下面常用的集合类有ArrayList和LinkedList。

下面就来说一下***两者的区别***。

ArrayList:实现可变的数组,允许保存所有元素,允许null元素。既然是数组的话,我们当然可以通过下标去操作数组中的元素。既然是可变的,那么可变大小是多大呢,在jdk1.8上面查找了ArrayList()构造方法,默认的初始化大小为10,当其长度不够的话 就会增长原来大小的1.5倍,也就是说 本来是10个容量,现在变15个。同时对于线程来说,是不同步的,不安全的。

缺点:由于是数组,我们在对数组进行指定位置的删除和插入操作的时候,就不是很方便,效率也会下降。

LinkedList:采用了链表结构,除list接口还实现Deque接口,同时也是不同步的。

散列在内存当中,当我们向集合中插入和删除对象,建议使用LinkedList,如果随机访问的话 就使用ArrayList。

在这里说一下vector

vector:和ArrayList比较类似,都是可拓展数组。其增长大小为原来的2倍。同时也是线程安全的,同步。

其次再说一下Set接口,set相对来说,开发过程中就比较少了,其中set的主要特点就是内部的元素不可重复,而且是无顺序的。其中主要实现类有HashSet和TreeSet

HashSet:实现了Set接口,并由哈希表支持(HashMap),因为是无顺序的所以不保证迭代顺序,此类允许null元素。

TreeSet:实现Set接口,并且实现了SortSet接口,会自动的按自然排序(a,b,c,d),(目前我只有在微信支付的预订单接口用到此集合)同时存入TreeSet类实现的set集合必须实现comparable接口。
————————————————
版权声明:本文为优快云博主「请叫我书生」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/weixin_37012881/article/details/81629104

<think>嗯,用户想了解Java中Array和List的区别及用法比较。我之前整理过一些引用资料,需要先看看这些资料里有没有相关的信息。引用[1]提到数组用方括号声明,比如int[] arr,而列表用泛型类如ArrayList。引用[2]和[3]可能也补充了语法和内部实现的差异。引用[4]则讨论了List<Map>的用法,但可能和当前问题关联不大。 首先,应该从声明和初始化开始比较。数组在Java中是定长的,声明时需要指定大小,而List是接口,常用ArrayList或LinkedList实现,初始化更灵活。例如,数组是int[] arr = new int[10];,而ListList<Integer> list = new ArrayList<>();。 然后是容量方面,数组长度固定,不能动态调整,而List可以自动扩容。这点很重要,用户可能关心为什么有时候用List更方便。 类型系统方面,数组可以存储基本类型和对象,比如int[]或者Integer[],但List只能存储对象,所以要用包装类如Integer。例如,List<int>会报错,必须用List<Integer>。 性能比较方面,数组在内存中是连续分配的,访问速度快,而List的随机访问效率也不错,但插入删除可能涉及元素移动,尤其是ArrayList。LinkedList则在插入删除时更快,但随机访问慢。需要分点说明。 语法操作上,数组用arr[0]访问,而List用get(0)和set(0, value)。添加元素的话,数组需要手动处理,而List有add方法。这部分可以举例子,比如添加元素到数组可能需要创建新数组,而List直接add。 应用场景方面,数组适合固定长度、高性能需求的情况,比如底层算法或大量数据操作。List适合需要动态调整、频繁增删的情况,比如业务逻辑处理。 用户可能还会混淆ArrayList数组,需要指出ArrayList内部是基于数组实现的,但提供了更多便捷方法。此外,多维数组List嵌套的区别,比如int[][]和List<List<Integer>>。 另外,引用[3]提到List和Array在索引访问时的IL代码不同,说明底层实现差异,可能影响性能。但具体细节可能不需要深入,只要说明实现上的不同即可。 最后,总结两者的主要区别,并给出选择建议。例如,固定大小用数组,需要灵活性用List。同时,可以生成相关问题,比如如何转换数组List,或者性能优化的方法。</think>### Java中Array和List的区别及用法比较 #### 一、基础定义与语法 1. **Array(数组)** - **静态数据结构**:长度固定,声明时需指定大小 示例: ```java int[] arr = new int[5]; // 声明长度为5的整型数组 String[] strArr = {"A", "B", "C"}; // 初始化赋值 ``` - **访问方式**:通过索引直接访问,例如`arr[0]` - **支持类型**:可存储基本数据类型(如`int`)或对象类型(如`Integer`)[^1] 2. **List(列表)** - **动态数据结构**:基于接口`List`的实现类(如`ArrayList`、`LinkedList`),长度可动态扩展 示例: ```java List<Integer> list = new ArrayList<>(); // 初始化空列表 list.add(10); // 添加元素 ``` - **访问方式**:通过方法`get(index)`和`set(index, value)`操作元素 - **类型限制**:仅支持对象类型(需使用包装类如`Integer`代替`int`)[^1][^4] --- #### 二、核心区别对比 | **特性** | **Array** | **List** | |------------------|------------------------------------|-----------------------------------| | **容量** | 固定长度,不可扩展 | 动态扩展(默认扩容1.5倍) | | **内存分配** | 连续内存空间 | 基于实现类(如ArrayList数组存储)| | **性能** | 随机访问$O(1)$,增删元素$O(n)$ | ArrayList增删$O(n)$,LinkedList增删$O(1)$ | | **语法操作** | 使用`[]`操作符 | 通过`add()`、`remove()`等方法 | | **多维结构** | 支持多维(如`int[][]`) | 需嵌套(如`List<List<Integer>>`) | --- #### 三、典型应用场景 1. **优先使用Array的场景** - 数据量固定且需要高性能随机访问(如图像处理) - 存储基本数据类型(如`double[]`用于科学计算) - 与底层系统交互(如JNI调用)[^2] 2. **优先使用List的场景** - 需要动态调整容量(如用户输入数据收集) - 频繁插入/删除元素(如使用`LinkedList`实现队列) - 依赖集合框架工具(如`Collections.sort()`排序) --- #### 四、互相转换示例 1. **Array转List** ```java String[] arr = {"A", "B"}; List<String> list = new ArrayList<>(Arrays.asList(arr)); ``` 2. **List转Array** ```java List<Integer> list = List.of(1, 2, 3); Integer[] arr = list.toArray(new Integer[0]); ``` --- #### 五、性能优化建议 1. **ArrayList初始化时指定容量**,避免频繁扩容: ```java List<Integer> list = new ArrayList<>(100); // 预分配100个元素空间 ``` 2. **优先选择`for-each`循环**而非索引遍历,避免LinkedList的$O(n^2)$访问开销。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值