2.1,构造函数
2.1.1 ,初始容量为10
代码语言:javascript复制public Vector() {
this(10);//初始容量为10
}
2.1.2,看下初始容量是怎么分配的?
代码语言:javascript复制(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() 方法
代码语言:javascript复制public synchronized boolean add(E e) {
modCount ;
ensureCapacityHelper(elementCount 1);//首先检查集合里是否还有剩余空间盛下元素e,若没有,则需要进行扩容操作
elementData[elementCount ] = e;//将元素e添加到集合的最后一个位置,elementCount值增加1
return true;//默认添加元素成功
}
2.3,size()方法
代码语言:javascript复制public synchronized int size() {
return elementCount;//elementCount是个成员变量,用作记录集合元素大小的变量,调用size()方法时就是统计这个值的大小
}
2.4,isEmpty()方法
代码语言:javascript复制public synchronized boolean isEmpty() {
return elementCount == 0;//判断集合是否为空时,就是判断elementCount是否等于零
}
2.5,get()方法
代码语言:javascript复制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()方法
代码语言:javascript复制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()方法
代码语言:javascript复制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()方法
代码语言:javascript复制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()方法
代码语言:javascript复制public synchronized int size() {
return elementCount;//返回集合容量大小,而不是集合元素个数
}
2.9,firstElement()方法
代码语言:javascript复制public synchronized E firstElement() {
if (elementCount == 0) {//首先判断集合元素个数是否大于0,等于0表示集合里没有元素嘛
throw new NoSuchElementException();//直接抛出对应的异常
}
return elementData(0);//根据数组的特点,根据索引下标位置获取对应元素
}
2.10,lastElement()
代码语言:javascript复制public synchronized E lastElement() {
if (elementCount == 0) {//首先判断集合元素个数是否大于0,等于0表示集合里没有元素嘛
throw new NoSuchElementException();
}
return elementData(elementCount - 1);//根据数组的特点,根据索引下标位置获取对应元素
}
2.11,elementAt()方法
代码语言:javascript复制public synchronized E elementAt(int index) {
if (index >= elementCount) {//预检查机制
throw new ArrayIndexOutOfBoundsException(index " >= " elementCount);
}
return elementData(index);//根据数组的索引下标获取集合里指定位置的元素
}
三,总结一下
3.1,方法总结
对于每个方法,去理解具体的实现原理,学会如何分析一个方法,这样可以帮你更加去编写可读性高,具备可扩展的代码有所帮助,其实,现在我写内容也帮助了自己很多,如果帮助到需要的你,那就再好不过了,喜欢的帮忙转发一下(感谢)