Метод trimToSize() класса Vector в Java
trimToSize()является, в Java,Vectorслужебный метод, предоставляемый классом, используемый для оптимизацииVectorиспользования памяти. Этот метод будетVectorотрегулировать capacity (capacity) до текущего фактического количества хранимых элементов (size), тем самым сократив ненужное использование памяти.
Синтаксис метода
public void trimToSize()
Содержащий класс
java.util.Vector
Назначение метода
VectorКласс внутренне использует массив для хранения элементов. КогдаVectorдобавляются элементы, если текущий массив заполнен,Vectorон автоматически расширяется (обычно в 1.5 или 2 раза от текущей capacity). Хотя этот механизм повышает эффективность добавления элементов, он также может приводить к нерациональному расходу памяти.
trimToSize()Цель метода —Vectorнастроить размер внутреннего массива ровно настолько, чтобы вместить все текущие элементы, освободив лишнее пространство памяти.
Сценарии использования
- Когда
VectorКогда было добавлено большое количество элементов, а затем некоторые элементы были удалены, из-за чего capacity становится намного больше фактического количества элементов - В приложениях, чувствительных к памяти, когда требуется оптимизировать использование памяти
- Когда установлено, что
Vectorсодержимое больше не изменяется, и вы хотите сэкономить память
Принцип реализации метода
Анализ исходного кода
Ниже приведеноVectorв классеtrimToSize()реализация метода:
Пример
modCount++;
int oldCapacity = elementData.length;
if (elementCount < oldCapacity) {
elementData = Arrays.copyOf(elementData, elementCount);
}
}
Шаги реализации
- Увеличить счётчик модификаций
modCount(используется для механизма fail-fast) - Получить ёмкость текущего внутреннего массива
oldCapacity - Если текущее количество элементов
elementCountменьше ёмкости массива:- Используйте
Arrays.copyOf()чтобы создать новый массив, размер равенelementCount - Скопировать содержимое исходного массива в новый массив
- будет
elementDataУстановить ссылку на новый массив
- Используйте
Примечания
- Этот метод синхронизирован (
synchronized), потокобезопасен - После вызова этого метода, если новые элементы будут добавлены снова,
Vectorон всё равно будет автоматически расширяться - Для больших
Vector, эта операция может повлечь некоторые накладные расходы на производительность
Примеры использования
Базовое использование
Пример
public class VectorTrimToSizeExample {
public static void main(String[] args) {
// Создать Vector с начальной емкостью 10
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("Емкость: " + vector.capacity()); // Вывод: 10
// Вызов trimToSize()
vector.trimToSize();
System.out.println("Емкость после обрезки: " + vector.capacity()); // Вывод: 5
}
}
Практические сценарии применения
Пример
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("До обрезки - Размер: " + data.size() +
", Емкость: " + data.capacity());
// Вывод: До обрезки - Размер: 4000, Емкость: 10000
// Оптимизация использования памяти
data.trimToSize();
System.out.println("After trim - Size: " + data.size() +
", Емкость: " + data.capacity());
// Вывод: After trim - Size: 4000, Capacity: 4000
}
}
Соображения производительности
Временная сложность
trimToSize()Временная сложность метода — O(n), где n —Vectorколичество элементов в нём. Потому что ему нужно скопировать исходный массив в новый массив.
Пространственная сложность
Этот метод создаёт новый массив, поэтому он временно использует дополнительную память, но в конечном итоге освобождает избыточную память.
Рекомендации по использованию
- Не вызывайте часто
trimToSize(), особенно в циклах - Когда установлено, что
Vectorсодержимое практически больше не меняется, вызывайте его - Для небольших
Vector, эффект оптимизации неочевиден, и им можно пренебречь
Сравнение с другими методами
Сравнение с trimToSize() из ArrayList
ArrayListтакже имеетtrimToSize()метод, принцип реализации аналогичен, ноArrayListего метод не синхронизирован.
Сравнение с ensureCapacity()
| Метод | Назначение | Parameters | Потокобезопасность |
|---|---|---|---|
trimToSize() |
Уменьшение ёмкости до текущего размера | Отсутствует | Да |
ensureCapacity(int minCapacity) |
Обеспечение минимальной ёмкости | Минимальное значение ёмкости | Да |
Итог
Vector.trimToSize()является практичным методом оптимизации памяти, особенно подходящим для следующих сценариев:
VectorПосле выполнения большого количества операций add и remove- Среды с ограниченными ресурсами памяти
VectorКогда определено, что содержимое больше не будет изменяться
При его использовании обратите внимание на следующее:
- Этот метод создаёт новый массив и копирует элементы, что даёт некоторые накладные расходы по производительности.
- Если после вызова снова добавляются элементы,
Vectorон всё равно будет автоматически расширяться - Для небольших
Vectorили часто изменяютсяVector, возможно, не нужно его использовать
Разумное использованиеtrimToSize()может помочь оптимизировать эффективность использования памяти в Java-программах.
Java Vector