首先看这两类都实现List接口,而List接口一共有三个实现类,分别是ArrayList、Vector和LinkedList。List用于存放多个元素,能够维护元素的次序,并且允许元素的重复。3个具体实现类的相关区别如下:

  1. ArrayList是最常用的List实现类,内部是通过数组实现的,它允许对元素进行快速随机访问。数组的缺点是每个元素之间不能有间隔,当数组大小不满足时需要增加存储能力,就要讲已经有数组的数据复制到新的存储空间中。当从ArrayList的中间位置插入或者删除元素时,需要对数组进行复制、移动、代价比较高。因此,它适合随机查找和遍历,不适合插入和删除。
  2. Vector与ArrayList一样,也是通过数组实现的,不同的是它支持线程的同步,即某一时刻只有一个线程能够写Vector,避免多线程同时写而引起的不一致性,但实现同步需要很高的花费,因此,访问它比访问ArrayList慢。
  3. LinkedList是用链表结构存储数据的,很适合数据的动态插入和删除,随机访问和遍历速度比较慢。另外,他还提供了List接口中没有定义的方法,专门用于操作表头和表尾元素,可以当作堆栈、队列和双向队列使用。

关于ArrayList和Vector区别如下:

  1. ArrayList在容量不够时默认是扩展50% ,Vector是默认扩展1倍。
  2. Vector提供indexOf(obj, start)接口,ArrayList没有。
  3. Vector属于线程安全级别的,但是大多数情况下不使用Vector,因为线程安全需要更大的系统开销。

查看Java源代码,发现当数组的大小不够的时候,需要重新建立数组,然后将元素拷贝到新的数组内,ArrayList和Vector的扩展数组的大小不同。

ArrayList: Jdk 1.8

  1. import java.util.Arrays;
  2.  
  3. /**
  4. * Created by sheting on 10/22/2017
  5. */
  6. public class ReadSrcCodeArrayList<E> {
  7.  
  8. private int size;
  9. private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
  10. transient Object[] elementData;
  11. private static final int DEFAULT_CAPACITY = 10;
  12. transient int modCount = 0;
  13. private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
  14.  
  15. public ReadSrcCodeArrayList() {
  16. this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
  17. }
  18.  
  19. public boolean add(E e) {
  20. ensureCapacityInternal(size + 1);
  21. elementData[size++] = e;
  22. return true;
  23. }
  24.  
  25. private void ensureCapacityInternal(int minCapacity) {
  26. if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
  27. minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity); //默认ArrayList的容量为10
  28. }
  29. ensureExplicitCapacity(minCapacity);
  30. }
  31.  
  32. private void ensureExplicitCapacity(int minCapacity) {
  33. modCount++;
  34. if (minCapacity - elementData.length > 0)
  35. grow(minCapacity);
  36. }
  37.  
  38. private void grow(int minCapacity) {
  39. int oldCapacity = elementData.length;
  40. // >> 向右移动一位 相当于除以2, 因此ArrayList每次在原有的基础上增加一半
  41. int newCapacity = oldCapacity + (oldCapacity >> 1);
  42. if (newCapacity - minCapacity < 0)
  43. newCapacity = minCapacity;
  44. if (newCapacity - MAX_ARRAY_SIZE > 0)
  45. newCapacity = hugeCapacity(minCapacity);
  46. elementData = Arrays.copyOf(elementData, newCapacity);
  47. }
  48.  
  49. private static int hugeCapacity(int minCapacity) {
  50. if (minCapacity < 0) // overflow
  51. throw new OutOfMemoryError();
  52. return (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE;
  53. }
  54. }

