기본 작동 예
VectorApp.java
import java.util.vector; java.lang.*; java.util.enumeration 가져 오기; public class vectorapp {public static void main (String args []) {vector v1 = new vector (); 정수 정수 1 = 새로운 정수 (1); // 문자열 객체 v1.adlement ( "one")를 추가합니다. // 정수 객체 v1.adlement (integer1); v1.addlement (integer1); v1.addlement ( "2"); v1.addlement (New Integer (2)); v1.addlement (integer1); v1.addlement (integer1); // 문자열 및 인쇄 시스템으로 변환. // 지정된 위치에 새 개체를 삽입 v1.InsertElement ( "Three", 2); v1.insertelement (New Float (3.9), 3); System.out.println ( "벡터 v1 (사용 된 메소드 insertElementat ()은 :/n/t)"+v1); // 지정된 위치에 객체를 새 개체로 설정 // 지정된 위치의 객체는 순서 v1.setElementat ( "Four", 2)에서 확장됩니다. System.out.println ( "벡터 v1 코스 메소드 setelmentat ()은 :/n/t"+v1); v1.removeElement (integer1); // 벡터 객체 v1에서 객체 integer1을 삭제하십시오. // 여러 Integer1이 있기 때문에 처음부터 시작하십시오. // 발견 된 첫 번째 integer1을 삭제하는 것을 찾으십시오. 열거 ENUM = V1.ELEMENTS (); System.out.println ( "벡터 v1 (사용 된 메소드 removeLememt () is"); Object1 (Top-to-Botton) : "+v1.indexof (integer1)); system.out.println ("대상의 위치 (tottom-to-top)) : "+v1.lastindexof (integer1)); // 객체 INTEGER1이 다른 방향에있는 위치를 검색 v1.setsize (4); 벡터) IS : "+v1); // v1의 크기를 재설정하고 초과 요소는 폐기됩니다}} 실행 결과 :
e :/java01> java vectorApp 벡터 v1은 다음과 같습니다. [1, 1,1, 2, 2,1,1] 벡터 v1 (사용 된 메소드 insertElementat ())은 다음과 같습니다. v1 (사용 된 메소드 removeElement ())은 : 1 개의 4 3.9 1 2 2 1 1 Object1의 위치 (상단-투-바트 턴) : 3 Object1 (Botton-to-top) : 7 새 벡터 (벡터 크기) : [1, 4, 3.9,1]
버터의 1 배 확장
ArrayList가 매번 메타 어레이의 0.5 배로 확장되었는지 기억하십니까? 용량 확장 작업을 수행 할 때 벡터는 Arraylist와 약간 다릅니다.
보호 된 int papactincrement; // 각 확장 용량을 지정하는 데 사용 개인 무효화 (int mincapacity) {// 오버 플로우에 민감한 코드 int OldCapacity = elementData.length; int newCapacity = OldCapacity + ((AppartionIncrement> 0)? pactionincrement : OldCapacity); // 용량이 지정되지 않은 경우 기본 용량 확장 용량은 원래 배열의 용량입니다. if (newCapacity -max_array_size> 0) newCapacity = hugecapacity (mincapacity); ElementData = arrays.copyof (ElementData, NewCapacity);}신중한 친구들은 벡터에 추가적인 용량 인식 변수가 있음을 알 수 있으며, 이는 각 확장의 증분을 지정하는 데 사용됩니다. 이 변수가 지정되지 않은 경우 벡터가 원래 배열의 1 배로 기본적으로 용량을 확장한다는 점을 찾을 수 있습니다.
실 안전
버터는 스레드 안전합니다!
Vertor 소스 코드에서 더 눈에 띄는 또 다른 것은 대부분의 메소드가 키워드를 동기화한다는 것입니다. 이 키워드는 스레드 동기화에 사용된다는 것을 모두 알고 있으므로 벡터 클래스는 스레드 안전입니다!
그러나 모든 방법이 동기화되도록 수정 되더라도 호출 할 때 동기화가 필요하지 않다는 것을 의미하지는 않습니다.
개인 정적 벡터 <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 스레드 (new Runnable () {@override public void run () {for (int i = 0; i <vector.size (); i ++) {vector.remove (i);}}}); 스레드 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, Remove 및 Size 방법은 다중 스레드 환경에서 동기화 된 수정을 가지고 있지만, 메소드 측면에서 추가 동기화 측정이 수행되지 않으면이 코드는 여전히 안전하지 않습니다. 하나의 스레드가 일련 번호 I으로 요소를 삭제하고 다른 스레드 가이 I에 액세스하면 예외를 직접 던집니다. 따라서이 코드의 안전을 보장하려면 동기화 된 수정을 추가하려면 추가해야합니다.