배열 목록과 벡터의 차이점 자바
배열 목록과 벡터는 모두 배열을 내부적으로 데이터 구조로 사용합니다. 그러나 데이터를 저장하고 처리하는 방식에는 차이가 거의 없습니다. 이 게시물에서 우리는 배열 목록과 벡터의 차이점과 유사점에 대해 논의 할 것입니다.
배열 목록 대 벡터:
1)동기화:배열 목록이 동기화되지 않아 여러 스레드가 배열 목록에서 동시에 작동 할 수 있습니다. 예를 들어 한 스레드가 배열 목록에서 추가 작업을 수행하는 경우 벡터가 동기화되는 동안 다중 스레드 환경
에서 배열 목록에서 제거 작업을 동시에 수행하는 다른 스레드가 있을 수 있습니다. 즉,한 스레드가 벡터에서 작업하는 경우 다른 스레드는 벡터를 보유 할 수 없습니다. 배열 목록과 달리 한 번에 하나의 스레드 만 벡터에 대한 작업을 수행 할 수 있습니다.
2)크기 조정:배열 목록과 벡터 모두 동적으로 성장하고 축소하여 최적의 스토리지 사용을 유지할 수 있지만 크기 조정 방법은 다릅니다. 배열 목록은 크기를 조정할 때 크기의 절반만큼 커지며 벡터는 성장할 때 기본적으로 자체 크기를 두 배로 늘립니다.
3)성능:배열리스트는 동기화되지 않기 때문에 더 나은 성능을 제공합니다. 벡터 연산은 스레드 안전하므로 성능이 저하되며 벡터에서 작동하는 스레드는 잠금이 해제 될 때까지 다른 스레드를 기다리게하는 잠금을 얻습니다.
4)실패-빠른:먼저 실패-빠른 것을 설명하겠습니다.: 반복자의 추가 또는 제거 방법을 제외하고 컬렉션(배열 목록,벡터 등)이 구조적으로 수정되면 반복자를 만든 후 반복자는ConcurrentModificationException
를 던집니다. 구조 수정은 컬렉션에서 요소의 추가 또는 삭제를 의미합니다.
벡터 자바 독에 따라 벡터에 의해 반환 된 열거 형은 실패 속도가 빠르지 않습니다. 다른 측면에서 배열리스트에 의해 반환 된 반복기 및 리스티터는 실패 속도가 빠릅니다.
5)누가 정말 수집 프레임 워크에 속하는? 벡터 컬렉션 프레임 워크의 일부가 아니었다,그것은 나중에 컬렉션에 포함 된. 레거시 코드로 간주 될 수 있습니다. 목록 모음이 할 수없는 벡터에 대해서는 아무것도 없습니다. 따라서 벡터는 피해야한다. 스레드로부터 안전한 작업이 필요한 경우 이 게시물의 다음 섹션에서 설명한대로 배열 목록을 동기화하거나 스레드 안전 버전의 배열 목록 인 카피온라이트레일리스트를 사용하십시오.
이러한 클래스 간에는 다음과 같은 유사점이 거의 없습니다:
- 벡터와 배열 목록 모두 확장 가능한 배열 데이터 구조를 사용합니다.
- 이러한 클래스(벡터 및 배열 목록)에 의해 반환되는 반복기 및 리스티터는 실패 속도가 빠릅니다.
- 둘 다 요소 삽입 순서를 유지할 때 정렬 된 컬렉션 클래스입니다.
- 벡터&배열 목록은 중복 값과 널 값을 모두 허용합니다.
- 둘 다 오버플로 및 삭제가 발생하면 자동으로 커지고 줄어 듭니다.
배열 목록을 사용할 때와 벡터를 사용할 때?
그것은 필요조건에 완전히 달려 있습니다. “스레드 안전”작업을 수행 할 필요가있는 경우 벡터는 한 번에 하나의 스레드 만 컬렉션에 액세스 할 수 있도록하기 때문에 최선의 방법입니다.
성능:동기화된 작업은 동기화되지 않은 작업에 비해 더 많은 시간을 소비하므로 스레드 안전 작업이 필요하지 않은 경우 동시 프로세스로 인해 성능이 향상되므로 배열 목록이 더 좋습니다.
배열 목록을 동기화하는 방법?
위에서 언급했듯이 배열 목록 방법은 동기화되지 않지만 여전히 필요한 경우 다음과 같이 동기화 할 수 있습니다.
//Use Collecions.synzhonizedList methodList list = Collections.synchronizedList(new ArrayList());...//If you wanna use iterator on the synchronized list, use it//like this. It should be in synchronized block.synchronized (list) { Iterator iterator = list.iterator(); while (iterator.hasNext()) ... iterator.next(); ...}