集合—Vector源码

Vector(2021-11-3)

1 Collection接口遍历元素方式:

  • 使用迭代器。
  • for循环增强。

1-1 迭代器遍历

  • 迭代器基本介绍:
    • Interator对象成为迭代器,主要用于遍历Collection集合中的元素。
    • 所有实现了Collection接口的集合类都有一个interator()方法,用于返回一个实现了Interator接口的对象,即可以返回一个迭代器。
    • Interator仅用于遍历集合,Interator本身不存放对象。
  • Interator结构:
Iterator iterator = coll.iterator() //得到一个集合的迭代器
//hasNext():判断是否有下一个元素
while(iterator.hasNext()){ //判断是否还有数据。
	//next()作用:
	//(1)指针下移;
    //(2)将下移以后集合位置上的元素返回。
    Object object = iterator.next();
    System.out.println(object);
}
//while(iterator.hasNext()){} 快捷键:itit + enter
//显示所有快捷键的快捷键:ctrl + j

//当迭代器推出while循环后,这是iterator迭代器,指向最后一个元素。
//如果希望再次遍历,需要重置iterator迭代器:
iterator = col.iterator();
  • 在使用iterator.next()方法前必须要调用iterator.hasNext()进行检测。若不调用,下一条记录无效,直接调用iterator.next()会抛出NoSuchElementException异常。

1-2 for循环增强

  • 增强for循环,可以替代迭代器。可以理解为简化版的迭代器Interator。本质一样,只能用于遍历集合和数组。
  • 基本语法:
//使用增强for,在Collection集合。
//底层仍然是迭代器。
Collection col = new ArrayList();
for(Object object:col){ //增强for
    System.out.println(object);
}

//增强for也可以直接在数组使用。
int[] nums = {1,2,3,4};
for(int i : nums){
    System.out.println(i);
}

2 List接口和常用方法

  • List集合类中的元素是有序的(添加和取出的顺序一致),可以重复。

  • add(int index , Object ele)。

  • get(int index) 获取指定index位置的元素 。

  • indexOf(Object obj) 返回obj在集合中首次出现的位置 。

  • LastIndexOf(Object obj) 返回obj自己和中末次出现的位置 。

  • remove(int index) 移除指定的 index 元素 。

  • set(int index , Object obj) 替换 。

  • subList(int fromIndex , int toIndex) 返回 [ fromIndex,toIndex ] 的元素 。

3 ArrayList注意事项

  • ArrayList基本等同于Vector,除了ArrayList是线程不安全的(执行效率高):没有sysnchronizd。

  • 在多线程情况下,不建议使用ArrayList。

4 Vector

  • 底层:对象数组。
protected Object[] elementData;
  • Vector是线程同步的(线程安全)。
public synchronized boolean add(E e) {
        modCount++;
        ensureCapacityHelper(elementCount + 1);
        elementData[elementCount++] = e;
        return true;
}
  • 开发中,需要线程同步安全时,考虑使用Vector。

5 Vector底层结构和ArrayList比较

List底层结构版本线程安全(同步)效率扩容倍数
ArrayList可变数组jdk1.2不安全,效率高1)有参构造:1.5
2)无参构造:
第一次10
第二次开始1.5
Vector可变数组jdk1.0安全,效率低1)无参构造:默认10,满后,按照2倍扩容
2)有参构造:2

5-1 Vector源码

  • 无参构造:
public Vector() {
    this((initialCapacity =10);   //直接默认是10
    public Vector(int initialCapacity (10) {
        this(initialCapacity(10, 0);
        public Vector(int initialCapacity, int capacityIncrement) {
            super();
            if (initialCapacity(10< 0)  //判断长度值是否异常
                throw new IllegalArgumentException("Illegal Capacity: "+
                                                   initialCapacity);
            this.elementData = new Object[initialCapacity(10];
            this.capacityIncrement = capacityIncrement;
    	}
    }
}
10 -> 20 -> 40 -> 80`````
  • add(无参构造第一次):
public synchronized boolean add(E e) { //添加数据到Vector集合
    modCount++;
    
    ensureCapacityHelper(elementCount + 1){
        if (minCapacity - elementData.length > 0) //确定是否需要扩容
            grow(minCapacity){//真正扩容 例子:第一次扩容
            	// 10
            	int oldCapacity = elementData.length;
            	// new = old + (a)?(b = old) [a真返回a ; a假返回b]
            	// capacityIncrement固定是0 - 为什么还要有呢?直接*2不好吗?
                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);
			}; 
        
	};
    
    elementData[elementCount++] = e;
    return true;
}
  • 有参构造:
public Vector(int initialCapacity(0) {
	this(initialCapacity(0, (capacityIncrement =0); //capacityIncrement固定是0 。
    public Vector(int initialCapacity(0, int capacityIncrement(0) {
        super();
        if (initialCapacity < 0)
            throw new IllegalArgumentException("Illegal Capacity: "+
                                               initialCapacity);
        this.elementData = new Object[initialCapacity];0this.capacityIncrement = capacityIncrement; // 0=0
    }
}
n>0
n -> 2n -> 4n -> 8n``````
  • add(有参传0第一次):
public synchronized boolean add(E e) { //添加数据到Vector集合
    modCount++;
    
    ensureCapacityHelper((minCapacity = )elementCount(0+ 1){
        if (minCapacity(1- elementData.length(0> 0) //确定是否需要扩容
            grow(minCapacity){//真正扩容 例子:第一次扩容
            	// 10
            	int oldCapacity(0= elementData.length;
            	// new = old + (a)?(b = old) [a真返回a ; a假返回b]
            	// capacityIncrement固定是0 - 为什么还要有呢?直接*2不好吗?
            	//capacityIncrement : 容量 盈余
                int newCapacity(0= oldCapacity(0+ ((capacityIncrement(0> 0) ?
                                                 capacityIncrement : oldCapacity(0);
                if (newCapacity(0- minCapacity(1< 0)
                    newCapacity(1= minCapacity(1;//只有传参0,第一次扩容进来!
                if (newCapacity - MAX_ARRAY_SIZE > 0)  //不用看
                    newCapacity = hugeCapacity(minCapacity);
                elementData = Arrays.copyOf(elementData, newCapacity);
			}; 
        
	};
    
    elementData[elementCount++] = e;
    return true;
}
1 -> 2 -> 4 -> 8 -> 16``````
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值