ArrayList 的相关知识

public class ArrayList<E> extends AbstractList<E>implements List<E>, RandomAccess, Cloneable, java.io.Serializable

由上面源码可知,Arraylist继承自AbstractList 实现了List ,Cloneable,Serializable,RandomAccess接口.其中Cloneable是克隆接口,Serializable是实现序列化操作的接口,便于对象的传输。而今天重点要描述一下这个RandomAccess。

RandomAccess接口是一个标记接口,实现了它的list集合支持随机访问,目的是是算法在随机和随机访问时显得更灵活。在collections的 binarySearch源码如下

public static <T>
int binarySearch(List<? extends Comparable<? super T>> list, T key) {
if (list instanceof RandomAccess || list.size()<BINARYSEARCH_THRESHOLD)
return Collections.indexedBinarySearch(list, key);
else
return Collections.iteratorBinarySearch(list, key);
}

我们可以看到,他首先会判断这个list是否实现了RandomAccess接口,如果这个条件和list.size()<BINARYSEARCH_THRESHOLD(其中: BINARYSEARCH_THRESHOLD Collections的一个常量(5000),它是二分查找的阀值。)满足其中任何一个则使用Collections的indexedBinarySearch(list,key)方法。否则会调用Collections.iteratorBinarySearch(list,key)方法。

这两者的代码实现分别如下:

indexedBinarySearch 方法:

  1. private static <T>
  2. int indexedBinarySearch(List<? extends Comparable<? super T>> list, T key) {
  3. int low = 0;
  4. int high = list.size()-1;
  5. while (low <= high) {
  6. int mid = (low + high) >>> 1;
  7. Comparable<? super T> midVal = list.get(mid);
  8. int cmp = midVal.compareTo(key);
  9. if (cmp < 0)
  10. low = mid + 1;
  11. else if (cmp > 0)
  12. high = mid - 1;
  13. else
  14. return mid; // key found
  15. }
  16. return -(low + 1);  // key not found
  17. }

indexedBinarySearch 方法是直接通过get来访问元素

iteratorBinarySearch方法

  1. private static <T>
  2. int iteratorBinarySearch(List<? extends Comparable<? super T>> list, T key)
  3. {
  4. int low = 0;
  5. int high = list.size()-1;
  6. ListIterator<? extends Comparable<? super T>> i = list.listIterator();
  7. while (low <= high) {
  8. int mid = (low + high) >>> 1;
  9. Comparable<? super T> midVal = get(i, mid);
  10. int cmp = midVal.compareTo(key);
  11. if (cmp < 0)
  12. low = mid + 1;
  13. else if (cmp > 0)
  14. high = mid - 1;
  15. else
  16. return mid; // key found
  17. }
  18. return -(low + 1);  // key not found
  19. }

iteratorBinarySearch中ListIterator来查找相应的元素

在javadoc中指出人们认识到随机存取和顺序存取之间的区别通常是模糊的。例如,一些列表实现提供了渐进的线性访问时间,如果它们在实践中获得了巨大的、但持续的访问时间。这种接口通常应该实现这个接口。根据经验,列表实现应该实现这个接口,如果对于类的典型实例,这个循环:

for (int i=0, n=list.size(); i < n; i++)
list.get(i);

runs faster than this loop:

     for (Iterator i=list.iterator(); i.hasNext(); )
i.next();
也就是说实现RandomAccess接口的的List可以通过简单的for循环来访问数据比使用iterator访问来的高效快速。
回过头来,我们再说说ArrayList,

{
private static final long serialVersionUID = 8683452581122892189L;

/**
* The array buffer into which the elements of the ArrayList are stored.
* The capacity of the ArrayList is the length of this array buffer.
*/
private transient Object[] elementData;   //ArrayList的底层是一个基数组。

/**
* The size of the ArrayList (the number of elements it contains).
*
* @serial
*/
private int size;

/**
* Constructs an empty list with the specified initial capacity.
*
* @param initialCapacity the initial capacity of the list
* @exception IllegalArgumentException if the specified initial capacity
* is negative
*/
public ArrayList(int initialCapacity) {
super();
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
this.elementData = new Object[initialCapacity];
}

/**
* Constructs an empty list with an initial capacity of ten.
*/
public ArrayList() {
this(10);    //默认的初始大小为10.

}

public void ensureCapacity(int minCapacity) {  //给定所需的最小容量
modCount++;
int oldCapacity = elementData.length;    //原来数组中的元素大小
if (minCapacity > oldCapacity) {//如果所需的最小容量大于 原数组中数据的个数时。
Object oldData[] = elementData;
int newCapacity = (oldCapacity * 3)/2 + 1;  //则要对旧的数组进行扩容,新数组的容量为原来的1.5倍+1
if (newCapacity < minCapacity)//如果新的容量还是小于最小需求的容量,则将最小需求容量赋给新容量。
newCapacity = minCapacity;
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);//在将就数组中的元素拷贝到新的容量数组中
}
}

LinkedList 的相关知识

public class LinkedList<E>extends AbstractSequentialList<E>implements List<E>, Deque<E>, Cloneable, java.io.Serializable

public LinkedList() {
header.next = header.previous = header;
}

它的增添方法常用的是add(),删除常用的方法是remove(),它的底层是一个双向链表。

对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。

对于增添与删除add和remove,ArrayList需要挪动数据,除非是在数组末尾,需要消耗一定的时间,而LinkedList便可以很轻易地做到。

总结ArrayList 和LinkedList的区别:

1.两者继承的基类不一样。ArrayList 继承自AbstractList,而LinkedList继承自 AbstractSequentialList。

