ArrayList
理解
-
实现 Cloneable 接口,即覆盖了函数clone(),能被克隆
-
实现 java.io.Serializable 接口,即ArrayList支持序列化,能通过序列化去传输
-
它的大小是按照其中存储的数据来 动态扩充与收缩
-
当元素的数量超过数组长度时
- 新建更大容量数组,将原数组内容拷贝一份,然后新增元素的方式存储元素
方法
- 见 collection
怎么实现不用声明大小
- 当 new ArrayList() 的时候,默认会有一个 空的Object数组,大小为0
- 当第一次add添加数据的时候,会给这个数组 初始化一个大小默认值为10
ArrayList & Vector
Vector是ArrayList的多线程的一个替代品,都是 Ilist 的实现类,基于数组的实现
- 线程安全性
- A :非线程安全
- V :线程安全,效率低,绝大多数方法使用同步关键字 synchronized 修饰,实现了线程的同步,这样在多线程的情况下不会出现并发错误
- 默认容量和扩容机制不同
- A
- ArrayList 的默认构造函数
ArrayList()
会构造一个长度为10的数组 ArrayList(int initialCapacity)
构造函数会构造一个指定长度的数组- 添加元素时,如果超出了长度,会新建更大容量数组,将原数组内容拷贝一份,然后新增元素的方式存储元素
- 以每次旧长度的 3/2倍 增长
- ArrayList 的默认构造函数
- V
- 默认是10,可以指定扩容倍数,默认是 2倍
- A
Array & ArrayList & List
- 数组
-
内存中是连续存储的,所以它的索引速度是非常的快
- Java中,数组一旦在堆内存中创建,长度是固定的
参考链接
- Java中,数组一旦在堆内存中创建,长度是固定的
-
赋值与修改元素也很简单
-
array 是针对任意类型、固定长度的
-
缺点
- 在数组的两个数据间 插入数据 也是很麻烦的
- 在声明数组的时候,必须同时指明数组的长度,考虑 长度问题
- 数组的长度过长,会造成内存浪费
- 数组和长度过短,会造成数据溢出的错误
-
- ArrayList
- 继承了IList接口,所以它可以很方便的进行数据的添加,插入和移除
- 在声明ArrayList对象时并不需要指定它的长度
- ArrayList是针对任意类型、任意长度的
- 缺点
- 非类型安全
- ArrayList 会把所有插入其中的数据都当作为 object 类型来处理
- 使用 ArrayList 中的数据来处理问题的时候,很可能会报 类型不匹配 的错误
- 效率性能损耗
- 对于一般的引用类型来说,这部分的影响不是很大
- 值类型:往ArrayList里面添加和修改元素,都会引起装箱和拆箱的操作,频繁的操作可能会影响部分效率
- 非类型安全
- List
- List 类是 ArrayList 类的泛型等效类
- List 是针对特定类型、任意长度
- 在声明List集合时,同时需要为其声明List集合内数据的对象类型
List<int> list = new List<int>();
- 好处:泛型提供了类型安全但没有增加多个实现的开销
- 通过允许指定泛型类或方法操作的特定类型,泛型功能将类型安全的任务从您转移给了编译器,不需要编写代码来检测数据类型是否正确
- 因为会在编译时强制使用正确的数据类型。减少了类型强制转换的需要和运行时错误的可能性
小结
ArrayList | Array | 链表 | |
---|---|---|---|
存储 | 基于数组实现 | 连续存储,随机访问 | 随机存储,顺序访问 |
检索 | √ | 快 | 慢 |
增删 | √ | × | |
java | 列表 | 数组 | |
长度声明 | × | √ |