Heim  >  Artikel  >  Java  >  Detaillierte Erläuterung der Instanzmethoden der Vektorklasse

Detaillierte Erläuterung der Instanzmethoden der Vektorklasse

Y2J
Y2JOriginal
2017-05-06 13:26:222086Durchsuche

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

[Verwandte Empfehlungen]

1.

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn