자바 배열 목록 대 벡터

개요

이 자습서에서는 배열 목록과 벡터 클래스의 차이점에 초점을 맞출 것입니다. 그들은 모두 자바 컬렉션 프레임 워크에 속하고 자바를 구현합니다.유틸리티목록 인터페이스.

그러나 이러한 클래스는 구현에 상당한 차이가 있습니다.

무엇이 다른가?

빠른 시작으로서,배열리스트와 벡터의 주요 차이점을 제시해보자. 그런 다음,우리는 더 자세히 포인트 중 일부를 논의 할 것이다:

  • 동기화-이 둘 사이의 첫 번째 주요 차이점. 527>
  • 크기 증가-둘 사이의 또 다른 차이점은 용량에 도달하는 동안 크기를 조정하는 방식입니다. 벡터는 크기를 두 배로 늘립니다. 반면 배열 목록은 반복 길이의 절반 만 증가하고 벡터는 반복기와 열거를 사용하여 요소를 탐색 할 수 있습니다. 반면에 배열리스트는 반복자 만 사용할 수 있습니다.
  • 성능–주로 동기화로 인해 벡터 연산은 배열리스트에 비해 느리다
  • 프레임워크–또한 배열리스트는 컬렉션 프레임워크의 일부이며,1.2 에서 소개되었다. 한편,벡터는 레거시 클래스로 자바의 이전 버전에 존재한다.

벡터

다른 한편으로,우리는 벡터에 대한 몇 가지 핵심 세부 사항을 제시 할 것입니다.

간단히 말해서 벡터는 크기 조정이 가능한 배열입니다. 그것은 성장하고 우리가 추가 또는 요소를 제거로 축소 할 수 있습니다.

우리는 전형적인 방식으로 벡터를 만들 수 있습니다.:

Vector<String> vector = new Vector<>();

기본 생성자는 초기 용량이 10 인 빈 벡터를 만듭니다.

몇 가지 값을 추가해 보겠습니다.:

vector.add("baeldung");vector.add("Vector");vector.add("example");

그리고 마막로,반복기 를 사 값 반복 수 습니다:

Iterator<String> iterator = vector.iterator();while (iterator.hasNext()) { String element = iterator.next(); // ...}

또는 열거를 사용하여 벡터를 통과 할 수 있습니다:

Enumeration e = vector.elements();while(e.hasMoreElements()) { String element = e.nextElement(); // ... }

이제 자신의 고유 한 기능 중 일부를 더 깊이 살펴 보겠습니다.

동시성

우리는 이미 배열 목록과 벡터가 동시성 전략에서 다르다는 것을 언급했지만 자세히 살펴 보겠습니다. 우리는 벡터의 메소드 서명에 뛰어들 수 있다면,우리는 각각 동기화 된 키워드를 가지고 볼 것:

public synchronized E get(int index)

간단히 말해서,이는 한 번에 하나의 스레드 만 주어진 벡터에 액세스 할 수 있음을 의미합니다.

하지만 실제로이 작업 수준 동기화는 어쨌든 복합 작업에 대한 자체 동기화와 겹쳐 져야합니다.

반대로 배열리스트는 다른 접근 방식을 취합니다. 해당 메서드는 동기화되지 않으며 이 문제는 동시성 전용 클래스로 분리됩니다.

예를 들어,카피온라이터레일리스트 또는 컬렉션을 사용할 수 있습니다.벡터와 유사한 효과를 얻기 위해 동기화 목록:

vector.get(1); // synchronizedCollections.synchronizedList(arrayList).get(1); // also synchronized

성능

위에서 이미 설명한 것처럼 벡터가 동기화되어 성능에 직접적인 영향을 미칩니다.

벡터 대 배열 목록 작업 간의 성능 차이를 확인하려면 간단한 벤치마크 테스트를 작성해 보겠습니다.

과거에는 배열리스트 연산의 시간 복잡성을 살펴보았으므로 벡터에 대한 테스트 사례를 추가해 보겠습니다.

먼저 가져 오기()방법을 테스트 해 보겠습니다.:

@Benchmarkpublic Employee testGet(ArrayListBenchmark.MyState state) { return state.employeeList.get(state.employeeIndex);}@Benchmarkpublic Employee testVectorGet(ArrayListBenchmark.MyState state) { return state.employeeVector.get(state.employeeIndex);}

3 개의 스레드와 10 개의 워밍업 반복을 사용하도록 구성합니다.

그리고 나노초 수준에서 작업 당 평균 시간을보고합시다:

Benchmark Mode Cnt Score Error UnitsArrayListBenchmark.testGet avgt 20 9.786 ± 1.358 ns/opArrayListBenchmark.testVectorGet avgt 20 37.074 ± 3.469 ns/op

우리는 배열 목록#가져 오기가 벡터#가져 오기보다 약 3 배 빠르게 작동한다는 것을 알 수 있습니다.

이제 포함()작업의 결과를 비교해 보겠습니다:

@Benchmarkpublic boolean testContains(ArrayListBenchmark.MyState state) { return state.employeeList.contains(state.employee);}@Benchmarkpublic boolean testContainsVector(ArrayListBenchmark.MyState state) { return state.employeeVector.contains(state.employee);}

그리고 결과를 인쇄하십시오:

Benchmark Mode Cnt Score Error UnitsArrayListBenchmark.testContains avgt 20 8.665 ± 1.159 ns/opArrayListBenchmark.testContainsVector avgt 20 36.513 ± 1.266 ns/op

우리가 볼 수 있듯이,포함()연산에 대해 벡터의 성능 시간은 배열 목록보다 훨씬 길다.

요약

이 기사에서는 자바의 벡터 클래스와 배열리스트 클래스의 차이점을 살펴 보았습니다. 또한,우리는 또한 더 많은 세부 사항에 벡터 기능을 제시.

평소와 같이,이 문서의 전체 코드를 통해 사용할 수 있습니다.

봄 학습 과정을 통해 봄 5 와 봄 부팅 2 를 시작하십시오:

>> 과정을 체크 아웃



+