Java Collections Framework 구현에 대한 큰 요약? [닫은]


164

나는 곧 "Java crash-course"를 가르치고있을 것이다. 청중 구성원이 Big-O 표기법을 알고 있다고 가정하는 것이 안전하지만, 다양한 콜렉션 구현에 대한 다양한 조작의 순서가 무엇인지 알 것이라고 가정하는 것이 안전하지 않을 수 있습니다.

요약 매트릭스를 직접 생성하는 데 시간이 걸릴 수 있지만 이미 공개 도메인에 이미 존재하는 경우에는 적절한 크레딧을 사용하여 재사용하고 싶습니다.

누구든지 포인터가 있습니까?


다음은 매우 일반적인 Java 객체와 Big-O 표기법을 사용하여 운영 비용을 논의 할 때 유용한 링크입니다. objectissues.blogspot.com/2006/11/…
Nick

퍼블릭 도메인에는 없지만 Maurice Naftalin과 Philip Wadler 의 뛰어난 Java Generics and Collections 는 다양한 콜렉션 클래스에 대한 장의 런타임 정보 개요를 나열합니다.
Fabian Steeg

1
성능 벤치 마크 가 사용됩니까?
ThreaT

답변:


149

이 웹 사이트는 꽤 좋지만 Java에만 국한된 것은 아닙니다 : http://bigocheatsheet.com/ 이 링크가 작동하지 않는 경우의 이미지입니다


27
그리고 이것이 URL을 답변으로 사용하지 않는 이유입니다. 내가 알 수있는 한 해당 문서 / 서버는 더 이상 사용할 수 없습니다!
Jason Mock

1
@Ben J Links는 더 이상 작동하지 않습니다
Vikas V

웹 보관 링크도 끊어졌습니다.
MikeFHay

새로운 작업 URL이 추가 된 것 같습니다. 노력해 주셔서 감사합니다. 매우 도움이됩니다.
Tejas C

1
@AndreaZilio LinkedList.remove (Object)는 이미 이웃을 알고 있다고 가정하면 일정한 시간입니다. 이웃을 모른다면 먼저 찾아야합니다.
Paul Evans

217

Java Generics and Collections 에는이 정보가 있습니다 (188, 211, 222, 240 페이지).

구현 목록 :

                      get  add  contains next remove(0) iterator.remove
ArrayList             O(1) O(1) O(n)     O(1) O(n)      O(n)
LinkedList            O(n) O(1) O(n)     O(1) O(1)      O(1)
CopyOnWrite-ArrayList O(1) O(n) O(n)     O(1) O(n)      O(n)

구현 설정 :

                      add      contains next     notes
HashSet               O(1)     O(1)     O(h/n)   h is the table capacity
LinkedHashSet         O(1)     O(1)     O(1) 
CopyOnWriteArraySet   O(n)     O(n)     O(1) 
EnumSet               O(1)     O(1)     O(1) 
TreeSet               O(log n) O(log n) O(log n)
ConcurrentSkipListSet O(log n) O(log n) O(1)

지도 구현 :

                      get      containsKey next     Notes
HashMap               O(1)     O(1)        O(h/n)   h is the table capacity
LinkedHashMap         O(1)     O(1)        O(1) 
IdentityHashMap       O(1)     O(1)        O(h/n)   h is the table capacity 
EnumMap               O(1)     O(1)        O(1) 
TreeMap               O(log n) O(log n)    O(log n) 
ConcurrentHashMap     O(1)     O(1)        O(h/n)   h is the table capacity 
ConcurrentSkipListMap O(log n) O(log n)    O(1)

큐 구현 :

                      offer    peek poll     size
PriorityQueue         O(log n) O(1) O(log n) O(1)
ConcurrentLinkedQueue O(1)     O(1) O(1)     O(n)
ArrayBlockingQueue    O(1)     O(1) O(1)     O(1)
LinkedBlockingQueue   O(1)     O(1) O(1)     O(1)
PriorityBlockingQueue O(log n) O(1) O(log n) O(1)
DelayQueue            O(log n) O(1) O(log n) O(1)
LinkedList            O(1)     O(1) O(1)     O(1)
ArrayDeque            O(1)     O(1) O(1)     O(1)
LinkedBlockingDeque   O(1)     O(1) O(1)     O(1)

