博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
源码分析三(Vector与ArrayList的区别)
阅读量:7207 次
发布时间:2019-06-29

本文共 2822 字,大约阅读时间需要 9 分钟。

 前面讨论过ArrayList与LinkedList的区别,ArrayList的底层数据结构是数组Object[],而LinkedList底层维护

的是一个链表Entry,所以对于查询,肯定是ArrayList的效率高,但是对于删除和插入则是LinedList效率高。

现在我们再来看看Vector与ArrayList的区别,直接上源码,ArrayList源码:

1:扩容方面,ArrayList扩容扩原来容量的2/3+1,而Vector扩容为原来容量的2倍

1 public void ensureCapacity(int minCapacity) { 2     modCount++;     //容器中元素的数量 3     int oldCapacity = elementData.length; 4     if (minCapacity > oldCapacity) { 5         Object oldData[] = elementData;       //新的容量 6         int newCapacity = (oldCapacity * 3)/2 + 1; 7             if (newCapacity < minCapacity) 8         newCapacity = minCapacity; 9             // minCapacity is usually close to size, so this is a win:10             elementData = Arrays.copyOf(elementData, newCapacity);11     }12     }

 

2:Vector源码

1  private void ensureCapacityHelper(int minCapacity) { 2     int oldCapacity = elementData.length; 3     if (minCapacity > oldCapacity) { 4         Object[] oldData = elementData; 5         int newCapacity = (capacityIncrement > 0) ? 6         (oldCapacity + capacityIncrement) : (oldCapacity * 2); 7             if (newCapacity < minCapacity) { 8         newCapacity = minCapacity; 9         }10             elementData = Arrays.copyOf(elementData, newCapacity);11     }12     }

默认创建的Vector对象new Vector(); 默认

capacityIncrement = 0
1  public Vector() {2     this(10);3     }

调一个参数的构造方法:

1  public Vector(int initialCapacity) {2     this(initialCapacity, 0);3     }

默认增长容量为0

调用两个参数的构造方法:

1   public Vector(int initialCapacity, int capacityIncrement) {2     super();3         if (initialCapacity < 0)4             throw new IllegalArgumentException("Illegal Capacity: "+5                                                initialCapacity);6     this.elementData = new Object[initialCapacity];7     this.capacityIncrement = capacityIncrement;8     }

所以

int newCapacity = (capacityIncrement > 0) ?         (oldCapacity + capacityIncrement) : (oldCapacity * 2);

新的容量扩展到原来的2倍。

 

再来看它们的另外一个区别,ArrayList类中的方法都是没有synchronized修饰的,所以都是非线程安全的,

获取集合中元素数量:

1  public int size() {2     return size;3     }

 

判断集合是否为空:

1  public boolean isEmpty() {2     return size == 0;3     }
1   public boolean contains(Object o) {2     return indexOf(o) >= 0;3     }

。。。。。

再来看看Vector类,方法都是由synchronized修饰,所以是线程安全的,万事都是有利有弊,线程安全的处理数据效率会低,而线程非安全的处理

数据效率相对高一些:

1 public synchronized void setSize(int newSize) { 2     modCount++; 3     if (newSize > elementCount) { 4         ensureCapacityHelper(newSize); 5     } else { 6         for (int i = newSize ; i < elementCount ; i++) { 7         elementData[i] = null; 8         } 9     }10     elementCount = newSize;11     }

 

1 public synchronized int capacity() {2     return elementData.length;3     }
1   public synchronized int size() {2     return elementCount;3     }

 

1   public synchronized boolean isEmpty() {2     return elementCount == 0;3     }

。。。。。。

转载地址:http://qroum.baihongyu.com/

你可能感兴趣的文章
tomcat之 JDK8.0安装、tomcat-8.5.15安装
查看>>
Android ADB命令
查看>>
Java调用Lua脚本(热载实现)
查看>>
排除“使用主题 css 文件要求页上有标头控件。(例如 <head runat="server" />)”错误...
查看>>
jdk1.7的新特性
查看>>
关注一下IBM工具
查看>>
JS 英文不截断单词截取
查看>>
Oracle 数据定义
查看>>
百度分享自定义内容和图片
查看>>
关于代码评审的微博讨论汇集
查看>>
PHP vs Java
查看>>
C# 连接SQL Server数据库的几种方式--server+data source等方式
查看>>
Qt控件中的属性sizePolicy说明
查看>>
针对Properties中实时性要求不高的配置参数,用Java缓存起来
查看>>
Flex读取txt文件里的内容(二)
查看>>
mysql 变量set
查看>>
Deep Learning(深度学习)学习笔记整理系列
查看>>
【C解毒】缘木求鱼
查看>>
lua对模块接口扩展的一种方法
查看>>
DB,Cache和Redis应用场景分析
查看>>