`

List 接口有两个实现类,ArrayList 与LinkedList该如何选择

 
阅读更多
List 接口有两个实现类,ArrayList 与LinkedList
如果排序用ArrayList 如果经常删写改 操作用 LinkedList,为什么会有这样一说法呢,我们从两个类的源码来分析。
ArrayList:
 数据存储类型是:
private transient Object[] elementData;//就是一个普通的对象数据。
 public boolean add(E e) {//增加对象的方法,可以看出是把数组的大小改变为size+1,然后把老的对象数据复制到新的对象数据
    ensureCapacity(size + 1);  // Increments modCount!!
    elementData[size++] = e;//最后把新添加进来的值放到最后一个位置
    return true;
    }

 public void add(int index, E element) {   //从index开始把位置往后移一位,所以效率会比较低

 

    if (index > size || index < 0)

 

        throw new IndexOutOfBoundsException(

 

        "Index: "+index+", Size: "+size);

 

 

 

    ensureCapacity(size+1);  // Increments modCount!!

 

    System.arraycopy(elementData, index, elementData, index + 1,

 

             size - index);

 

    elementData[index] = element;

 

    size++;

 

    }

 

 

 

  public E remove(int index) {
    RangeCheck(index);
 
    modCount++;
    E oldValue = (E) elementData[index];
 
    int numMoved = size - index - 1;
    if (numMoved > 0)
        System.arraycopy(elementData, index+1, elementData, index,
                 numMoved);
    elementData[--size] = null// Let gc do its work
 
    return oldValue;
    }
 

LinkedList:

 数据存储类型是:<!--WizRtf2Html Charset=0 -->private transient Entry<E> header = new Entry<E>(nullnullnull);
以对象链表存储数据
  private static class Entry<E> {
    E element;//当前
    Entry<E> next;//下
    Entry<E> previous;//前
        Entry(E element, Entry<E> next, Entry<E> previous) {
        this.element = element;
        this.next = next;
        this.previous = previous;
    }
    }
 
 private Entry<E> addBefore(E e, Entry<E> entry) {//所有的ADD方法都是调用这个,
    Entry<E> newEntry = new Entry<E>(e, entry, entry.previous);
    newEntry.previous.next = newEntry;
    newEntry.next.previous = newEntry;
    size++;
    modCount++;
    return newEntry;
    }
 private E remove(Entry<E> e) {  //删除的话只是把前一个和后一个的对象重新指向一个,然后把当然要删除的对象置为空
    if (e == header)
        throw new NoSuchElementException();
 
        E result = e.element;
    e.previous.next = e.next;
    e.next.previous = e.previous;
        e.next = e.previous = null;
        e.element = null;
    size--;
    modCount++;
        return result;
    }
 

 

所以总结出来,排序用ArrayList(对象数组)   经常删写改 操作用 LinkedList(链表)
分享到:
评论

相关推荐

    java中set、list和map的使用方法实例

    // 常用的list接口的实现类有ArrayList和LinkedList // 学习map对象容器的使用 // map对象容器里面储存的元素是(key,value)形式的键值对,比如(a,1)(b,20)(c,55) // key不可以重复,value可以重复 // 常用的map接口...

    java8源码-csn-list:ArrayList、LinkedList、Vector、Stack源码分析

    List相关实现类的源码解析(JDK1.8) 2018.9.22- List的架构图 ArrayList 继承关系: ArrayList -&gt; AbstractList 实现 List接口 ArrayList 是一个数组队列,相当于 动态数组。与Java中的数组相比,它的容量能动态...

    40道java集合面试题含答案(很全很详细)

    Java集合类是Java.util包中的重要内容,它提供了一套性能优良、使用方便的接口...List接口的实现类包括ArrayList、LinkedList等。 Set接口是无序的集合,元素不能重复。Set接口的实现类包括HashSet、LinkedHashSet等。

    Java面试题,冲冲冲!.rar

    - 常见实现类有ArrayList、LinkedList和Vector等。 2. Set(集合): - 不允许重复元素。 - 不维护元素的插入顺序,元素存储的顺序可能发生变化。 - 提供了高效的查找和去重功能。 - 常见实现类有HashSet、TreeSet和...

    JAVA中List与Set、Map的区别

    1、List,Set,map都是继承自Collection接口,...  3、List接口有三个实现类:LinkedList,ArrayList,Vector ,Set接口有两个实现类:HashSet(底层由HashMap实现),LinkedHashSet  Collection  /   /   / 

    java面试题.docx

    两个对象的 hashCode()相同,则 equals()也一定为 true,对吗? final 在 java 中有什么作用? java 中操作字符串都有哪些类?它们之间有什么区别? 如何将字符串反转? String 类的常用方法都有那些? 接口和抽象...

    java面试宝典

    18、两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对? 9 19、是否可以继承String 类? 9 20、以下二条语句返回值为true 的有: 10 21、当一个对象被当作参数传递到一个方法后,此方法可...

    基础深化和提高-java容器

    在Java中,容器(Container)指的是...Map用于存储键值对(Key-Value Pair)的数据,它的实现类有HashMap、TreeMap、LinkedHashMap等。Map中的键是唯一的,每个键对应一个值。通过键可以快速查找对应的值,这使得Map

    think in java线程和容器2

    java线程中容器使用技术,比如List接口是在Collection的基础上添加了大量方法,有两种基本类型:ArrayList,它擅⻓于随机访问元素,但是List中间插入或移除元 素时较慢;LinkedList,它和ArrayList的特性正好相反。...

    大数据开发成长之路——Java基础(四)

    List被AbstractList实现,然后分为3个子类,ArrayList,LinkedList和VectorList List是一种有序链表,本身是一个泛型接口,元素可以重复,可以是 null 包含以下方法: 遍历List // for循环 List list = ...; for...

    java 面试题 总结

    接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它...

    超级有影响力霸气的Java面试题大全文档

    接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它...

    千方百计笔试题大全

    18、两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对? 9 19、是否可以继承String 类? 9 20、以下二条语句返回值为true 的有: 10 21、当一个对象被当作参数传递到一个方法后,此方法可...

    java基础案例与开发详解案例源码全

    11.3.1 实现类ArrayList277 11.3.2 实现类LinkedList279 11.3.3 实现类Vector281 11.4 Map接口283 11.4.1 实现类HashMap284 11.4.2 实现类LinkedHashMap285 11.4.3 实现类TreeMap286 11.4.4 实现类Properties287 ...

    进销存系统文档作业例子

    接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它...

    GetTestieCollections:编写一些练习Collections类的测试

    对于List接口, ArrayList是最常用的实现。 对于Map接口, HashMap是最常用的实现。 对于Queue接口, LinkedList是最常用的实现。 对于Deque接口, ArrayDeque是最常用的实现。 还包括针对Vecto

    JAVA面试题最全集

    使用StringBuffer类与String类进行字符串连接时有何区别? 57.调用Thread类的destroy()方法有什么后果? 58.多线程,用什么关键字修饰同步方法?stop()和suspend()方法为何不推荐使用? 59.使用socket建立客户端...

    java面试宝典2012版.pdf

    69、两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对? 70、TreeSet里面放对象,如果同时放入了父类和子类的实例对象,那比较时使用的是父类的compareTo方法,还是使用的子类的...

    AIC的Java课程1-6章

     辨别抽象类与接口的异同点。  清楚如何通过向上转型(引用的隐式转型),方法重写,运行期绑定来实现多态性。  体会多态性如何使系统可扩展和可维护。  理解运行时判定引用对象的类型...

Global site tag (gtag.js) - Google Analytics