Основные примеры операции
VectorApp.java
импортировать java.util.vector; импортировать java.lang.*; Импорт java.util.enumeration; открытый класс VectorApp {public static void main (String args []) {Vector v1 = new Vector (); Integer Integer1 = Новое целое число (1); // Добавить как строка объект v1.addelement ("One"); // добавить как целочисленный объект v1.addelement (integer1); v1.addelement (Integer1); v1.addelement («два»); v1.addelement (новое целое число (2)); v1.addelement (Integer1); v1.addelement (Integer1); // конвертируется в строку и систему печати. // вставить новый объект в указанную позицию v1.inserTelement («Три», 2); v1.insertelement (новый поплавок (3.9), 3); System.out.println ("Vector v1 (используемый метод insertelementat ():/n/t)"+v1); // Установить объект в указанном положении в качестве нового объекта // объекта после указанной позиции расширены в последовательности v1.setElementat («четыре», 2); System.out.println ("Vector v1 cused method setelmentat ():/n/t"+v1); v1.removeElement (Integer1); // Удалить объект Integer1 из векторного объекта v1 // Поскольку существует несколько Integer1, начните с нуля. // Найти, чтобы удалить первое integer1, найденное. Перечисление enum = v1.elements (); System.out.println («Вектор v1 (используемый метод remodeElememt () is»; while (enum.hasmoreElements ()) System.out.println (enum.nextelement ()+»"); System.out.println () ;// Использование метода Enumeration Class (Encumeration) для получения каждого элемента evectrint. Object1 (Top To-Botton): «+v1.indexof (Integer1)); System.out.println (« Положение Object1 (tottom-top): «+v1.lastindexof (integer1)); // Поиск положения, где объект INTEGER1-в разных направлениях v1.setSize (4); вектор): «+v1); // сбросить размер V1, а избыточные элементы отброшены}} Результаты работы:
E:/java01> java vectorapp Вектор V1 равен: [один, 1,1, два, 2,1,1] вектор v1 (используемый метод insertelementatat ()): [один, 1, три, 3,9,1, два, 2,1,1] вектор V1 (используемый метод setelementat ()) - [один, 1, четыре, 3,1, два, два, 2, 2, 2, 2, 2, 2, 2,1,1, 2, 2, 2, 2,1,1,1, два, два, два, два, 2,1,1,1, два, два, два, два, два, два, два, два, два, два, два, два, два, два, два, два, два, два, два, два, два, два, два, два, два, два, два, два, два, два, два, два, два, два, два, два. v1 (используемый метод removeElement ())-это: одно четыре 3.9 1 два 2 1 1 Положение Object1 (сверху к боттону): 3 Положение Object1 (Botton-to-Top): 7 Новый вектор (измененный вектор): [One, четыре, 3,9,1]
Правило 1x расширение
Помните, будет ли ArrayList расширен до 0,5 раза больше Metaarray каждый раз? Вектор немного отличается от ArrayList при выполнении операций расширения емкости
Защищенный int емкость; // Использование для указания способности для каждого расширения private void grow (int mincapacity) {// переполненный код int oldCapacity = elementData.length; int newCapacity = OldCapacity + ((емкость -инкремент> 0)? емкость INTRENCREMENT: OldCapacity); // Если емкость не указана, способность расширения емкости по умолчанию является емкостью исходной Array If (NewCapacity - Mincapacity <0) Newcapatice = minCapacity; if (newcapacity - max_array_size> 0) newcapacity = gugecapacity (mincapacity); elementData = arrays.copyof (elementdata, newcapacity);}Осторожные друзья могут обнаружить, что в векторе есть дополнительная переменная способности, которая используется для указания увеличения каждого расширения. Если эта переменная не указана, вы можете найти в том, что вектор расширяет емкость по умолчанию в 1 раз превышает исходный массив.
Безопасность нити
Вертор безопасен.
Еще одна более заметная вещь в версионном исходном коде заключается в том, что большинство методов имеют синхронизированное ключевое слово. Все знают, что это ключевое слово используется для синхронизации потоков, поэтому векторный класс безопасен для потока!
Но даже если все его методы изменены, чтобы быть синхронными, это не означает, что при вызове этого нет необходимости в синхронизации:
Частный статический вектор <Integer> vector = new Vector <Integer> (); public static void main (string [] args) {while (true) {for (int i = 0; i <10; i ++) {vector.add (i); } Поток removeThread = new Thread (new Runnable () {@Override public void run () {for (int i = 0; i <vector.size (); i ++) {vector.remove (i);}}}); Thread printThread = new Thread (new Runnable () {@Override public void run () {for (int i = 0; i <vector.size (); i ++) {System.out.println (vector.get (i));}}}); removeThread.Start (); printthread.start (); while (thread.activecount ()> 20); }}После запуска этого кода в течение короткого периода времени вы найдете исключение ArrayIndexoutOfBoundSexception. Хотя метод вектора Get, удалить и размер здесь имеет синхронизированную модификацию, в многопоточной среде, если на стороне метода не принимаются дополнительные меры синхронизации, этот код все еще небезопасен. Если один поток удаляет элемент с серийным номером I, а другой поток обращается к этому I, он будет напрямую бросить исключение. Следовательно, чтобы обеспечить безопасность этого кода, это также требует, чтобы синхронизированная модификация была добавлена для запуска.