黑马程序员技术交流社区

标题: 有关于List的的三个子类的具体使用场景 [打印本页]

作者: ID1003    时间: 2014-5-17 20:15
标题: 有关于List的的三个子类的具体使用场景
本帖最后由 ID1003 于 2014-5-18 17:11 编辑

ArrayList,Vector,LinkedList 都是List的子类,而且也有好多相同的方法,但是在以后的开发中,怎么才能知道到底应该用哪一个子类呢?
作者: 小周务商    时间: 2014-5-17 20:28
ArrayList是基于数组的数据结构的,查询快,增删慢。
LinkedList。是基于链表的数据结构的,增删快,查询慢。
一般开发中就是看需求来使用。
ArrayList,使用比较多一些。
作者: 张斌    时间: 2014-5-17 21:31
List:有序(元素存入集合的顺序和取出的顺序一致),元素都有索引。元素可以重复。
        |--ArrayList:底层的数据结构是数组,线程不同步,ArrayList替代了Vector,查询元素的速度非常快。
        |--LinkedList:底层的数据结构是链表,线程不同步,增删元素的速度非常快。
        |--Vector:底层的数据结构就是数组,线程同步的,Vector无论查询和增删都巨慢。

作者: 张百振    时间: 2014-5-17 21:36
      你好,今天刚刚学完List体系,正好自己总结一下,也希望能够帮到你,我先简单列一下以后常用的几个方法,再简单说一下他们的数据结构,然后再举个例字,你就会明白了

|--List 常用方法
      add(int index,Object obj),添加指定的元素到指定索引处
      get(int index),获取指定索引处的元素
      indexOf(Object obj),返回指定元素在集合中第一次出现的索引值,如果不存在,返回-1
      set(int index,Object obj)设置指定索引处的值(也就是替换),返回的是被替换掉的元素
      listIterator(),List特有的迭代器
      subList(int start,int end),截取指定区间的元素
      remove(int index)移除指定索引处的元素,返回的是被移除的元素

|--ArrayList 特殊方法几乎没有
            
|--LinkedList
      addFirst,添加指定元素到当前集合第一个位置
      addLast添加指定元素到当前集合的最后位置
      removeFirst,移除第一个元素
      removeLast,移除最后一个元素
      getFirst,获取集合第一个元素
      getLast,获取元素最后一个元素
                  下面方法JDK6以后被替代了(不用看)
                  offerFirst,offerLast,pollFirst,pollLast,peekFirst,peekLast
|--Vector
      addElement(Object obj),添加指定元素到当前集合第一个位置
      elements() 暂时不用掌握
      首先说数据结构:
      ArrayList和Vector底层都是以数组的形式实现的
      LinkedList底层是以链表的形式实现的
     几种数据结构:
     A:栈 先进后出 Stack(就像是一个只能单人通过的死胡同,第一个进去的只能最后一个出来)


     B:队列 先进先出 Queue(就像是排队买火车票,排在前边的人肯定比排在后边的人先买到票)

     C:数组 查询效率高.增删慢(就像是基本的数组一样,每个元素都有自己的下标,查询只需要按照下标寻找即可)
这个就不再弄图啦
     D:链表 查询效率低.增删快(就像是去某个地方倒公交车一样,你到达不了下一站就没办法到达下一站能去到的地方)

      特点
      A:ArrayList
            底层数据结构是数组,查询快,增删慢。
            线程不安全,效率高。
            轻量级(版本高)
        B:Vector
            底层数据结构是数组,查询快,增删慢。
            线程安全,效率低。
            
重量级(版本低)      
       C:LinkedList
            底层数据结构是链表,查询慢,增删快。
            线程不安全,效率高。

      那么,究竟用谁呢?
      看需求:
      是否要安全:
            是:Vector
            否:ArrayList或者LinkedList   
                查询多:ArrayList
                就像上课用的课表,可以每个人都标上各自标号,因为平时一个班的人不会经常添加或走
                增删多:LinkedList
        如果你什么都不懂,那么就用ArrayList。
      还有几个经典的面试题:
      选择题:如果在实际开发中让你自己做一个栈,你会通过哪种方式实现?
      A.java.util.Stack(javaAPI中提供的栈)
      B.数组
      C:LinkedList
      答案是: C
      我们可以用java提供给我们的现成的栈去当我们自己的类的属性,这样就可以屏蔽掉那些自己不想用的方法,而只用对自己有用的方法,在外界是看不到我们具体方法的实现的.代码如下:
import java.util.Stack;
public  MyStack{
    //成员变量
    private Stack st;
   //构造方法
    public MyStack(){
        Stack st = new Stack();
}//将java提供给我们的Stack作为我的属性,这样就可以用对我们有用的方法   
    public Object pop(){//
移除堆栈顶部的对象,并作为此函数的值返回该对象。
        return st.pop;
    }
    public Object push(
Object o){//把项压入堆栈顶部。
        st.push(Object o);
    }
}
      原因是: A
它继承了Vector,就是继承了它的数组实现形式,这并不是重要的,关键是他也继承了Vector的所有不是私有的方法,这些方法中有好多是不适用与栈的,比如可以随意的插入元素,那么就违反了栈的原则
                         B:自己数组实现太麻烦,而且开发中不可能用数组自己实现
         给你说这么多就是现在我们还不太清楚具体该用什么集合,只需要记住他的原则就行了,到了实际开发的时候,自己经历了也就慢慢的明白了,有些事就是这样,不用去纠结到底怎么样,只需要记住原则,慢慢的就明白了
        这个题很有用的哦,原因记住吧,希望能帮到你哈



作者: 墨香    时间: 2014-5-17 23:53
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,因此必须捕获该异常。


作者: tangliping    时间: 2014-6-28 02:12
vector可以保证线程安全,它加入了同步机制,但效率相对较低,arraylist则不能保证线程安全,属于异步,效率较高
作者: tangliping    时间: 2014-6-28 02:21
vector可以保证线程安全,它加入了同步机制,但效率相对较低,arraylist则不能保证线程安全,属于异步,效率较高
作者: Alan_Kwan    时间: 2014-6-28 02:41
如果真的想知道什么时候怎么用,可以看一下它们的源码,我看过,是比较简单易懂的。看了之后你就会知道为什么它们各自的优缺点,然后自然就知道什么情况该用什么的了。




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