Java集合类:list补充

本文详细对比了ArrayList与LinkedList这两种常用集合类的特点与应用场景。ArrayList基于数组实现,支持快速的随机访问,适合单线程环境使用;LinkedList基于双向链表实现,顺序访问效率高,适用于频繁插入删除操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ArrayList:
不是线程安全的,建议在单线程下使用,多线程下可以使用Vector或者CopyOnWriteArrayList。
包含两个重要的对象:
elementData(Object【】类型数组),用来保存添加到ArrayList中的元素;
(elementData是个动态数组,通过构造函数 ArrayList(int initialCapacity)来执行它的初始容量为initialCapacity;如果通过不含参数的构造函数ArrayList()来创建ArrayList,则elementData的容量默认是10。elementData数组的大小会根据ArrayList容量的增长而动态的增长。)
size:一个int类型数据,保存动态数组的实际大小;
注意的点:
(01) ArrayList 实际上是通过一个数组去保存数据的。当我们构造ArrayList时;若使用默认构造函数,则ArrayList的默认容量大小是10。
(02) 当ArrayList容量不足以容纳全部元素时,ArrayList会重新设置容量:新的容量=“(原始容量x3)/2 + 1”。
(03) ArrayList的克隆函数,即是将全部元素克隆到一个数组中。
(04) ArrayList实现java.io.Serializable的方式。当写入到输出流时,先写入“容量”,再依次写入“每一个元素”;当读出输入流时,先读取“容量”,再依次读取“每一个元素”。
遍历方式:
(1)Iterator迭代器
Integer value = null;
Iterator iter = list.iterator();
while (iter.hasNext()) {
value = (Integer)iter.next();
}
(2)随机,通过索引(ArrayList实现了RandomAccess接口,它支持通过索引值去随机访问元素)
Integer value = null;
int size = list.size();
for (int i=0; i< size; i++) {
value = (Integer)list.get(i);
}
(3)for
Integer value = null;
for (Integer integ:list) {
value = integ;
}
其中,用索引访问最快,用迭代器最慢

ArrayList.toArray():为得到一个实际的数组
ArrayList提供两个toArray函数:
Object[] toArray()//返回一个Object数组,将它向下转型是会报错:java.lang.ClassCastException(Java不支持向下转型)
T[] toArray(T[] contents)//调用这个
eg:Integer[] newText = (Integer[])v.toArray(new Integer[0]);

LinkedList:
非线程安全;可以被当作堆栈、队列或双端队列进行操作;
既然是双向链表,那么它的顺序访问会非常高效,而随机访问效率比较低。
双向链表和索引值联系:通过一个计数索引值来实现的。例如,当我们调用get(int location)时,首先会比较“location”和“双向链表长度的1/2”;若前者大,则从链表头开始往后查找,直到location位置;否则,从链表末尾开始先前查找,直到location位置。
注意的点:
(01) LinkedList 实际上是通过双向链表去实现的。
 它包含一个非常重要的内部类:Entry。Entry是双向链表节点所对应的数据结构,它包括的属性有:当前节点所包含的值,上一个节点,下一个节点。
(02) 从LinkedList的实现方式中可以发现,它不存在LinkedList容量不足的问题。
(03) LinkedList的克隆函数,即是将全部元素克隆到一个新的LinkedList对象中。
(04) LinkedList实现java.io.Serializable。当写入到输出流时,先写入“容量”,再依次写入“每一个节点保护的值”;当读出输入流时,先读取“容量”,再依次读取“每一个元素”。
(05) 由于LinkedList实现了Deque,而Deque接口定义了在双端队列两端访问元素的方法。提供插入、移除和检查元素的方法。每种方法都存在两种形式:一种形式在操作失败时抛出异常,另一种形式返回一个特殊值(null 或 false,具体取决于操作)。
遍历方式:
建议不要采用随机访问的方式去遍历LinkedList,而采用逐个遍历的方式
遍历LinkedList时,使用removeFist()或removeLast()效率最高。但用它们遍历时,会删除原始数据;
若单纯只读取,而不删除,应该使用for (Integer integ:list) ;
千万不要通过随机访问去遍历LinkedList!

Vector
线程安全;矢量队列,和ArrayList一样,它也是一个动态数组,由数组实现。
Vector的数据结构和ArrayList差不多,它包含了3个成员变量:elementData , elementCount, capacityIncrement。
(01) elementData 是”Object[]类型的数组”,它保存了添加到Vector中的元素。elementData是个动态数组,如果初始化Vector时,没指定动态数组的>大小,则使用默认大小10。随着Vector中元素的增加,Vector的容量也会动态增长。capacityIncrement是与容量增长相关的增长系数;
(02) elementCount 是动态数组的实际大小。
(03) capacityIncrement 是动态数组的增长系数。如果在创建Vector时,指定了capacityIncrement的大小;则,每次当Vector中动态数组容量增加时>,增加的大小都是capacityIncrement。

Stack
Stack是继承于Vector(矢量队列)的;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值