Java Vector 및 Arraylist의 비교
오늘 저는 벡터와 어레이리스트의 소스 코드를 연구 하고이 두 클래스에 대한 이해를 심화 시켰습니다.
목록 인터페이스에는 ArrayList, Vector 및 LinkedList의 세 가지 클래스가 있습니다. LinkedList에 대해 많이 말하지 않으며 일반적으로 데이터 삽입 순서를 유지하는 데 사용됩니다.
Arraylist와 Vector는 배열을 사용하여 구현되며 세 가지 주요 차이점이 있습니다.
1. 벡터는 다중 스레드와 안전하지만 Arraylist는 그렇지 않습니다. 소스 코드에서 볼 수 있습니다. 벡터 클래스의 많은 방법은 동기화되어 수정되며, 이는 ArrayList와 비교할 수없는 벡터의 효율로 이어집니다.
2. 둘 다 선형 연속 공간 저장 요소를 사용하지만 공간이 불충분하면 두 클래스가 다르게 추가됩니다. 많은 네티즌은 벡터가 원래 공간을 두 배로 늘리고 배열리스트는 원래 공간을 50%증가 시킨다고 말합니다. 사실, 이것은 거의 동일합니다. 그러나 소스 코드에서 볼 수있는 몇 가지 문제가 있으며 나중에 소스 코드에서 분석됩니다.
3. 벡터는 성장 계수를 설정할 수 있지만 Arraylist는 할 수 없습니다. 내가 이것을 처음 보았을 때, 나는 증분 요인이 무엇인지 이해하지 못했습니다. 그러나 두 소스 코드를 비교하여 이것을 이해했습니다. 먼저 두 클래스의 구성 방법을 살펴 보겠습니다.
ArrayList에는 세 가지 시공 방법이 있습니다.
public arraylist (int initialcapacity) // 지정된 초기 용량으로 빈 목록을 구성합니다. public arraylist () // 초기 용량 10 인 빈 목록을 구성합니다. public arraylist (collection <? extends e> c) // 지정된 컬렉션을 포함하는 요소 목록을 작성하십시오.
벡터에는 4 개의 생성자가 있습니다.
public vector () // 지정된 초기 용량 및 용량 증분을 0과 같은 빈 벡터를 구성합니다. 공개 벡터 (int initialcapacity) // 빈 벡터를 구성하여 내부 데이터 배열의 크기를 만들고 표준 용량 증가는 0입니다. public 벡터 (collection <? extends e> c) // 지정된 컬렉션 공개 벡터 (int initialcapacity, int papactincrement)에 포함 요소가 포함 된 벡터를 구성합니다. // 지정된 초기 용량 및 용량 증분을 사용하여 빈 벡터를 구성합니다.
벡터는 ArrayList보다 하나가 더 있습니다. 그렇습니다. 공개 벡터의 구성 방법 (Int InitialCapacity, Int Appationincrement). Apactionincrement는 용량 성장이며, 이는 위에서 언급 한 성장 인자이며 Arraylist에서는 사용할 수 없습니다.
그런 다음 두 개의 클래스를 게시하여 소스 코드 분석을 추가합니다 (JDK1.7 버전) :
// ArrayList 클래스 추가 소스 코드 : public boolean add (e e) {ensurecapacity internal (size + 1); // MODCOUNT를 증가시킵니다 !! ElementData [size ++] = e; 진실을 반환하십시오. } private void ensureCapacityInternal (int mincapacity) {modcount ++; // 오버 플로우에 민감한 코드 // 요소를 추가 한 후 새 컨테이너의 크기가 컨테이너의 용량보다 크면 값을 저장할 수 없습니다. (MinCapacity -ElementData.Length> 0)가 성장하는 경우 공간을 확장해야합니다 (MinCapacity). } private void grow (int mincapacity) {// 오버 플로우에 민감한 코드 int oldcapacity = elementData.length; int newCapacity = OldCapacity + (OldCapacity >> 1); // 확장 공간이 50% 증가합니다 (즉, 원본의 1.5 배) if (newCapacity -MinCapacity <0) // 컨테이너가 여전히 확장 후 충분하지 않은 경우, mincapacity를 컨테이너 크기로 설정했습니다. newCapacity = mincapacity; if (newCapacity -max_array_size> 0) // 확장 된 컨테이너가 너무 크면 hugecapacity newCapacity = hugecapacity (mincapacity)를 실행합니다. // mincapacity는 일반적으로 크기에 가깝기 때문에 이것은 다음과 같습니다. elementData = arrays.copyof (elementData, newCapacity); } 벡터 클래스에 소스 코드 추가 :
Public Synchronized Boolean Add (E E) {ModCount ++; ensurecapacityHelper (ElementCount + 1); ElementData [ElementCount ++] = e; 진실을 반환하십시오. } private void ensurecapicationyHelper (int mincapacity) {// 오버 플로우에 민감한 코드 if (minCapacity -ElementData.length> 0) grow (mincapacity); } private void grow (int mincapacity) {// 오버 플로우에 민감한 코드 int oldcapacity = elementData.length; int newCapacity = OldCapacity + ((AppartionInCrement> 0)? 용량 인증 : OldCapacity); /**이 용량 확장에는 판단이 필요합니다. 용량 증분이 설정되지 않으면 확장 후 용량은 (OldCapacity+OldCapacity)이며 원래 용량의 두 배입니다. **/ if (newCapacity -MinCapacity <0) newCapacity = mincapacity; if (newCapacity -max_array_size> 0) newCapacity = hugecapacity (mincapacity); elementData = arrays.copyof (ElementData, newCapacity); }분석을 통해 지금 이해할 수 있어야합니다!
읽어 주셔서 감사합니다. 도움이되기를 바랍니다. 이 사이트를 지원 해주셔서 감사합니다!