Java Vector trimToSize() 方法
trimToSize() 是 Java 中 Vector 类提供的一个实用方法,用于优化 Vector 的内存使用。该方法会将 Vector 的容量(capacity)调整为当前实际存储的元素数量(size),从而减少不必要的内存占用。
方法语法
public void trimToSize()
所属类
java.util.Vector
方法作用
Vector 类在内部使用一个数组来存储元素。当向 Vector 添加元素时,如果当前数组已满,Vector 会自动扩容(通常扩容为当前容量的 1.5 倍或 2 倍)。这种机制虽然提高了添加元素的效率,但也可能导致内存浪费。
trimToSize() 方法的作用就是将 Vector 的内部数组大小调整为刚好能够容纳当前所有元素,释放多余的内存空间。
使用场景
- 当 Vector添加了大量元素后,又删除了部分元素,导致容量远大于实际元素数量时
- 在内存敏感的应用中,需要优化内存使用时
- 确定 Vector内容不再变化,希望节省内存时
方法实现原理
源码分析
以下是 Vector 类中 trimToSize() 方法的实现:
实例
public synchronized void trimToSize() {
modCount++;
int oldCapacity = elementData.length;
if (elementCount < oldCapacity) {
elementData = Arrays.copyOf(elementData, elementCount);
}
}
modCount++;
int oldCapacity = elementData.length;
if (elementCount < oldCapacity) {
elementData = Arrays.copyOf(elementData, elementCount);
}
}
实现步骤
- 增加修改计数器 modCount(用于快速失败机制)
- 获取当前内部数组的容量 oldCapacity
- 如果当前元素数量 elementCount小于数组容量:- 使用 Arrays.copyOf()创建一个新数组,大小为elementCount
- 将原数组内容复制到新数组
- 将 elementData引用指向新数组
 
- 使用 
注意事项
- 该方法是同步的(synchronized),线程安全
- 调用此方法后,如果再添加新元素,Vector仍会自动扩容
- 对于大型 Vector,此操作可能会产生一定的性能开销
使用示例
基本用法
实例
import java.util.Vector;
public class VectorTrimToSizeExample {
public static void main(String[] args) {
// 创建一个初始容量为10的Vector
Vector<String> vector = new Vector<>(10);
        
// 添加5个元素
for (int i = 0; i < 5; i++) {
vector.add("Item " + (i + 1));
}
        
System.out.println("Size: " + vector.size()); // 输出: 5
System.out.println("Capacity: " + vector.capacity()); // 输出: 10
        
// 调用trimToSize()
vector.trimToSize();
        
System.out.println("Capacity after trim: " + vector.capacity()); // 输出: 5
}
}
public class VectorTrimToSizeExample {
public static void main(String[] args) {
// 创建一个初始容量为10的Vector
Vector<String> vector = new Vector<>(10);
// 添加5个元素
for (int i = 0; i < 5; i++) {
vector.add("Item " + (i + 1));
}
System.out.println("Size: " + vector.size()); // 输出: 5
System.out.println("Capacity: " + vector.capacity()); // 输出: 10
// 调用trimToSize()
vector.trimToSize();
System.out.println("Capacity after trim: " + vector.capacity()); // 输出: 5
}
}
实际应用场景
实例
import java.util.Vector;
public class VectorMemoryOptimization {
public static void main(String[] args) {
// 模拟一个处理大量数据的场景
Vector<Integer> data = new Vector<>(10000);
        
// 添加大量数据
for (int i = 0; i < 8000; i++) {
data.add(i);
}
        
// 处理数据后删除一半
for (int i = 0; i < 4000; i++) {
data.remove(0);
}
        
System.out.println("Before trim - Size: " + data.size() +
", Capacity: " + data.capacity());
// 输出: Before trim - Size: 4000, Capacity: 10000
        
// 优化内存使用
data.trimToSize();
        
System.out.println("After trim - Size: " + data.size() +
", Capacity: " + data.capacity());
// 输出: After trim - Size: 4000, Capacity: 4000
}
}
public class VectorMemoryOptimization {
public static void main(String[] args) {
// 模拟一个处理大量数据的场景
Vector<Integer> data = new Vector<>(10000);
// 添加大量数据
for (int i = 0; i < 8000; i++) {
data.add(i);
}
// 处理数据后删除一半
for (int i = 0; i < 4000; i++) {
data.remove(0);
}
System.out.println("Before trim - Size: " + data.size() +
", Capacity: " + data.capacity());
// 输出: Before trim - Size: 4000, Capacity: 10000
// 优化内存使用
data.trimToSize();
System.out.println("After trim - Size: " + data.size() +
", Capacity: " + data.capacity());
// 输出: After trim - Size: 4000, Capacity: 4000
}
}
性能考虑
时间复杂度
trimToSize() 方法的时间复杂度为 O(n),其中 n 是 Vector 中元素的数量。因为它需要将原有数组复制到新数组中。
空间复杂度
该方法会创建一个新的数组,因此会临时使用额外的内存空间,但最终会释放多余的内存。
使用建议
- 不要频繁调用 trimToSize(),特别是在循环中
- 在确定 Vector内容基本不再变化时调用
- 对于小型 Vector,优化效果不明显,可以忽略
与其他方法的比较
与 ArrayList 的 trimToSize() 比较
ArrayList 也有 trimToSize() 方法,实现原理类似,但 ArrayList 的方法不是同步的。
与 ensureCapacity() 比较
| 方法 | 作用 | 参数 | 线程安全 | 
|---|---|---|---|
| trimToSize() | 缩小容量至当前size | 无 | 是 | 
| ensureCapacity(int minCapacity) | 确保最小容量 | 最小容量值 | 是 | 
总结
Vector.trimToSize() 是一个实用的内存优化方法,特别适用于以下场景:
- Vector经历过大量增删操作后
- 内存资源有限的环境
- Vector内容确定不再变化时
使用时需要注意:
- 该方法会创建一个新数组并复制元素,有一定性能开销
- 调用后如果再添加元素,Vector仍会自动扩容
- 对于小型 Vector或频繁变化的Vector,可能不需要使用
合理使用 trimToSize() 可以帮助优化 Java 程序的内存使用效率。

 Java Vector
 Java Vector