Java Vector trimToSize() 方法

Java Vector Java Vector


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);
    }
}

实现步骤

  1. 增加修改计数器 modCount(用于快速失败机制)
  2. 获取当前内部数组的容量 oldCapacity
  3. 如果当前元素数量 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
    }
}

实际应用场景

实例

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
    }
}

性能考虑

时间复杂度

trimToSize() 方法的时间复杂度为 O(n),其中 n 是 Vector 中元素的数量。因为它需要将原有数组复制到新数组中。

空间复杂度

该方法会创建一个新的数组,因此会临时使用额外的内存空间,但最终会释放多余的内存。

使用建议

  • 不要频繁调用 trimToSize(),特别是在循环中
  • 在确定 Vector 内容基本不再变化时调用
  • 对于小型 Vector,优化效果不明显,可以忽略

与其他方法的比较

与 ArrayList 的 trimToSize() 比较

ArrayList 也有 trimToSize() 方法,实现原理类似,但 ArrayList 的方法不是同步的。

与 ensureCapacity() 比较

方法 作用 参数 线程安全
trimToSize() 缩小容量至当前size
ensureCapacity(int minCapacity) 确保最小容量 最小容量值

总结

Vector.trimToSize() 是一个实用的内存优化方法,特别适用于以下场景:

  1. Vector 经历过大量增删操作后
  2. 内存资源有限的环境
  3. Vector 内容确定不再变化时

使用时需要注意:

  • 该方法会创建一个新数组并复制元素,有一定性能开销
  • 调用后如果再添加元素,Vector 仍会自动扩容
  • 对于小型 Vector 或频繁变化的 Vector,可能不需要使用

合理使用 trimToSize() 可以帮助优化 Java 程序的内存使用效率。

Java Vector Java Vector