vector扩容为什么一半是二倍
时间: 2023-06-04 16:05:28 浏览: 128
vector扩容的默认策略是当当前已存储的元素个数达到vector容量时,将原有容量翻倍,然后申请新的内存,将原有数据拷贝到新的内存中,并释放原有内存。具体来说,vector将当前容量大小乘以2,然后申请新的大小为原有容量大小乘以2的内存空间。这样的设计可以保证vector的动态扩容效率比较高,同时也避免了频繁的内存申请和释放。其中一半是二倍是因为在vector的动态扩容中,每次扩容后,新容量大小是原容量大小的2倍,为了防止扩容之后的内存浪费,vector将原容量大小的一半作为扩容之前可用,也就是说在扩容前,容量使用率为50%。
相关问题
arraylist 的扩容机制_ArrayList、LinkedList、Vector看完你不懂,算是输!
ArrayList 是基于数组实现的,当数组容量不足时,需要扩容。它的扩容机制是每次扩容增加当前容量的一半,即 newCapacity = oldCapacity + (oldCapacity >> 1)。
LinkedList 是基于链表实现的,不需要扩容。它的添加和删除操作比 ArrayList 更高效,因为它不需要移动元素,但是随机访问元素的性能比 ArrayList 差。
Vector 是线程安全的 ArrayList,它的扩容机制和 ArrayList 相同。但是由于线程安全的开销,它的性能比 ArrayList 差。因此,在单线程环境下,应该使用 ArrayList 而不是 Vector。
--练习:定义一维数组, 开辟4个存储空间, 用于存储班级学生姓名。目前班级有 6 名学生, 要求当数组空间用完的时候, 进行数组扩容, 使得扩容后的数组空间为扩容前的2倍, 以支持班级学生姓名完成录入, 录入后显示所有学生姓名。 java
在Java中,你可以使用ArrayList或Vector来动态地管理一维数组,因为它们都支持自动扩容。这里是一个简单的例子,演示如何定义数组、扩容以及添加学生姓名:
```java
import java.util.ArrayList;
public class StudentList {
private ArrayList<String> studentNames = new ArrayList<>(4); // 初始容量为4
public void addStudent(String name) {
if (studentNames.size() >= studentNames.capacity() / 2) { // 当容量达到一半时扩容
studentNames.ensureCapacity(studentNames.capacity() * 2);
}
studentNames.add(name); // 添加学生姓名
}
public void displayStudents() {
for (String name : studentNames) {
System.out.println(name);
}
}
public static void main(String[] args) {
StudentList list = new StudentList();
// 假设我们有6名学生,这里只列出示例
for (int i = 0; i < 6 && i < list.studentNames.capacity(); i++) {
list.addStudent("Student " + (i + 1));
}
list.displayStudents(); // 显示录入的学生姓名
}
}
```
在这个例子中,`addStudent`方法会检查当前列表是否已满,如果满了就将容量扩大到原来的两倍。然后,你可以继续添加学生名字直到数组完全满。最后,在`main`函数中,我们模拟了录入学生的操作,并打印出所有的姓名。
阅读全文