java.util 패키지 에 대한 javadoc의 맨 아래 에는 좋은 링크가 있습니다.


3
예를 들어 배열의 중간 또는 끝에서 요소를 삭제하면 Arraylist에서 삭제시 O (n)이 걸릴 수 있습니다.
Popeye

@popeye는 보통 최악의 경우가 아닙니까?
Yassin Hajaj

@Popeye가 언급했듯이 대답이 어떤 경우에 대한 명확한 설명이 있어야합니다. 경우는 시간 복잡성으로 인해 평균 / 최악 일 수 있습니다. 답변이 모든 DS에 대한 "평균"사례를 나타내는 것 같습니다.
Yashwin Munsadwala

12

각 콜렉션 클래스에 대한 Sun의 Javadoc은 일반적으로 원하는 것을 정확하게 알려줍니다. 예를 들어, HashMap :

이 구현은 해시 함수가 버킷간에 요소를 올바르게 분산시키는 것으로 가정하여 기본 작업 (get 및 put)에 대해 일정한 시간 성능 을 제공합니다 . 컬렉션 뷰를 반복 할 때는 HashMap 인스턴스의 "용량" (버킷 수)에 크기 (키-값 매핑 수)를 더한 시간이 필요합니다 .

TreeMap :

이 구현은 containsKey, get, put 및 remove 작업에 대해 보장 된 log (n) 시간 비용 을 제공합니다.

TreeSet :

이 구현은 기본 작업 (추가, 제거 및 포함)에 대해 보장 된 log (n) 시간 비용을 제공합니다 .

(강조 광산)


HashMap 부분에 동의하지 않습니다. 나는 Sun의 위치를 ​​알고 있지만 ... 예를 들어 get은 obj.equals (key)를 호출해야하며, 포함 된 객체의 크기가 선형 일 수 있습니다. 일반적으로이 비교를 위해 필드를 읽어야합니다. 예외는 정수 또는 문자열 (interned)입니까 ???
Overflown

우선, 그들이 틀렸다면, 일정 시간 성능을 반증하는 테스트 케이스를 만드는 것이 그렇게 어렵지 않아야합니까? 둘째, HashMap의 소스 코드를 보면 해시 코드가 같은 경우에만 맵의 각 키에 대해 equals ()를 호출하지 않습니다.
matt b

5
위의 인용문을 읽으면 "해시 함수가 버킷 사이에 요소를 올바르게 분산 시킨다고 가정하는 경우"라고 말합니다. CS 이론에서 해시 테이블은 해시 함수가 "양호한"(평균적으로 발생) 일관된 시간 작업을 갖지만 최악의 경우 선형 시간이 걸릴 수 있습니다.
newacct

4
@Overflown-기술적으로 복잡성 관점에서 obj.equals ()가 얼마나 오래 걸리든 상관 없습니다. 컬렉션의 항목 수와 관련하여 "일정한"부분 일뿐입니다.
mikera

6

위의 사람은 HashMap / HashSet과 TreeMap / TreeSet을 비교했습니다.

ArrayList와 LinkedList에 대해 이야기하겠습니다.

배열 목록 :

  • O (1) get()
  • 상각 된 O (1) add()
  • 삽입하거나 사용하여 중간의 요소를 삭제하는 경우 ListIterator.add()또는 Iterator.remove(), 그것은 O (n은) 다음의 모든 요소를 이동하는 것

연결 목록 :

  • 의 위에) get()
  • O (1) add()
  • 삽입하거나 사용하여 중간의 요소를 삭제하는 경우 ListIterator.add()또는 Iterator.remove(), 그것은 것입니다 O (1)

1
if you insert or delete an element in the middle using ListIterator.add() or Iterator.remove(), it will be O(1) 왜? 먼저 중간에 요소를 찾아야하는데 왜 O (n)이 아닌가?
MyTitle 2016 년

@MyTitle : 다시 읽으십시오. "사용 중 ListIterator.add()또는 Iterator.remove()"반복자가 있습니다.
newacct 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.