黑马程序员技术交流社区

标题: 集合区别 [打印本页]

作者: 李红飞    时间: 2012-5-23 09:01
标题: 集合区别
Vector、ArrayList、ArrayLinked 类的作用是什么?它们有什么差别?
作者: 黑马张健    时间: 2012-5-23 09:35
首先,ArrayList、LinkedList、Vector都实现了List接口。(List接口继承了Collection接口)
区别:
1.版本:Vector集合是在JDK1.0的时候出现的。     ArrayList、LinkedList集合是在JDK1.2的时候出现的。
2.数据结构:LinkedList底层用的是链表结构。      ArrayList、Vector:底层用的是数组数据结构。
3.线程方面:LinkedList没有同步方法。   ArrayList是线程不安全的,它的方法之间是线程不同步的。。   Vector是线程安全的,他的方法之间线程是同步的。
4.存储特点:ArrayList与Vector都有一个初始容量,当存储进它们里面的元素的个数超过了容量时,就需要增加ArrayList与Vector的存储空间。
             ArrayList每次增长为原来的0.5倍。Vector每次增长为原来的一倍。
5.操作效率:ArrayList:查询速度快,但是增删稍慢。    LinkedList:增删速度快,查询比较慢。   Vector:增删查都慢。
            一般建议不使用Vector.尽量使用ArrayList.如果需要线程同步,就把ArrayList加上一个同步锁即可。
作者: 张成龙    时间: 2012-5-23 09:59
ArrayList:底层是的数据结构是数组结构。特点:查询速度很快,但是增删稍慢。        线程不同步。
LinkedList:底层是的数据结构是链表结构。特点:增删速度很快,查询速度慢。
Vector:底层是数组数据结构。        线程同步。被ArrayList替代了。

作者: 范家鹏    时间: 2012-5-23 10:49
集合都是存放对象的容器,作用都是存放对象方便操作对象。
LinkedList类
LinkedList实现了List接口,允许null元素。此外LinkedList提供额外的get,remove,insert方法在 LinkedList的首部或尾部。这些操作使LinkedList可被用作堆栈(stack),队列(queue)或双向队列(deque)。
注意LinkedList没有同步方法。如果多个线程同时访问一个List,则必须自己实现访问同步。一种解决方法是在创建List时构造一个同步的List:
List list = Collections.synchronizedList(new LinkedList(...));

ArrayList类
ArrayList实现了可变大小的数组。它允许所有元素,包括null。ArrayList没有同步。
size,isEmpty,get,set方法运行时间为常数。但是add方法开销为分摊的常数,添加n个元素需要O(n)的时间。其他的方法运行时间为线性。
每个ArrayList实例都有一个容量(Capacity),即用于存储元素的数组的大小。这个容量可随着不断添加新元素而自动增加,但是增长算法并没有定义。当需要插入大量元素时,在插入前可以调用ensureCapacity方法来增加ArrayList的容量以提高插入效率。
和LinkedList一样,ArrayList也是非同步的(unsynchronized)。

Vector类
Vector非常类似ArrayList,但是Vector是同步的。由Vector创建的Iterator,虽然和ArrayList创建的 Iterator是同一接口,但是,因为Vector是同步的,当一个Iterator被创建而且正在被使用,另一个线程改变了Vector的状态(例如,添加或删除了一些元素),这时调用Iterator的方法时将抛出ConcurrentModificationException,因此必须捕获该异常。
作者: 康大玮    时间: 2012-5-23 11:00
  |--List:元素是有序的,元素可以重复,因为该集合体系有索引。
       |--ArrayList;底层的数据结构是数组。特点:查询速度很快,但是增删稍慢线程不同不
       |--LinkedList:底层使用数据结构是链表。特点:增删速度很快,查询稍慢。
       |--Vector:底层数据结构是数组。特点:线程同步,被ArrayList取代



List:
    特有方法,凡是可以操作角标的方法都是该体系特有的方法。


   add(index,element);
   addAll(index,Collection);

   remove(index);

   set(index,element);

   get(index);
   subList(from,to);
   listIterator();
   int indexOf(obj)获取指定元素的位置
   ListIterator listIterator();  


List集合特有的迭代器。ListIterator 是Iterator的子接口。
在迭代时,不可以通过集合对象的方法操作集合的元素。因为会发生ConcurrentModificationException异常

所以在迭代时,只能用迭代器的方法操作元素,可是Iterator方法是有限的,
只能对元素进行判断,取出,删除的操作
如果想要其他的操作如添加,修改等,就需要使用其子接口,ListIterator.
该接口只能通过List集合的ListIterator方法获得

LinkedList:特有方法
addFirst();
addLast();

getFirst();
getLast();
获取元素,但是不删除元素。如果集合中没有元素,会出现NoSuchElementException

removeFirst();
removeLast();
获取元素,但是元素被删除。如果集合中没有元素,会出现NoSuchElementException

在JDK1.6出现了代替方法:
offerFirst();
offerLast();

peekFirst();
peekLast();
获取元素,但是不删除元素。如果集合中没有元素,返回null。

pollFirst();
pollLast();
获取元素,但是元素被删除。如果集合中没有元素,返回null。
作者: 黄克帅    时间: 2012-5-23 11:14
Vector 是线程安全的。当需要增长时默认增长为原来的一倍,最底层是通过数组来实现,查询快,增删改慢
ArrayList  线程不安全 ,当需要增长时默认为原来的一半,最底层通过数组来实现,查询快,增删改慢
LinkedList 线程不安全   底层通过双向链表实现 查询慢,增删改快 。 另外LinkedList还提供了额外的get,remove,insert方法。
作者: 胡团乐    时间: 2012-5-23 20:14
Vector、ArrayList、ArrayLinked 类的作用是什么?它们有什么差别?
简单总结下
vector是线程同步安全的 其他两个是不安全的 他是个老集合 里面有个枚举方法 是vector独有的
ArrayList 相对于ArrayLinked 查询速度快 如果不进行大量添加 删除的话
而ArrayLinked 是进行大量添加删除的话相对ArrayList 速度比较快
如果只是添加查询比较频繁建议使用ArrayList比较方便
vector是个老程序员经常使用的集合 如果不是特别需要(比如要使用到枚举)建议一般不使用

作者: 付左军    时间: 2012-5-23 22:51
vector线程安全,速度慢,被ArrayList代替了

作者: 付左军    时间: 2012-5-23 22:52
vector线程安全,速度慢,被ArrayList代替了,
ArrayList线程不安全,但是查询速度快
Linklist,链表结构的,增删速度快




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2