In diesem Artikel wird hauptsächlich die detaillierte Verwendung der Java-Vektorklasse vorgestellt und relevante Informationen zu Beispielen finden Sie unter
Grundlegende Operationsbeispiele
VectorApp.java
import java.util.Vector; import java.lang.*; import java.util.Enumeration; public class VectorApp { public static void main(String args[]) { Vector v1 = new Vector(); Integer integer1= new Integer(1); //加入为字符串对象 v1.addElement("one"); //加入的为integer的对象 v1.addElement(integer1); v1.addElement(integer1); v1.addElement("two"); v1.addElement(new Integer(2)); v1.addElement(integer1); v1.addElement(integer1); //转为字符串并打印 System.out.println("The Vector v1 is:\n\t"+v1); //向指定位置插入新对象 v1.insertElement("three",2); v1.insertElement(new Float(3.9),3); System.out.println("The Vector v1(used method insertElementAt()is:\n\t)"+v1); //将指定位置的对象设置为新的对象 //指定位置后的对象依次往后顺延 v1.setElementAt("four",2); System.out.println("The vector v1 cused method setElmentAt()is:\n\t"+v1); v1.removeElement(integer1); //从向量对象v1中删除对象integer1 //由于存在多个integer1,所以从头开始。 //找删除找到的第一个integer1. Enumeration enum = v1.elements(); System.out.println("The vector v1 (used method removeElememt()is"); while(enum.hasMoreElements()) System.out.println(enum.nextElement()+""); System.out.println(); //使用枚举类(Enumeration)的方法取得向量对象的每个元素。 System.out.println("The position of Object1(top-to-botton):"+v1.indexOf(integer1)); System.out.println("The position of Object1(tottom-to-top):"+v1.lastIndexOf(integer1)); //按不同的方向查找对象integer1所处的位置 v1.setSize(4); System.out.println("The new Vector(resized the vector)is:"+v1); //重新设置v1的大小,多余的元素被抛弃 } }
Laufendes Ergebnis:
E:\java01>java VectorApp The vector v1 is:[one,1,1,two,2,1,1] The vector v1(used method insetElementAt()) is: [one,1,three,3.9,1,two,2,1,1] The vector v1(used method setElementAt()) is: [one,1,four,3.9,1,two,2,1,1] The vector v1(useed method removeElement()) is: one four 3.9 1 two 2 1 1 The position of object1(top-to-botton):3 The position of object1(botton-to-top):7 The new Vector(resized the vector) is: [one,four,3.9,1]
1x Erweiterung von Vertor
Erinnern Sie sich noch daran, dass die ArrayList jedes Mal auf das 0,5-fache der Größe des ElementArrays erweitert wird? Vector unterscheidet sich bei der Durchführung von Erweiterungsvorgängen geringfügig von ArrayList
protected int capacityIncrement;//用于指定每次扩容的容量 private void grow(int minCapacity) { // overflow-conscious code int oldCapacity = elementData.length; int newCapacity = oldCapacity + ((capacityIncrement > 0) ? capacityIncrement : oldCapacity);//如不指定capacityIncrement,默认扩容的容量为原数组的容量 if (newCapacity - minCapacity < 0) newCapacity = minCapacity; if (newCapacity - MAX_ARRAY_SIZE > 0) newCapacity = hugeCapacity(minCapacity); elementData = Arrays.copyOf(elementData, newCapacity); }
Aufmerksame Freunde können feststellen, dass es in Vector eine zusätzliche KapazitätsInkrementVariable gibt, mit der das Inkrement für jede Erweiterung angegeben wird. Menge: Wenn Sie diese Variable nicht angeben, können Sie in Grow feststellen, dass der Vektor standardmäßig auf das 1-fache des ursprünglichen Arrays erweitert wird
ThreadSicherheit
Vertor ist threadsicher!
Eine weitere auffällige Sache im Vertor-Quellcode ist, dass die meisten Methoden das synchronisierte Schlüsselwort haben. Jeder weiß, dass dieses Schlüsselwort für die Thread-Synchronisierung verwendet wird, daher ist die Vector-Klasse ein Thread-sicher!
Aber selbst wenn alle seine Methoden so geändert werden, dass sie synchronisiert werden, bedeutet dies nicht, dass beim Aufrufen nie eine Synchronisierung erforderlich sein wird:
private static Vector<Integer> vector=new Vector<Integer>(); public static void main(String[] args) { while(true) { for(int i=0;i<10;i++) { vector.add(i); } Thread 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); } }
Jeder führt diesen Absatz nach dem Ausführen aus Wenn Sie den Code für kurze Zeit nicht verwenden, finden Sie eine ArrayIndexOutOfBoundsException
-Ausnahme. Obwohl die Vector的get,remove,size
-Methode hier mit synchronized
geändert wird, können Sie in einer Multithread-Umgebung keine zusätzlichen Synchronisierungsmaßnahmen auf der Methodenseite ergreifen Dieser Code ist immer noch unsicher. Wenn ein Thread das Element mit der Seriennummer i löscht und ein anderer Thread auf dieses i zugreift, wird eine Ausnahme ausgelöst. Um die Sicherheit dieses Codes zu gewährleisten, müssen Sie daher Modifikation im Inneren run
. synchronized
Kostenloses Java-Video-Tutorial
2.Java-Einsteiger-Video-Tutorial
3.FastJson-Entwicklungs-Tutorial
Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Instanzmethoden der Vektorklasse. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!