ArrayList
- ArrayList是List线性表的顺序实现
- 如名字般,底层采用数组(Array)来保存每个集合元素
- 所以当使用get(int index)检索元素时效率最高
- 当加入元素时要注意的点:
- 1.保证ArrayList底层封装数组长度大于集合元素的个数
- (否则ArrayList将创建一个为原来1.5倍的新数组,并且将原来数组元素“集体搬家”到新数组,
- 再由垃圾回收机制回收原有数组,系统开销大)
- 2.插入位置之后所有元素集体向后移动一格;(数组大小固定的原因)
- 删除元素:
- 也是全部都要移动,但和加入不同的一点在于,
- 不用考虑改变底层数组的长度
- 使用迭代器(Iterator)需要注意:
- 当检索到倒数第二个元素时才能使用remove()删除元素
- 三个构造方法:
- ArrayList() 初始容量为10的空列表
- ArrayList(Collection e) 含有指定元素的列表
- Arraylist(int n) 指定大小的空列表
- 常用方法:
- 自己写一点增删改查
-
具体看API
LinkedList和ArrayList的区别
- LinkedList是List和Deque接口的实现,采用链式存储的线性表
- 所以可以将LinkedList当成栈,队列,双向链表使用(Deque带表双端队列,
- 既具有队列特征,也具有栈的特征)
- 这里主要讲讲LinkedList和ArrayList区别和对应的应用场景
- 它增加元素add(int index ,E element)是由:
- entry(int index):搜索制定索引处的元素
- addBefore(E element,Entry ref):在ref节点之前插入element的新节点
- 这就表明在增添元素时总需要检索对应元素的位置,增加了系统开销
- 检索get(),romove(int index)同理需要检索
- 但如果使用addFirst(E element),addLast(E e),getFirst(),getLast()
- offer(E e),offerFirst(),offerLast();这些方法效率非常高
- 迭代器删除时:当检索到最后一个元素时才可以使用remove()等方法删除;
- ArrayList和LinkedList使用场景
- 大部分情况,ArrayList性能优于LinkedList
- 但如果程序中经常要使用add()方法向集合加入元素时,则应该考虑LinkedList()
部分代码实现
public class ArrayListTest {
public static void main(String[] args) {
ArrayList al1 = new ArrayList();
ArrayList al2 = new ArrayList();
//add(e)添加元素
al1.add("兰博基尼 num-1");
//add(int index,e)指定位置添加元素
al1.add(1, "保时捷 num-2");
for(int i=0;i<3;i++)
{
al2.add("al2的元素:"+(i+1));
}
al1.addAll(al2);
System.out.println(al1);
System.out.println("查找第二个元素!");
//get();
System.out.println(al1.get(1));
System.out.println("删除al1的第四个元素和第五个元素");
//remove(E e)和remove(int index)
al1.remove("al2的元素:2");
al1.remove(al1.size()-1);
System.out.println("----------------------");
System.out.println(al1);
System.out.println("----------------------");
System.out.println("使用迭代器输出和删除元素");
Iterator<String> it = al1.iterator();
for(;it.hasNext();)
{
String str = it.next();
if("保时捷 num-2".equals(str))
{
al1.remove(0);
}
//此时会输出 java.util.ConcurrentModificationException的错误
// if("兰博基尼 num-1".equals(str))
// {
// al1.remove(0);
// }
}
System.out.println(al1);
}
}