Java Vector insertElementAt() 方法
insertElementAt()
是 Java 中 Vector
类提供的一个方法,用于在向量的指定索引位置插入一个元素。该方法会将当前位于该位置及之后的所有元素向右移动(即它们的索引会增加 1)。
方法语法
public void insertElementAt(E obj, int index)
参数说明
E obj
:要插入的元素,类型与 Vector 的泛型类型一致int index
:要插入元素的位置索引(从 0 开始计数)
方法特性
1. 索引范围
- 有效索引范围是
0
到size()
(包含) - 如果指定
index = size()
,相当于在末尾添加元素(与addElement()
效果相同)
2. 容量调整
- 如果插入操作导致 Vector 容量不足,Vector 会自动扩容(默认增长策略是当前容量的 2 倍)
3. 线程安全
- Vector 是线程安全的类,
insertElementAt()
方法是同步方法
4. 与 ArrayList 对比
- ArrayList 没有直接等效的方法,但可以通过
add(index, element)
实现类似功能 - Vector 的方法名更长但更直观("insertElementAt" 比 "add" 更能表达操作意图)
使用示例
基础示例
实例
import java.util.Vector;
public class VectorExample {
public static void main(String[] args) {
// 创建一个初始容量为 3 的 Vector
Vector<String> fruits = new Vector<>(3);
// 添加初始元素
fruits.addElement("Apple");
fruits.addElement("Banana");
fruits.addElement("Orange");
System.out.println("初始 Vector: " + fruits);
// 输出: 初始 Vector: [Apple, Banana, Orange]
// 在索引 1 处插入新元素
fruits.insertElementAt("Mango", 1);
System.out.println("插入后 Vector: " + fruits);
// 输出: 插入后 Vector: [Apple, Mango, Banana, Orange]
}
}
public class VectorExample {
public static void main(String[] args) {
// 创建一个初始容量为 3 的 Vector
Vector<String> fruits = new Vector<>(3);
// 添加初始元素
fruits.addElement("Apple");
fruits.addElement("Banana");
fruits.addElement("Orange");
System.out.println("初始 Vector: " + fruits);
// 输出: 初始 Vector: [Apple, Banana, Orange]
// 在索引 1 处插入新元素
fruits.insertElementAt("Mango", 1);
System.out.println("插入后 Vector: " + fruits);
// 输出: 插入后 Vector: [Apple, Mango, Banana, Orange]
}
}
边界情况示例
实例
import java.util.Vector;
public class BoundaryExample {
public static void main(String[] args) {
Vector<Integer> numbers = new Vector<>();
numbers.add(10);
numbers.add(20);
try {
// 尝试在非法索引处插入
numbers.insertElementAt(30, 3); // 正确:相当于 addElement(30)
numbers.insertElementAt(40, 5); // 抛出 ArrayIndexOutOfBoundsException
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("捕获异常: " + e.getMessage());
}
// 在开头插入
numbers.insertElementAt(5, 0);
System.out.println(numbers); // 输出: [5, 10, 20, 30]
}
}
public class BoundaryExample {
public static void main(String[] args) {
Vector<Integer> numbers = new Vector<>();
numbers.add(10);
numbers.add(20);
try {
// 尝试在非法索引处插入
numbers.insertElementAt(30, 3); // 正确:相当于 addElement(30)
numbers.insertElementAt(40, 5); // 抛出 ArrayIndexOutOfBoundsException
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("捕获异常: " + e.getMessage());
}
// 在开头插入
numbers.insertElementAt(5, 0);
System.out.println(numbers); // 输出: [5, 10, 20, 30]
}
}
注意事项
1. 性能考虑
- 在 Vector 中间插入元素需要移动后续所有元素,时间复杂度为 O(n)
- 频繁插入操作可能影响性能,考虑使用 LinkedList 等更适合频繁插入的数据结构
2. 异常处理
- 如果索引超出范围(index < 0 || index > size()),会抛出
ArrayIndexOutOfBoundsException
- 建议在调用前检查索引有效性
3. 替代方案
- 对于不需要线程安全的情况,可以考虑使用 ArrayList 的
add(int index, E element)
方法 - Java 8+ 可以使用 Stream API 进行更灵活的元素插入操作
实际应用场景
1. 动态数据插入
当需要根据某些条件在特定位置插入数据时:
实例
Vector<Student> students = new Vector<>();
// ... 添加一些学生数据
// 根据成绩插入新学生到正确位置
void insertStudent(Student newStudent) {
for (int i = 0; i < students.size(); i++) {
if (newStudent.getScore() > students.get(i).getScore()) {
students.insertElementAt(newStudent, i);
return;
}
}
students.addElement(newStudent); // 如果成绩最低,添加到末尾
}
// ... 添加一些学生数据
// 根据成绩插入新学生到正确位置
void insertStudent(Student newStudent) {
for (int i = 0; i < students.size(); i++) {
if (newStudent.getScore() > students.get(i).getScore()) {
students.insertElementAt(newStudent, i);
return;
}
}
students.addElement(newStudent); // 如果成绩最低,添加到末尾
}
2. 优先级队列实现
可以基于 Vector 和 insertElementAt()
实现简单的优先级队列:
实例
class PriorityQueue {
private Vector<Task> tasks = new Vector<>();
public void addTask(Task task) {
for (int i = 0; i < tasks.size(); i++) {
if (task.getPriority() > tasks.get(i).getPriority()) {
tasks.insertElementAt(task, i);
return;
}
}
tasks.addElement(task);
}
public Task getNextTask() {
return tasks.isEmpty() ? null : tasks.remove(0);
}
}
private Vector<Task> tasks = new Vector<>();
public void addTask(Task task) {
for (int i = 0; i < tasks.size(); i++) {
if (task.getPriority() > tasks.get(i).getPriority()) {
tasks.insertElementAt(task, i);
return;
}
}
tasks.addElement(task);
}
public Task getNextTask() {
return tasks.isEmpty() ? null : tasks.remove(0);
}
}
常见问题解答
Q1: insertElementAt()
和 add(index, element)
有什么区别?
insertElementAt()
是 Vector 特有的方法,命名更明确add(index, element)
是 List 接口定义的方法,ArrayList 也支持- 功能上两者等效,但 Vector 的方法是同步的
Q2: 为什么插入操作会影响性能?
- 因为数组结构需要移动插入位置之后的所有元素
- 例如在 1000 个元素的 Vector 开头插入,需要移动 1000 个元素
Q3: 如何高效地在 Vector 中插入多个元素?
- 如果可能,先收集所有要插入的元素
- 使用
addAll()
方法批量添加 - 或者考虑使用 LinkedList 等更适合频繁插入的数据结构
总结
Vector.insertElementAt()
是一个实用的方法,它提供了在特定位置插入元素的能力。虽然 Vector 在大多数现代 Java 应用中已被 ArrayList 取代,但在需要线程安全的场景下,Vector 及其方法仍然有其价值。理解这个方法的工作原理和性能特点,可以帮助开发者做出更合适的数据结构选择。
点我分享笔记