二, 单点突破
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,方法总结
对于每一个方法,去理解具体的实现原理,学会如何分析一个方法,这样能够帮你更加去编写可读性高,具有可扩展的代码有所帮助,其实,如今我写内容也帮助了本身不少,若是帮助到须要的你,那就再好不过了,喜欢的帮忙转发一下(感谢)
java
本文分享自微信公众号 - WwpwW(gh_245290c1861a)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。web