ArrayList와 Vector의 차이점은 무엇입니까?


352

두 데이터 구조 ArrayListVector 의 차이점은 무엇이며 각각의 위치를 ​​어디에서 사용해야합니까?


5
여기에 정확한 사본이 표시되지 않습니다.
Jeff Atwood

2
글쎄, 당신은 자바에서 벡터를 만들 수 있습니다 Vector v = new Vector(3, 2);
sgsi

절대 사용 Vector, 사용 ArrayList하거나 LinkedList또는ArrayDeque

답변:


365

차이점

  • 벡터는 동기화되고 ArrayList는 동기화되지 않습니다.
  • 데이터 성장 방법

Vector를 사용하기위한 특정 요구 사항이없는 경우 ArrayLists를 사용하십시오.

동기화

여러 스레드가 동시에 ArrayList에 액세스하는 경우 목록을 구조적으로 또는 간단하게 수정하는 코드 블록을 외부에서 동기화해야합니다. 구조적 수정은 목록에서 요소를 추가 또는 삭제하는 것을 의미합니다. 기존 요소의 값을 설정하는 것은 구조적인 수정이 아닙니다.

Collections.synchronizedList 목록에 실수로 동기화되지 않은 액세스를 피하기 위해 일반적으로 목록을 만들 때 사용됩니다.

참고

데이터 증가

내부적으로 ArrayList와 Vector는 모두 Array를 사용하여 내용을 유지합니다. 요소가 ArrayList 또는 Vector에 삽입 될 때 객체의 공간이 부족하면 내부 배열을 확장해야합니다. Vector는 기본적으로 배열 크기를 두 배로 늘리는 반면 ArrayList는 배열 크기를 50 % 증가시킵니다.

참고


7
@Rei 고 말했다 정확히 무엇을 : 다중 스레드 ( docs.oracle.com/javase/tutorial/essential/concurrency/... )
RecursiveExceptionException

다중 스레드 방식으로 ArrayList에서 읽기는 어떻습니까? 스레드 안전합니까?
Xunie

@Xunie ArrayList 또는 다른 컬렉션 클래스에서 읽는 것은 결코 문제가되지 않습니다. 기존 값을 ArrayList 또는 컬렉션에 추가하거나 제거하거나 수정할 때 문제가 발생합니다.
sainath reddy

85

설명서에서 알 수 있듯이 a Vector와 a ArrayList는 거의 같습니다. 차이점은 a에 대한 액세스 Vector는 동기화되지만 a에 대한 액세스 는 동기화 ArrayList되지 않는다는 것입니다. 이것은 한 번에 하나의 스레드 만 메소드를 호출 할 수 Vector있으며 잠금을 얻는 데 약간의 오버 헤드가 있음을 의미합니다. 을 사용하는 ArrayList경우에는 그렇지 않습니다. 일반적으로 ArrayList; 단일 스레드의 경우 더 나은 선택이며, 다중 스레드의 경우 잠금을보다 잘 제어 할 수 있습니다. 동시 읽기를 허용 하시겠습니까? 좋아. 10 회의 쓰기로 한 번의 동기화를 원하십니까? 또한 괜찮습니다. 그것은 약간의주의를 기울여야하지만, 원하는 것 같습니다. 또한 ArrayList가 있으면 다음을 사용할 수 있습니다.Collections.synchronizedList함수는 동기화 된 목록을 생성하여 a와 동등한 것을 얻습니다 Vector.


53

VectorA는 깨진 입니다 클래스 하지 가 "동기화"되고되고에도 불구하고, 스레드 학생들과 다른 경험이 프로그래머에 의해 사용되는.

ArrayList 전문가와 숙련 된 프로그래머가 사용하는 Go-to List 구현입니다.

스레드 세이프 목록 구현을 원하는 전문가는를 사용합니다 CopyOnWriteArrayList.


10
동기화되었지만 스레드 안전하지 않습니까? 무슨 뜻이에요? [나는 초보자입니다]
Dineshkumar

13
@Dineshkumar Vector는 스레드 세이프 를 의도 했지만 실제로 스레드 세이프 가 아닌 디자인 결함이 있습니다. 기본적으로 더 이상 사용되지 않는 클래스입니다. 어떤 이유로, 대학 등은이 소식에 대해 들어 보지 못했지만 여전히 그 사용을 옹호합니다.
보헤미안


