>  기사  >  Java  >  Java의 벡터 클래스 사용 예 요약

Java의 벡터 클래스 사용 예 요약

黄舟
黄舟원래의
2017-01-20 11:04:561665검색

Vector의 구현은 기본적으로 ArrayList와 유사합니다. 둘 다 동적 배열을 기반으로 하며 확장도 필요합니다. 다음은 벡터 이해를 돕기 위한 세 가지 간단한 예입니다.

기본 작업 예

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的大小,多余的元素被抛弃  
  } 
}

작업 결과:

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]

Vertor의 1배 확장
ArrayList가 매번 메타어레이 크기의 0.5배로 확장된다는 것을 기억하시나요? Vector는 확장 작업을 수행할 때 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);
}

Vector에 각 확장의 증분을 지정하는 데 사용되는 추가 용량 증분 변수가 있음을 주의깊게 보면 알 수 있습니다. 성장하면 Vector가 기본적으로 원래 배열의 1배로 확장되는 것을 확인할 수 있습니다

스레드 안전성
Vertor는 스레드로부터 안전합니다!
Vertor 소스 코드에서 또 다른 눈에 띄는 점은 대부분의 메소드에 동기화된 키워드가 있다는 것입니다. 이 키워드는 스레드 동기화에 사용된다는 것을 누구나 알고 있으므로 Vector 클래스는 스레드로부터 안전합니다.
그러나 모든 메서드를 동기화하도록 수정하더라도 호출할 때 동기화가 전혀 필요하지 않다는 의미는 아닙니다.

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

모두가 짧은 시간 동안 이 코드를 실행한 후에는 다음을 찾을 수 있습니다. ArrayIndexOutOfBoundsException 예외입니다. Vector의 get, Remove 및 size 메소드가 동기화되지만 멀티 스레드 환경에서 메소드 측에서 추가 동기화 조치가 수행되지 않으면 이 코드는 스레드를 가져온 후에도 여전히 안전하지 않습니다. 일련 번호가 i인 요소, 다른 스레드가 이 i에 액세스하면 직접 예외가 발생합니다. 따라서 이 코드의 안전을 보장하려면 실행 시 동기화 수정을 추가해야 합니다.

위의 사용 방법은 다음과 같습니다. Java의 벡터 클래스 샘플 요약 내용, 더 많은 관련 내용을 보려면 PHP 중국어 웹사이트(www.php.cn)를 참고하세요!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.