2.底层结构不一样。ArrayList 采用的是动态数组,而LinkedList采用的是双向链表。

3.ArrayList实现了RandomAccess接口,所以在随机访问时效率比较高。而LinkedList需要不停地移动指针。

4.对于增添与删除add和remove,ArrayList需要挪动数据,除非是在数组末尾,需要消耗一定的时间,而LinkedList便可以很轻易地做到。

5。ArrayList 默认初始容量是10,扩容时扩容它旧容量的1.5倍加1.

ArrayList 和 LinkList 的区别的更多相关文章

  1. Java:List,ArrayList和LinkList的区别

    1.大学数据结构中ArrayList是实现了基于动态数组的数据结构,LinkList基于链表的数据结构 2.对于随机访问get和set,ArrayList优于LinkList,因为LinkedList ...

  2. ArrayList和LinkList的区别

    底层实现区别 ArrayList 底层实现就是数组,且ArrayList实现了RandomAccess,表示它能快速随机访问存储的元素,通过下标 index 访问,只是我们需要用 get() 方法的形 ...

  3. List和ArrayList,LinkList的区别

    接口 List<E> 是一个接口: ArrayList<E> 是一个类:是一个实现了List接口的类,因此可以List里面定义的所有的方法都实现了. 1.ArrayList是实 ...

  4. Vector/Arraylist与Linklist的区别

        SDK提供了有序集合接口java.util.List的几种实现,其中三种最为人们熟知的是Vector.ArrayList和    LinkedList.有关这些List类的性能差别是一个经常被 ...

  5. ArrayList和LinkList区别

    ArrayList和LinkList区别 前者是数组的数据结构,后者是链表的数据结构 前者应用于排序和查找,后者应用于插入删除

  6. [置顶] Array ArrayList LinkList的区别剖析

    这是一个面试中我们经常被问到的问题 Array.ArrayList.LinkList之间的区别:Array.ArrayList.LinkList均属于泛型的范畴,都用来存放元素,主要区别是Array是 ...

  7. Android——ArrayList 、LinkList、List 区别 & 迭代器iterator的使用 & HashMap、Hashtable、LinkedHashMap、TreeMap

     ArrayList .LinkList.List 区别 & 迭代器iterator的使用 & HashMap.Hashtable.LinkedHashMap.TreeMap 一.几个 ...

  8. Java集合(2)一 ArrayList 与 LinkList

    目录 Java集合(1)一 集合框架 Java集合(2)一 ArrayList 与 LinkList Java集合(3)一 红黑树.TreeMap与TreeSet(上) Java集合(4)一 红黑树. ...

  9. 面试题——ArrayList和LinkedList的区别

    List概括 先回顾一下List在Collection的框架图: 从图中可以看出: List是一个接口,他继承Collection接口,代表有序的队列. AbstractList是一个抽象类, ,它继 ...

随机推荐

  1. Python学习(四十一)—— Djago进阶

    一.分页 Django的分页器(paginator) view from django.shortcuts import render,HttpResponse # Create your views ...

  2. vue-cli按需加载,懒加载组件

    vue来做一个单页面应用,当我们的项目越来越大,组件越来越多的时候,首次启动项目户特别慢,就算做一个加载框,蒙层之类的,体验也不会好,这个时候就需要按需加载 1.什么叫按需加载 所谓按需加载,顾名思义 ...

  3. Servlet(六):Cookie

    Cookie 学习:问题: HTTP 协议是没有记忆功能的,一次请求结束后,相关数据会被销毁.如果第二次的请求需要使用相同的请求数据怎么办呢?难道是让用户再次请求书写吗?解决: 使用 Cookie 技 ...

  4. 20172328 暑假作业 之 实现安卓小程序Enjoy-all

    20172328 暑假作业 之 实现安卓小程序Enjoy-all 项目介绍 项目名称: Enjoy - all 项目简介: 本项目基于Java语言和Anroid Studio软件,实现了简单的冒泡.屏 ...

  5. GG的文化课

    attack大神退役后,我连文化课都被吊打了 attack:我要回来虐你们了 attack:怎么感觉能裸分清北呢 attack:我稳了 attack:你们个菜鸡,连bed和bad怎么读都不知道

  6. django——url(路由)配置

    URL是Web服务的入口,用户通过浏览器发送过来的任何请求,都是发送到一个指定的URL地址,然后被响应. 在Django项目中编写路由,就是向外暴露我们接收哪些URL的请求,除此之外的任何URL都不被 ...

  7. DAY01-Python入门学习-计算机硬件

    一.Python是编程语言 语言: 一种事物与另外一种事物沟通的介质所以说编程语言是程序员与计算机沟通的介质 什么是编程: 就是程序员用计算机所能理解的表达方式(编程语言)把自己的思维逻辑写下来,编程 ...

  8. Python 遇到的坑

    1. 循环导入 AB 互相引用,或者 中间掺入了更复杂的一些--用局部导入解决

  9. Golang 微框架 Gin 简介

    框架一直是敏捷开发中的利器,能让开发者很快的上手并做出应用,甚至有的时候,脱离了框架,一些开发者都不会写程序了.成长总不会一蹴而就,从写出程序获取成就感,再到精通框架,快速构造应用,当这些方面都得心应 ...

  10. (66)Wangdao.com第十一天_JavaScript 数组Array

    数组 Array 本质上,数组属于一种特殊的对象.typeof 运算符会返回数组的类型是 object 数组的特殊性体现在,它的键名是按次序排列的一组整数(0,1,2...) // Object.ke ...