문제

사람은 좋은 엄지손가락의 규칙에 대한 선택의 다른 구현 Java 컬렉션의 인터페이스트 또는 집합이 있습니까?

예를 들어,일반적으로 왜 또는 어떤 경우에 따라서는 것이 내가 사용하는 것을 선호하는 벡터 또는 배열을 이 해시 테이블 또는 HashMap?

도움이 되었습니까?

해결책

나는 항상 그 결정에 개별 사례에 따라 사용할 경우,같은:

  • 이 필요한가요 주문을 유지?
  • 니다 내가 null 로 키/값?Dup?
  • 그것은 될 것입니다 여러 스레드에서 액세스
  • 가 필요한 키/값 쌍
  • 필요한 임의의 액세스?

그리고 나는 휴식 내 편리한 5 판 간단히 말해서 자바 와 비교합~20 분 정도는 옵션이 있습니다.그것은 좋은 작은 테이블 장에서 다섯 도움이나 그 밖으로 무엇이 적합합니다.

확인하고,어쩌면 사실을 알고 있는 경우 팔목하는 간단하 ArrayList 또는 HashSet 될 것이 나는 보지 않습니다.;)하지만 아무거나가있는 경우 원격으로 복잡한에 대한 내 indended 사용하여 베팅할 나는 책입니다.BTW,나만 벡터를'오래된 모자'--나에서 사용되지 않습니다.

다른 팁

이 속에서 시트 Sergiy 의 코발 추크 블로그 항목에:

Java Map/Collection Cheat Sheet

더 자세한 알렉산더 Zagniotov 의 순서도,그러나 불행하게도 그것은 오프라인 상태입니다.

나는 가정 사이의 차이를 알고 목록을 설정하고 지도 위에서 답변이 있습니다.왜 당신이 선택할 것이 그들의 구현하는 클래스가 다른 것입니다.예를 들어:

목록:

  1. ArrayList 빠른 검색,하지만 느리에 삽입.그것은 좋은 위한 구현을 많이 읽지 삽입/을 많이 제거 할 수 있습니다.그것은 데이터를 하나의 연속적인 메모리 블록,그래서 모든 필요한 시간을 확장,복사 전체 배열입니다.
  2. LinkedList 은 느린에서 검색하기,하지만 빠른에 삽입.그것은 좋은 위한 구현에는 삽입/을 제거하지 않은 많이 읽을 수 있습니다.그것을 유지하지 않 전체 배열 중 하나에서 지속적인 블록의 메모리입니다.

설정:

  1. HashSet 을 보장하지 않는 순서의 반복이며,따라서의 가장 빠른 설정합니다.그것은 높은 오버헤드를 보다 느린 ArrayList,그래서 당신은 없을 제외하고 사용량 데이터의 경우 해시 속도가 요소입니다.
  2. 유지 데이터를 주문,따라서보다 느리 HashSet.

지도: 성능과 행동의 HashMap 및 트리 맵은 병렬로 세트를 구현합니다..

벡터 해시 테이블을 사용하지 않아야 합니다.그들은 동기화 구현을 출시하기 전에 새로운 컬렉션의 계층 구조,따라서 느립니다.면 동기화가 필요한 컬렉션을 사용.synchronizedCollection().

이론적으로 있용 빅 오 장단점,그러나 실제로 이러한 거의 없 문제입니다.

실제 세계에서 벤치마킹 ArrayListLinkedList 도 큰 목록과 함께 작업을"많은 삽입을 가까." 학계는 사실을 무시하는 진정 알고리즘을 지속할 수 있는 요인을 압도 점근 곡선입니다.예를 들어,연결 목록을 추가로 필요 할당 개체 위해 모든 노드를 의미를 느린 노드를 만들고 훨씬 더 메모리 액세스 특성이 있습니다.

내 규칙은 다음과 같습니다.

  1. 항상을 시작으로 ArrayList 및 HashSet 및 HashMap(i.e지 LinkedList 또는 트리맵).
  2. Type 선언을 항상 해야 하는 인터페이스(즉목록 설정,지도)에서는 경우 프로파일 또는 코드를 검토하는 증명 그렇지 않으면 변경할 수 있습의 구현을 파괴하지 않고는 아무것도.

에 대한 당신의 첫 번째 질문은...

목록,지도 및 설정은 다른 목적을 제공합니다.읽어보는 것이 좋에 대해 자바 프레임워크에 모음 http://java.sun.com/docs/books/tutorial/collections/interfaces/index.html.

좀 더 구체적인:

  • 목록을 사용하여 필요하신 경우는 배열과 같은 데이터 구조와 당신에 대한 반복 작업이 필요한 요소
  • 지도를 사용해야 하는 경우 같은 것을 사전
  • 집합을 사용해야 하는 경우에만 결정하는 경우에 뭔가를 속하거나 설정하지 않습니다.

두 번째 질문에 대한...

의 주요 차이점은 벡터와 ArrayList 는 전기,후자는 동기화되지 않습니다.에 대해 자세히 알아볼 수 있습 동기화 Java 동시에서 실습.

의 차이 Hashtable(주 T 지 않도)및 HashMap 은 유사한 전기,후자는 동기화되지 않습니다.

