Java中的集合类——ArrayList、LinkedList和Vector
ArrayList:是List接口的大小可变数组的实现,可以不预设长度,根据需要增加长度。当数组长度达到设定值(即使不显示指定长度,也有一个默认的长度),会产生一个新的对象,长度是增加为50%,并把旧数组的元素复制到新数组,这会使得效率比较慢。
LinkedList:是List接口链表的实现,增加、修改以及删除效率比ArrayList高,但是随机访问效率相对低一些。
Vector:是线程安全的动态数组,因为需要同步操作,所以效率不如ArrayList高。当需要扩容时,增加的长度为原来的1倍。
这是这三个类的实现层次:
一、 基本用法
ArrayList
//创建对象
ArrayList<Integer> al = new ArrayList<>();
al.add(1);
al.add(2);
al.add(3);
al.add(3);
al.add(4);
al.add(2);
//获取元素
System.out.println(al.get(0));
//判断元素是否存在
System.out.println(al.contains(1));
//获取元素所在位置
System.out.println(al.indexOf(1));
//是否为空
System.out.println(al.isEmpty());
//移除指定位置的元素
System.out.println(al.remove(1));
//获取元素最后出现的位置
System.out.println(al.lastIndexOf(3));
//移除满足条件的元素
System.out.println(al.removeIf(s -> s%3==0));//lambda表达式
//遍历元素
Iterator<Integer> iterable = al.iterator();
while (iterable.hasNext()){
System.out.println(iterable.next());
}
//排序
al.sort(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1>o2?1:-1;
}
});
al.forEach(s -> System.out.println(s));
LinkedList
LinkedList<Integer> ll = new LinkedList<>();
ll.add(1);
ll.add(2);
ll.add(4);
ll.add(3);
ll.push(5);//头部插入
ll.push(0);
ll.offer(-1);//对于已满队列执行插入操作时返回false而不是抛出异常
System.out.println(ll.toString());
//获取第一个元素
System.out.println("first:"+ll.getFirst());
//获取最后一个元素
System.out.println("last:"+ll.getLast());
//获取队列头部元素并删除,队列为空时删除抛出异常
System.out.println("pop:"+ll.pop());
//获取队列头部元素并删除,队列为空时返回null
System.out.println("poll:"+ll.poll());
//获取队列头部元素,队列为空时返回null
System.out.println("peek:"+ll.peek());
//获取队列头部元素,队列为空时抛出异常
System.out.println("element:"+ll.element());
System.out.println();
System.out.println(ll.toString());
Vector
与ArrayList类似,不过是线程安全的,可以实现同步。
二、 区别与联系
ArrayList和Vector都是对数组的扩展,是可变长的动态数组。在自动扩容时ArrayList扩容原来的50%,Vector扩容为原来的100%。并且ArrayList没有同步,而Vector是线程安全的,所以Vector的效率不如ArrayList。
LinkedList是链表的实现(双向链表),不是线程安全的。因为是链表,所以插入、删除等操作比较高效,而随机访问效率不高。
在需要频繁查询大量数据的情况下,用ArrayList或者Vector;而需要频繁修改数据时则用LinkedList。