3
@ Dineshkumar 죄송합니다-그것은 좋은 링크가 아니 었습니다. 여기에 확실한 대답이 있습니다. 요컨대, 그 동기화는 쓸모가 없습니다.
보헤미안

7
재미있는 사실 : Java1.7의 스택은 Vector 클래스를 사용합니다.
Tobi

26

ArrayList 더 새롭고 20-30 % 빠릅니다.

에서 명백하게 명백한 것이 필요하지 않은 Vector경우ArrayList


32
의 증거를 제시함으로써 그 주장을지지 할 수 있습니까 20-30% faster?
사용자

5
@user 당시에 그것은 거대한 배열을 주장하는 개인적인 경험이었습니다. 3 년이 지난 지금, 내가 말한 것을 정확하게 지적 할 수는 없지만 많은 벤치 마크가 있습니다. 가장 큰 점프를 볼 수있는 스레딩 (threading)까지는 아니지만 여기에는 javacodegeeks.com/2010/08/…
Oli

성장 함수가 가장 큰 영향을 미치므로 20-30 %는 벡터 / 배열 목록을 읽고 쓰는 경우에만 일치합니다. 당신은 그 수행은 다른 결과를 제공 할 것입니다 읽기 번만 기록 벤치 마크가있는 경우
토비

2
귀하의 데이터에 대한 증거를 제공해주십시오
wiredmark

벡터가 동기화되고 arraylist가 동기화되지 않기 때문에 arraylist가 벡터보다 빠릅니다.
ASK

23

Vector와 ArrayList에는 크게 두 가지 차이점이 있습니다.

  1. 벡터는 기본적으로 동기화되며 ArrayList는 동기화되지 않습니다. 참고 : arraylist 객체를 Collections.synchronizedList () 메서드에 전달하여 ArrayList도 동기화 할 수 있습니다. 동기화 된 수단 : 부작용없이 여러 스레드와 함께 사용할 수 있습니다.

  2. 새 요소에 공간이 충분하지 않으면 ArrayLists가 이전 크기의 50 % 증가합니다. 여기서 새 수신 요소에 대한 공간이 없으면 Vector가 이전 크기의 100 % 증가합니다.

이 외에도 프로그래밍 노력 측면에서 실질적인 차이점이 있습니다.

  1. Vector에서 특정 위치의 요소를 가져 오기 위해 elementAt (int index) 함수를 사용합니다. 이 함수 이름은 매우 길다. ArrayList에서 이것을 대신하여 우리는 기억하고 사용하기 매우 쉬운 (int index)를 얻습니다 .
  2. 마찬가지로 Vector에서 기존 요소를 새 요소로 바꾸려면 setElementAt () 메서드를 사용하면 다시 길어지고 프로그래머가 반복적으로 사용하도록 자극 할 수 있습니다. 이 ArrayList 대신 사용하고 기억하기 쉬운 add (int index, object) 메소드가 있습니다. 이와 같이 그들은 ArrayList에서 더 프로그래머 친화적이고 사용하기 쉬운 함수 이름을 가지고 있습니다.

언제 사용합니까?

  1. 벡터를 완전히 사용하지 마십시오. ArrayLists는 Vector가 할 수있는 모든 것을 할 수 있습니다. 기본적으로 더 많은 ArrayList는 동기화되지 않습니다. 원하는 경우 Collections util 클래스를 사용하여 필요할 때 언제든지 동기화 할 수 있습니다.
  2. ArrayList는 기억하기 쉽고 함수 이름을 사용합니다.

참고 : arraylist가 100 % 증가하더라도 ensurecapacity () 메서드를 사용하면 초기 단계에서 충분한 메모리를 할당 할 수 있으므로이를 피할 수 있습니다.

도움이 되길 바랍니다.


5
ArrayLIst 및 Vector의 크기가 커지면 잘못된 정보 (전환)가 발생합니다. 그렇지 않으면 좋은 대답입니다.
Nenad Bulatovic

