Vector<E>源码详解

Vector<E>源码详解(基于jdk1.8.0_162)

说明:Vector<E>底层使用了数组的方式实现,是一个线程安全的集合。

           该章只列举了常用的增删查改方法,其它可以参考JDK文档。

Stack<E>:栈的特性是“先进后出”,继承了Vector<E>类,实现的功能。

                    相当于栈的底层也是数组实现,也是一个线程安全的对象。

 

一)类图

Vector<E>继承了AbstractList<E>抽象类,实现了add、remove、set等功能。

Vector<E>继承了List<E>接口,依赖与Iterator<E>和ListIterator<E>接口,实现了数据迭代等功能。

Vector<E>是一个线程安全的集合。

备注:如需自己实现Vector类似的功能,可以继承AbstractList<E>抽象类,然后再自定义方法。

 

二)构造方法

1)Vector<E> vector = new Vector<E>();

构造一个容量默认为10、增量为0的空集合,当元素大小超出容量时,按(容量+容量)成倍的方式扩容。

2)Vector<E> vector = new Vector<E>(20);

构造一个指定容量为20、增量为0的空集合,当元素大小超出容量时,按(容量+容量)成倍的方式扩容。

3)Vector<E> vector = new Vector<E>(30,15);

构造一个指定容量为30、增量为15的空集合,当元素大小超出容量时,按(容量+增量)的方式扩容。

4)Vector<E> vector = new Vector<E>(Collection<? extends E> c);

构造一个包含指定元素集合的列表。

// 构造一个容量默认为10、增量为0的空集合,当元素大小超出容量时,按(容量+容量)成倍的方式扩容
public Vector() {
    this(10);
}

// 构造一个指定容量为20、增量为0的空集合,当元素大小超出容量时,按(容量+容量)成倍的方式扩容
public Vector(int initialCapacity) {
    this(initialCapacity, 0);
}

// 构造一个指定容量为30、增量为15的空集合,当元素大小超出容量时,按(容量+增量)的方式扩容
public Vector(int initialCapacity, int capacityIncrement) {
    super();
    if (initialCapacity < 0)
        throw new IllegalArgumentException("Illegal Capacity: "+
                                               initialCapacity);
    this.elementData = new Object[initialCapacity];
    this.capacityIncrement = capacityIncrement;
}

// 构造一个包含指定元素集合的列表
public Vector(Collection<? extends E> c) {
    elementData = c.toArray(); //把集合转换成一个Object[]数组
    elementCount = elementData.length;
    // c.toArray might (incorrectly) not return Object[] (see 6260652)
    if (elementData.getClass() != Object[].class) // 符合条件,复制成一个新数组再赋值
        elementData = Arrays.copyOf(elementData, elementCount, Object[].class);
}

 

三)添加

1)add(E e),一次添加一个元素,相当于在末尾添加,有返回值

     addElement(E obj),一次添加一个元素,相当于在末尾添加,无返回值

public synchronized boolean add(E e) { // synchronized保证线程安全
    modCount++;
    ensureCapacityHelper(elementCount + 1); // 调用扩容方法
    elementData[elementCount++] = e; // 添加元素
    return true;
}

public synchronized void addElement(E obj) {
    modCount++;
    ensureCapacityHelper(elementCount + 1);
    elementData[elementCount++] = obj;
}

private void ensureCapacityHelper(int minCapacity) {
    // overflow-conscious code
    if (minCapacity - elementData.length > 0) // 判断是否需要扩容
        grow(minCapacity); // 调用扩容方法
}

private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;

private void grow(int minCapacity) {
    // overflow-conscious code
  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
vector< vector<int> > 是一个容器,其中嵌套了另一个容器。外层容器的元素类型是 vector<int>,内层容器的元素类型是 int。你可以通过以下几个步骤来使用 vector< vector<int> >: 1. 定义和长度: - 正确的定义方式:vector< vector<int> > A;(在尖括号前加上空格) - 获取 vector< vector<int> > A 中的外层容器元素个数:int len = A.size(); - 获取 vector< vector<int> > A 中第 i 个外层容器的长度:int len = A[i].size(); 2. 访问某个元素: - 在使用 vector 容器之前,需要加上 <vector> 头文件:#include <vector> - vector 属于 std 命名空间的内容,因此需要通过命名限定:using std::vector;(也可以直接使用全局的命名空间方式:using namespace std;) - 使用 vector 的成员函数来访问元素... 例如,如果想定义 A = [[0,1,2],[3,4,5]],可以按如下步骤: ```cpp vector< vector<int> > A; // 大容器 // A.push_back 里必须是 vector vector<int> B; // 小容器 B.push_back(0); B.push_back(1); B.push_back(2); A.push_back(B); // 小容器放入大容器 B.clear(); // 清空小容器元素 B.push_back(3); B.push_back(4); B.push_back(5); A.push_back(B); ``` 范例中还提供了一个案例,可以参考如下代码实现键盘输入 n 维矩阵,转化为二维向量: ```cpp #include <iostream> #include <vector> using namespace std; int main() { vector< vector<int> > v; vector<int> temp; int n, i, j, num; cout << "input the dimension:"; cin >> n; cout << "请输入" << n << "*" << n << "的矩阵" << endl; // 输入元素 for (i = 0; i < n; i++) { temp.clear(); // 清空 temp 内元素 for (j = 0; j < n; j++) { cin >> num; temp.push_back(num); } v.push_back(temp); } cout << "<----- 遍历输出所有元素 ----->" << endl; for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { cout << v[i][j] << " "; } cout << endl; } return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值