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 程序的内存使用效率。
点我分享笔记