Vector源码解析(jdk1.8)
来源:互联网 发布:带着淘宝去古代书包网 编辑:程序博客网 时间:2024/06/14 11:59
概述
Vector实现了List的接口,底层同样是基于数组实现的,可以存储null。功能结构与ArrayList的类似,不同的是线程安全的。
构造函数
protected Object[] elementData;protected int capacityIncrement;public Vector() { this(10);}public Vector(int initialCapacity) { this(initialCapacity, 0);}public Vector(int initialCapacity, int capacityIncrement) { super(); if (initialCapacity < 0) throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity); this.elementData = new Object[initialCapacity]; this.capacityIncrement = capacityIncrement;}
构造函数中,初始化了存储元素的数组elementData和容量增量的值。
添加元素add/addAll
Vector使用add来添加元素:
public synchronized boolean add(E e) { modCount++; ensureCapacityHelper(elementCount + 1); elementData[elementCount++] = e; return true;}private void ensureCapacityHelper(int minCapacity) { // overflow-conscious code if (minCapacity - elementData.length > 0) grow(minCapacity);}private void grow(int minCapacity) { // overflow-conscious code int oldCapacity = elementData.length; int newCapacity = oldCapacity + ((capacityIncrement > 0) ? capacityIncrement : oldCapacity); if (newCapacity - minCapacity < 0) newCapacity = minCapacity; if (newCapacity - MAX_ARRAY_SIZE > 0) newCapacity = hugeCapacity(minCapacity); elementData = Arrays.copyOf(elementData, newCapacity);}private static int hugeCapacity(int minCapacity) { if (minCapacity < 0) // overflow throw new OutOfMemoryError(); return (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE;}
使用add直接添加元素的时候,首先通过ensureCapacityHelper来确认存储元素的数组的容量时候足够。如果不够,则进行grow扩容,增量大小为:(容量增量*数组长度)。确认完容量之后,直接将元素添加到数组后面。
Vector还提供了在指定位置上添加元素:
public void add(int index, E element) { insertElementAt(element, index);}public synchronized void insertElementAt(E obj, int index) { modCount++; if (index > elementCount) { throw new ArrayIndexOutOfBoundsException(index + " > " + elementCount); } ensureCapacityHelper(elementCount + 1); System.arraycopy(elementData, index, elementData, index + 1, elementCount - index); elementData[index] = obj; elementCount++;}
首先判断index的合法性,然后通过System.arraycopy将元素插入到指定的位置中。
删除元素remove/removeAll
Vector使用remove来删除元素:
public boolean remove(Object o) { return removeElement(o);}public synchronized boolean removeElement(Object obj) { modCount++; int i = indexOf(obj); //获取当前对象的索引值index if (i >= 0) { removeElementAt(i); return true; } return false;}public int indexOf(Object o) { return indexOf(o, 0);}//存在该对象时,返回当前索引值,否则返回-1public synchronized int indexOf(Object o, int index) { if (o == null) { for (int i = index ; i < elementCount ; i++) if (elementData[i]==null) return i; } else { for (int i = index ; i < elementCount ; i++) if (o.equals(elementData[i])) return i; } return -1;}public synchronized void removeElementAt(int index) { modCount++; if (index >= elementCount) { throw new ArrayIndexOutOfBoundsException(index + " >= " + elementCount); } else if (index < 0) { throw new ArrayIndexOutOfBoundsException(index); } int j = elementCount - index - 1; //删除对应index位置上的元素 if (j > 0) { System.arraycopy(elementData, index + 1, elementData, index, j); } elementCount--; elementData[elementCount] = null; /* to let gc do its work */}
Vector使用removeAll来删除元素:
public synchronized boolean removeAll(Collection<?> c) { return super.removeAll(c);}
调用父类的方法,AbstractCollection中removeAll:
public boolean removeAll(Collection<?> c) { Objects.requireNonNull(c); boolean modified = false; Iterator<?> it = iterator(); while (it.hasNext()) { if (c.contains(it.next())) { it.remove(); modified = true; } } return modified;}
上面分析的add/addAll/remove/removeAll等方法都是接口List提供的方法,Vector自身也提供了方法来操作元素:
//添加元素public synchronized void addElement(E obj) { modCount++; ensureCapacityHelper(elementCount + 1); elementData[elementCount++] = obj;}//删除元素public synchronized boolean removeElement(Object obj) { modCount++; int i = indexOf(obj); if (i >= 0) { removeElementAt(i); return true; } return false;}//删除所有元素public synchronized void removeAllElements() { modCount++; // Let gc do its work for (int i = 0; i < elementCount; i++) elementData[i] = null; elementCount = 0;}//清除所有元素public void clear() { removeAllElements();}
总结:
1. Vector与ArrayList一样,都可以动态改变数组的容量大小,可以通过索引下标来查找指定位置的值。
2. 与ArrayList最大的区别就是Vector的操作都是线程安全的,所以它的执行效率比ArrayList的低。
阅读全文
0 0
- Vector源码解析(jdk1.8)
- Vector源码探讨(基于JDK1.8)
- HashMap 源码解析(JDK1.8)
- BlockingQueue源码解析jdk1.8
- JDK1.8 StampedLock源码解析
- ArrayList源码解析(jdk1.8)
- LinkedList源码解析(jdk1.8)
- jdk1.8----ArrayList源码解析
- jdk1.8 String源码解析
- [数据结构]--jdk1.8中HashMap源码解析
- JDK1.8源码解析之 HashMap
- JDK1.8 HashMap putValue源码解析
- ArrayList源码解析——JDK1.8
- LinkedList源码解析——JDK1.8
- CopyOnWriteArrayList源码解析——JDK1.8
- jdk1.8中arrayList源码解析
- java jdk1.8 LinkedList源码解析
- JDK1.8源码阅读系列之三:Vector
- SpringBoot学习-(三)SpringBoot开发Web
- 成都的互联网大厂,你知道几个?
- shiro框架实战讲解
- cvReleaseImage 释放内存出错
- 顺序表应用3:元素位置互换之移位算法
- Vector源码解析(jdk1.8)
- jvisualvm远程监控 visualgc插件 不受此jvm支持问题
- phpstudy本地配置教程You don't have permission to access解决
- leetcode 160. Intersection of Two Linked Lists 链表公共节点
- java基础——java异常基础
- Eclipse常用快捷键
- devstack安装部署笔记--1
- linux 进程理解 (一)
- hive-site.xml修改之后不生效与一些beeline,hiveserver2的报错