Vector:  Jdk 1.8

  1. import java.util.Ar    rays;
  2.  
  3. /**
  4. * Created by sheting on 10/22/2017
  5. */
  6. public class ReadSrcCodeVector<E> {
  7. protected Object[] elementData;
  8. protected int capacityIncrement;
  9. private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
  10. protected transient int modCount = 0;
  11. protected int elementCount;
  12.  
  13. public ReadSrcCodeVector() {
  14. this(10); //默认容量是10
  15. }
  16.  
  17. public ReadSrcCodeVector(int initialCapacity) {
  18. this(initialCapacity, 0);
  19. }
  20.  
  21. public ReadSrcCodeVector(int initialCapacity, int capacityIncrement) {
  22. if (initialCapacity < 0)
  23. throw new IllegalArgumentException("Illegal Capacity: " + initialCapacity);
  24. this.elementData = new Object[initialCapacity];
  25. this.capacityIncrement = capacityIncrement;
  26. }
  27.  
  28. public synchronized boolean add(E e) {
  29. modCount++;
  30. ensureCapacityHelper(elementCount + 1);
  31. elementData[elementCount++] = e;
  32. return true;
  33. }
  34.  
  35. private void ensureCapacityHelper(int minCapacity) {
  36. if (minCapacity - elementData.length > 0)
  37. grow(minCapacity);
  38. }
  39.  
  40. private void grow(int minCapacity) {
  41. int oldCapacity = elementData.length;
  42. // 原来的基础上扩大一倍
  43. int newCapacity = oldCapacity + ((capacityIncrement > 0) ? capacityIncrement : oldCapacity);
  44. if (newCapacity - minCapacity < 0)
  45. newCapacity = minCapacity;
  46. if (newCapacity - MAX_ARRAY_SIZE > 0)
  47. newCapacity = hugeCapacity(minCapacity);
  48. elementData = Arrays.copyOf(elementData, newCapacity);
  49. }
  50.  
  51. private static int hugeCapacity(int minCapacity) {
  52. if (minCapacity < 0) // overflow
  53. throw new OutOfMemoryError();
  54. return (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE;
  55. }
  56. }

Java 中 Vector 和 ArrayList 的区别的更多相关文章

  1. Java中Vector和ArrayList的区别

    首先看这两类都实现List接口,而List接口一共有三个实现类,分别是ArrayList.Vector和LinkedList.List用于存放多个元素,能够维护元素的次序,并且允许元素的重复.3个具体 ...

  2. 【转】Java中Vector和ArrayList的区别

    首先看这两类都实现List接口,而List接口一共有三个实现类,分别是ArrayList.Vector和LinkedList.List用于存放多个元素,能够维护元素的次序,并且允许元素的重复.3个具体 ...

  3. Java 中 Vector、ArrayList、List 使用深入剖析

    线性表,链表,哈希表是常用的数据结构,在进行Java开发时,JDK已经为我们提供了一系列相应的类来实现基本的数据结构.这些类均在java.util包中.本文试图通过简单的描述,向读者阐述各个类的作用以 ...

  4. java中vector、ArrayList、LinkedList的区别

    转 首先看这两类都实现List接口,而List接口一共有三个实现类,分别是ArrayList.Vector和LinkedList.List用于存放多个元素,能够维护元素的次序,并且允许元素的重复.3个 ...

  5. Java 中 Vector、ArrayList、List 使用深入剖析【转载】

    线性表,链表,哈希表是常用的数据结构,在进行Java开发时,JDK已经为我们提供了一系列相应的类来实现基本的数据结构.这些类均在java.util包中.本文试图通过简单的描述,向读者阐述各个类的作用以 ...

  6. Java中Vector与ArrayList的差别具体解释

    首先看这两类都实现List接口,而List接口一共同拥有三个实现类.各自是ArrayList.Vector和LinkedList.List用于存放多个元素,可以维护元素的次序,而且同意元素的反复. 3 ...

  7. Java中List和ArrayList的区别(转)

    List是一个接口,而ListArray是一个类.  ListArray继承并实现了List.  所以List不能被构造,但可以向上面那样为List创建一个引用,而ListArray就可以被构造.  ...

  8. JAVA中 List和ArrayList的区别

    List是一个接口,而ListArray是一个类.  ListArray继承并实现了List.  所以List不能被构造,但可以向上面那样为List创建一个引用,而ListArray就可以被构造.  ...

  9. Java 中 LinkedList 和 ArrayList 的区别

    引自:https://www.cnblogs.com/huzi007/p/5550440.html ArrayList和LinkedList的大致区别如下:1.ArrayList是实现了基于动态数组的 ...

随机推荐

  1. Java入门系列-23-NIO(使用缓冲区和通道对文件操作)

    NIO 是什么 java.nio全称java non-blocking(非阻塞) IO(实际上是 new io),是指jdk1.4 及以上版本里提供的新api(New IO) ,为所有的原始类型(bo ...

  2. YII2应用结构

    应用中最重要的目录和文件(假设应用根目录是 basic): 一般来说,应用中的文件可被分为两类:在 basic/web 下的和在其它目录下的.前者可以直接通过 HTTP 访问(例如浏览器),后者不能也 ...

  3. Firebird hash join

    Firebird 现可支持哈希连接(hash join),各中大型数据库,哈希连接已成为平常,相对于循环嵌套连接(Nested Loop Join),在数据量较大的情况下,哈希连接性能较好. 由于 F ...

  4. SQL 除去回车符 除去空格符

    update table set fa=replace(fa,chr(13),'') ; --- 除去回车符 update table set fa=replace(fa,' ','') ; --- ...

  5. Make sure that the controller has a parameterless public constructor.

    An error occurred when trying to create a controller of type 'CCD.Web.Controllers.TWAccountControlle ...

  6. lib 和 dll

    dll 和 lib只有在windows平台才会出现,老是忘记他们的区别和联系,记录一下,以备不时之需,也加深一下印象.  在弄懂两者的区别之前,需要知道两个概念: static library 和 d ...

  7. JS原生隐藏显示图片,点击切换图片的效果

    今天要说的内容,看标题就都能知道了!所有知识点一览无遗啊!咱们今天的东西,是纯纯的原生JS代码, 我先说一下要求, 1.有两个按钮,内容为显示,和换, 2.当点击显示的时候,按钮文字变成隐藏,同时图片 ...

  8. 在IIS中浏览网站时出现:无法打开登录所请求的数据库 "***",登录失败

    在IIS中发布Web应用程序后,浏览网站时出现无法打开登录所请求的数据库 "***",登录失败错误,如下图所示: 解决办法:打开系统Web.Config配置文件,查看数据库连接串是 ...

  9. 24_BlockingQueue接口

    [BlockingQueue常见] [ ArrayBlockingQueue ] 基于数组的阻塞队列的实现,在ArrayBlockingQueue内部,维护了一个定长数组,以便缓存队列中的数据对象,其 ...

  10. 如何定位 Node.js 的内存泄漏

    基础知识 Node.js 进程的内存管理,都是有 V8 自动处理的,包括内存分配和释放.那么 V8 什么时候会将内存释放呢? 在 V8 内部,会为程序中的所有变量构建一个图,来表示变量间的关联关系,当 ...