ArrayList에서 " docs.oracle.com/javase/7/docs/api/java/util/Vector.html 을 사용 하여 Vector의 증가가 두 배로 증가 함 지속적인 상각 시간 비용. " docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html
Mohamed El-Nakib

메소드 이름이 해당 메소드를 사용하거나 사용하지 않는 기준이 될 수있는 방법을 이해하지 못합니다.
Surender Kherwa '11

14

ArrayList그리고 Vector모두 구현 목록 인터페이스 및 삽입을 유지 틀리지 사이에는 많은 차이가 ArrayListVector클래스는 ...

배열 목록 -

  1. ArrayList 동기화되지 않았습니다.
  2. ArrayList 요소 수가 용량을 초과하면 현재 배열 크기의 50 %를 증가시킵니다.
  3. ArrayList 레거시 클래스가 아니며 JDK 1.2에 도입되었습니다.
  4. ArrayList 동기화되지 않았기 때문에 빠릅니다.
  5. ArrayList Iterator 인터페이스를 사용하여 요소를 순회합니다.

스톡 콘텐츠 -

  1. Vector 동기화됩니다.
  2. Vector 100 % 씩 증가는 요소의 총 수가 용량을 초과하면 배열 크기가 두 배가됨을 의미합니다.
  3. Vector 레거시 클래스입니다.

  4. Vector 멀티 스레딩 환경에서 동기화되기 때문에 속도가 느립니다. 즉, 현재 스레드가 객체 잠금을 해제 할 때까지 다른 스레드를 실행 가능 또는 실행 불가능 상태로 유지합니다.

  5. VectorEnumeration 인터페이스를 사용하여 요소를 순회합니다. 그러나 Iterator도 사용할 수 있습니다.

참조 : https://www.javatpoint.com/difference-between-arraylist-and-vector


10

기본적으로 ArrayList와 Vector는 모두 내부 Object Array를 사용합니다.

ArrayList : ArrayList 클래스는 AbstractList를 확장하고 List 인터페이스와 RandomAccess (마커 인터페이스)를 구현합니다. ArrayList는 필요에 따라 확장 할 수있는 동적 배열을 지원합니다. 요소에 대한 첫 번째 반복을 제공합니다. ArrayList는 내부 객체 배열을 사용합니다. 기본 초기 크기는 10으로 작성됩니다.이 크기를 초과하면 콜렉션이 자동으로 기본 크기의 절반 인 15로 증가합니다.

Vector : Vector는 ArrayList와 유사하지만 차이점은 동기화되며 기본 초기 크기는 10이며 크기를 초과 할 때 크기가 원래 크기의 두 배로 증가하면 새 크기는 20이됩니다. Vector는 유일한 클래스입니다. RandomAccess를 구현하는 ArrayList 이외의 벡터는 하나 중 4 생성자 데하여 두 개의 매개 변수 벡터 (INT 파라미터 : initialCapacity, INT은 capacityIncrement) 은 capacityIncrement는 용량이 증가되는 양 때 벡터 오버 플로우가 부하율보다 효율적으로 제어 할 수 있으므로.

다른 차이점은 다음과 같습니다. 여기에 이미지 설명을 입력하십시오


1
LinkedList에서 처음과 끝에 객체를 추가하는 것이 왜 느린가요? arrayList 및 vector보다 빠르지 않아야합니까?
CHANist

@CHANist 나도 동의합니다. 시작과 끝에 객체를 추가하는 것이 객체의 중간에 객체를 추가하는 것보다 빠릅니다.
Rahul Rastogi

1
이 테이블의 LinkedList 열에 사용 된 언어가 모순됩니다. LinkedList 앞에 추가하고 추가하는 것은 중간에 요소를 추가하는 것보다 빠르지 만 ArrayList 또는 Vector에 추가하거나 추가하는 것보다 느립니다. 삽입 할 때마다 로컬이 아닌 참조로 메모리를 할당해야하기 때문에 캐시 누락 가능성이 높아집니다. LinkedList의 조회는 요소 수와 선형이며 끝에 대한 포인터가 저장되지 않지만 한 요소에 대해서만 메모리가 재 할당되므로 추가하는 것이 앞에 붙는 것보다 빠릅니다.
소피아 골드
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.