Vector集合最全面的源码分析
二, 单点突破 2.1,构造函数 2.1.1 ,初始容量为10 public Vector() { this(10);//初始容量为10} 2.1.2,看下初始容量是怎么分配的? (1) 第一步,调用了这个方法public Vector(int initialCapacity) { this(initialCapacity, 0);}(2)第二步调用下面的这个方法public Vector(int initialCapacity, int capacityIncrement) { super(); if (initialCapacity < 0)//首先先检查初始容量是否小于0,若小于0,则抛出异常提示,因为数组空间大小分配不能小于0呀 throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity); this.elementData = new Object[initialCapacity];//创建一个容量大小为initialCapacity的数组,赋值给成员变量elementData this.capacityIncrement = capacityIncrement;//这里的capacityIncrement大小为0} 2.2,add() 方法 public synchronized boolean add(E e) { modCount++; ensureCapacityHelper(elementCount + 1);//首先检查集合里是否还有剩余空间盛下元素e,若没有,则需要进行扩容操作 elementData[elementCount++] = e;//将元素e添加到集合的最后一个位置,elementCount值增加1 return true;//默认添加元素成功} 2.3,size()方法 public synchronized int size() { return elementCount;//elementCount是个成员变量,用作记录集合元素大小的变量,调用size()方法时就是统计这个值的大小} 2.4,isEmpty()方法 public synchronized boolean isEmpty() { return elementCount == 0;//判断集合是否为空时,就是判断elementCount是否等于零} 2.5,get()方法 public synchronized E get(int index) {//这个方法就是索引下标获取集合对应的元素 if (index >= elementCount)//首先我们要检查一下index是否大于集合的elementCount大小,因为大于了,说明越界了嘛 throw new ArrayIndexOutOfBoundsException(index); return elementData(index);}(2)//调用elementData()方法E elementData(int index) { return (E) elementData[index];//根据数组的特点,通过索引下标找到指定索引位置的元素} 2.6,clear()方法 public void clear() { removeAllElements();//这是第一步操作}public synchronized void removeAllElements() { modCount++; // Let gc do its work for (int i = 0; i < elementCount; i++){ //循环遍历整个集合,将集合中的每个元素置为null,这样java虚拟机就会在某个时间点触发垃圾回收机制(gc)进行回收 elementData[i] = null; } elementCount = 0;//最后将代表集合元素大小的成员变量elementCount的值置为零} 2.7,contains()方法 public boolean contains(Object o) {//判断集合里面是否包含元素的方法也是很常用的 return indexOf(o, 0) >= 0;}public synchronized int indexOf(Object o, int index) { if (o == null) {//因为集合里面的元素可能为null,这里就分两种情况进行处理了,首先先判断元素o是否为null for (int i = index ; i < elementCount ; i++)//循环遍历集合,对每个元素进行判断,时间复杂度为O(n) if (elementData[i]==null) return i;//返回元素o在集合(即数组)的索引下标位置 } else { for (int i = index ; i < elementCount ; i++) //这里也是对集合的每个元素进行判断,这里的o不会为null,所以可以直接o.equals()调用 //,如果o为null,这里调用就会出现空指针异常了,切记这一点 if (o.equals(elementData[i])) return i; } return -1;//若两种情况都分析完了,还是找不到,就直接返回-1,indexOf(o,0)>=0若返回-1,说明集合不包含元素o呗} 2.8,remove()方法 public boolean remove(Object o) { return removeElement(o);}(2) 第二步操作public synchronized boolean removeElement(Object obj) { modCount++; int i = indexOf(obj);//首先通过indexof()找到元素obj在集合元素中的下标位置,若找不到则表示待删除的元素obj不存在呗 if (i >= 0) { removeElementAt(i);//删除指定位置的元素 return true; } return false;//表示元素obj不在集合中}(3)第三步操作public synchronized void removeElementAt(int index) { modCount++; if (index >= elementCount) { //首先也要判断索引下标是否大于等于集合元素个数,因为索引下标是从0开始的,所以最大下标为size()-1 throw new ArrayIndexOutOfBoundsException(index + " >= " + elementCount); } else if (index < 0) { //若index小于0,此时也不符合,就会出现索引越界的情况,此时抛出索引越界的异常就可以了, //由程序的调用者自己去避免这种问题 throw new ArrayIndexOutOfBoundsException(index); } //如果数组元素被删除后,集合里面的元素就要移动 int j = elementCount - index - 1; if (j > 0) { System.arraycopy(elementData, index + 1, elementData, index, j); } //集合元素个数减一 elementCount--; elementData[elementCount] = null; /* to let gc do its work */ //此时已经标明这里要触发gc机制了} 2.8,capacity()方法 public synchronized int size() { return elementCount;//返回集合容量大小,而不是集合元素个数} 2.9,firstElement()方法 public synchronized E firstElement() { if (elementCount == 0) {//首先判断集合元素个数是否大于0,等于0表示集合里没有元素嘛 throw new NoSuchElementException();//直接抛出对应的异常 } return elementData(0);//根据数组的特点,根据索引下标位置获取对应元素} 2.10,lastElement() public synchronized E lastElement() { if (elementCount == 0) {//首先判断集合元素个数是否大于0,等于0表示集合里没有元素嘛 throw new NoSuchElementException(); } return elementData(elementCount - 1);//根据数组的特点,根据索引下标位置获取对应元素} 2.11,elementAt()方法 public synchronized E elementAt(int index) { if (index >= elementCount) {//预检查机制 throw new ArrayIndexOutOfBoundsException(index + " >= " + elementCount); } return elementData(index);//根据数组的索引下标获取集合里指定位置的元素} 三,总结一下 3.1,方法总结 对于每个方法,去理解具体的实现原理,学会如何分析一个方法,这样可以帮你更加去编写可读性高,具备可扩展的代码有所帮助,其实,现在我写内容也帮助了自己很多,如果帮助到需要的你,那就再好不过了,喜欢的帮忙转发一下(感谢) 本文分享自微信公众号 - WwpwW(gh_245290c1861a)。如有侵权,请联系 support@oschina.cn 删除。本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。