내가 말할 것이 없는지에 대한 엄지손가락의 규칙을 선호하는 하나의 구현 또는 다른,그것이 정말 사용자의 요구에 따라 달라집니다.

을 위한 비 정렬이 최고의 선택보다 더 아홉 번의 될 것이다:ArrayList,HashMap,HashSet.

벡터 및 해시 테이블 동시 및 따라서 조금있을 수 있습니다 느렸습니다.그것은 희귀 원하는 것이 동기화 구현하고 수행할 때는 인터페이스가 있는지 충분히 풍부한 자신 동기화하는 것은 도움이 될 수 있습니다.의 경우에도,ConcurrentMap 추가 작업이 인터페이스를 만들기 위해 유용합니다.Concurrenthashmap 의 구현의 ConcurrentMap.

LinkedList 은 거의 절대 좋은 생각이 아니다.는 경우에도 많은 일을 삽입 및 제거는 경우에,당신은 인덱스를 사용하여 위치를 표시하기 위해 다음 필요한 반복을 통해 목록 올바른 것을 찾기 위해 노드입니다.ArrayList 은 거의 항상 빠릅니다.

맵에 대한 설정,해시 개 것보다 더 빨리 나무/정렬됩니다.Hash algortihms 하는 경향이 있 O(1)는 나무를 O(로그 n).

목록 허용하는 항목을 중복하는 동안,세트 하나만 허용 인스턴스입니다.

내가 사용하여 지도할 때마다 나를 수행해야 합 조회입니다.

에 대한 특정한 구현기 위해 보존하는 변형의 설정이지만 크게 그것이 온도.내가 사용하는 경향이 있 ArrayList 을 위한 합리적으로 작은 나열하고 HashSet 을 위한 합리적으로 작은,하지만 많은 구현을(를 포함하여 모든 당신이 자신을 작성).HashMap 은 매우 일반적이지도입니다.아무것도보다 더 많은'합리적으로 작은'당신은 시작에 대한 걱정도록 메모리면서 특정 알고리즘.

이 페이지 의 애니메이션의 이미지 샘플 코드와 함께 테스트 LinkedList 대ArrayList 에 관심이 있는 경우 하드 번호입니다.

편집: 나는 다음과 같은 링크는 방법을 보여줍니 이런 일들은 정말 그냥 품목에서 도구,당신은 단지에 대해 생각해야의 요구가 무엇인:보 Commons-Collections 버전 지도, 목록설정.

제안에서 다른 답변,거기에 다양한 시나리오를 사용하여 올바른 컬렉션에 따라 사용한 경우.나는 몇 가지 포인

ArrayList:

  • 대부분의 경우는 당신이 필요로하는 곳에 저장하거나 반복을 통해"많은 것들을"그리고 나중에 반복합니다.반복은 빨리로 인덱스 기반으로합니다.
  • 을 만들 때마다 ArrayList,고정된 양의 메모리를 할당하여 그것은 한 번 exceeeded,복사 전체 배열

LinkedList:

  • 그것은 사용하는 이중 연결 목록을 그래서 삽입과 삭제는 작업이 빠른 것 같습니다 추가 또는 제거 노드입니다.
  • 로 검색하는 느린 것을 반복하게 됩니다.

HashSet:

  • 다른 예-없는 결정에 대한 항목이,예를 들어,"항목은 영어 단어","은 품목에서의 데이타베이스가 있는가?" 는"항목 이 범주에서는?"etc.

  • 을 기억하는"항목은 이미 처리된",e.g.을 수행할 때 웹 크롤링

HashMap:

  • 에서 사용되는 경우 당신은 말할 필요가"주어진 X,무엇입 Y"?그것은 자주 유용한 구현에는 메모리 캐싱하거나 인덱스 나.e 키 값 쌍 예를 들어:지정한 사용자 ID,자신의 캐시 이름/사용자 개?.
  • 항상 가 HashMap 을 수행할 수 있습니다.

벡터 및 해시 테이블과 동기화하고 따라서는 조금 느리면 동기화가 필요한 컬렉션을 사용.synchronizedCollection().체크 에 대한 정 컬렉션이 있습니다.이며 중요.

내가 찾는 브루스 Eckel 의 생각에는 자바를 매우 유용할 것입니다.그는 비교하여 다양한 컬렉션에습니다.나를 유지하는 데 사용 다이어그램 그는 게시된 보여주는 상속 heirachy 에서 내 큐브 벽으로 빠른 참조.한 가지 당신이 좋습니다 하는 마음에 스레드에 안전합니다.성능이 일반적으로 의미하지 않는 스레드에 안전합니다.

잘에 따라 달라집니다,당신이 필요합니다.일반적인 지침:

목록 은 컬렉션 데이터를 유지하기 위해서 삽입하고 각 요소를 가지고 index.

설정 가방의 요소 없이 복제(는 경우에 당신은 다시 같은 요소를 추가할 수 없습니다).데이터 없다는 개념입니다.

지도 당신은에 액세스하고 쓰는 데이터 요소에 의해 자신의 핵심이 될 수 있는 모든 가능한 객체입니다.

enter image description here 속성: https://stackoverflow.com/a/21974362/2811258

에 대한 자세한 내용은 자바 컬렉션 이 문서.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top