Collection 인터페이스 와 Map 인터페이스의 차이

7156 단어
선형 표, 링크, 해시 표 는 자주 사용 하 는 데이터 구조 로 자바 개발 을 할 때 JDK 는 우리 에 게 일련의 해당 하 는 유형 을 제공 하여 기본 적 인 데이터 구 조 를 실현 했다.이 클래스 들 은 모두 자바 util 패키지 에 있 습 니 다.본 고 는 간단 한 묘 사 를 통 해 독자 에 게 각 유형의 역할 과 이런 유형 을 어떻게 정확하게 사용 하 는 지 논술 한다.
Collection 인터페이스 ☆ List 인터페이스 ☆  ☆ 링크 드 리스트 클래스 ☆  ☆ ArrayList 클래스 ☆  『 9492 』 벡터 클래스 ☆  └ Stack 류 └ Set 인터페이스 맵 인터페이스 ├ Hashtable 류 ├ HashMap 류 └ WeakHashMap 류
자세 한 설명:
Collection 인터페이스 Collection 인터페이스 (즉 용기 인터페이스) 는 가장 기본 적 인 집합 인터페이스 이 고 하나의 Collection 은 Object (대상), 즉 Collection 의 요소 (Elements) 를 대표 합 니 다.일부 Collection 은 같은 요 소 를 허용 하고 다른 요 소 는 안 됩 니 다.일 부 는 정렬 할 수 있 지만 다른 일 부 는 안 된다.자바 SDK 는 자체 Collection 을 직접 계승 하 는 클래스 를 제공 하지 않 으 며, 자바 SDK 가 제공 하 는 클래스 는 모두 자체 Collection 을 계승 하 는 '하위 인터페이스', 예 를 들 어 List 와 Set 이다.Collection 인 터 페 이 스 를 실현 하 는 모든 클래스 는 두 가지 표준 구조 함 수 를 제공 해 야 합 니 다. 매개 변수 가 없 는 구조 함 수 는 빈 Collection 을 만 드 는 데 사 용 됩 니 다. Collection 매개 변수의 구조 함 수 는 새로운 Collection 을 만 드 는 데 사 용 됩 니 다. 이 새로운 Collection 은 들 어 오 는 Collection 과 같은 요 소 를 가지 고 있 습 니 다.다음 구조 함 수 는 사용자 가 Collection 을 복사 할 수 있 도록 합 니 다.Collection 의 모든 요 소 를 어떻게 옮 겨 다 닙 니까?Collection 의 실제 유형 이 어떻든 간 에 iterator () 방법 을 지원 합 니 다. 이 방법 은 교체 자 를 되 돌려 줍 니 다. 이 교체 자 를 사용 하면 Collection 의 모든 요 소 를 하나씩 방문 할 수 있 습 니 다.전형 적 인 용법 은 다음 과 같다.
Iterator it = collection.iterator(); //        
while (it.hasNext()) {
    Object obj = it.next(); //           
}

Collection 인터페이스 에서 파생 된 두 인 터 페 이 스 는 List 와 Set 이다.
List 인터페이스 List 는 질서 있 는 Collection 입 니 다. 이 인 터 페 이 스 를 사용 하면 모든 요소 가 삽 입 된 위 치 를 정확하게 제어 할 수 있 습 니 다.사용 자 는 색인 (요소 가 List 에 있 는 위치, 배열 아래 표 시 된 것 과 유사) 을 사용 하여 List 에 있 는 요 소 를 방문 할 수 있 습 니 다. 이것 은 자바 와 유사 한 배열 입 니 다.
아래 에서 언급 할 Set 와 달리 List 는 같은 요 소 를 허용 합 니 다.Collection 인터페이스 에 필요 한 iterator () 방법 을 제외 하고 List 는 listIterator () 방법 을 제공 하여 ListIterator 인 터 페 이 스 를 되 돌려 줍 니 다. 표준 Iterator 인터페이스 에 비해 ListIterator 는 add () 와 같은 방법 을 제공 하여 요 소 를 추가, 삭제, 설정 할 수 있 고 앞으로 또는 뒤로 옮 겨 다 닐 수 있 습 니 다.List 인 터 페 이 스 를 실현 하 는 상용 클래스 는 LinkedList 클래스, ArrayList 클래스, Vector 클래스 와 Stack 클래스 가 있다.
LinkedList 류 LinkedList 류 는 List 인 터 페 이 스 를 실현 하여 null 요 소 를 허용 합 니 다.또한 링크 드 리스트 는 추가 get, remove, insert 방법 을 링크 드 리스트 의 첫 부분 이나 끝 부분 에 제공 합 니 다.이 동작 들 은 LinkedList 를 스 택 (stack), 대기 열 (queue) 또는 양 방향 대기 열 (deque) 로 사용 할 수 있 습 니 다.링크 드 리스트 에 동기 화 방법 이 없습니다.여러 스 레 드 가 하나의 List 에 동시에 접근 하려 면 스스로 방문 동기 화 를 실현 해 야 합 니 다.하나의 해결 방법 은 List 를 만 들 때 동기 화 된 List 를 만 드 는 것 입 니 다.
List list = Collections.synchronizedList(new LinkedList(...));

ArrayList 클래스 ArrayList 는 가 변 크기 의 배열 을 실현 합 니 다.모든 요 소 를 허용 합 니 다. null 을 포함 합 니 다.Array List 가 동기 화 되 지 않 았 습 니 다.size, isEmpty, get, set 방법 운행 시간 은 상수 입 니 다.그러나 add 방법 은 분담 상수 로 지출 하고 n 개의 요 소 를 추가 하 는 데 O (n) 의 시간 이 필요 합 니 다.다른 방법 은 운행 시간 이 선형 이다.모든 Array List 인 스 턴 스 는 하나의 용량 (Capacity) 이 있 습 니 다. 즉, 요 소 를 저장 하 는 배열 의 크기 입 니 다.이 용량 은 새로운 요 소 를 계속 추가 하면 서 자동 으로 증가 할 수 있 지만 성장 알고리즘 은 정의 되 지 않 았 다.대량의 요 소 를 삽입 해 야 할 때 삽입 하기 전에 ensureCapacity 방법 을 사용 하여 ArrayList 의 용량 을 증가 시 켜 삽입 효율 을 높 일 수 있 습 니 다.LinkedList 와 마찬가지 로 Array List 도 동기 화 되 지 않 습 니 다 (unsynchronized).
Vector 류 Vector 는 ArrayList 와 매우 유사 하지만 Vector 는 동기 화 됩 니 다.Vector 에서 만 든 Iterator 는 Array List 에서 만 든 Iterator 와 같은 인터페이스 이지 만 Vector 가 동기 화 되 어 있 기 때문에 하나의 Iterator 가 만 들 어 졌 고 사용 되 고 있 습 니 다. 다른 스 레 드 는 Vector 의 상 태 를 바 꾸 었 습 니 다 (예 를 들 어 일부 요 소 를 추가 하거나 삭 제 했 습 니 다). 이때 Iterator 를 호출 하 는 방법 은 Concurrent ModificationException 을 던 집 니 다.따라서 이 이상 을 포착 해 야 한다.
Stack 류 Stack 류 는 Vector 류 에서 계승 하여 후진 선 출 된 스 택 을 실현 합 니 다.Stack 류 는 Vector 를 스 택 으로 사용 할 수 있 도록 5 가지 추가 방법 을 제공 합 니 다.기본 적 인 push () 와 pop () 방법, 그리고 peek () 방법 으로 스 택 꼭대기 의 요 소 를 얻 을 수 있 습 니 다. empty () 방법 으로 스 택 이 비어 있 는 지, search () 방법 으로 스 택 에 있 는 요 소 를 검사 합 니 다.Stack 클래스 가 생 성 된 후 빈 스 택 입 니 다.
Set 인터페이스 Set 인 터 페 이 스 는 중복 되 는 요 소 를 포함 하지 않 는 Collection 입 니 다. 즉, 임의의 두 요소 e1 과 e2 는 모두 e1. equals (e2) = false 가 있 고 Set 는 최대 하나의 null 요소 가 있 습 니 다.분명 한 것 은 set 의 구조 함수 에 제약 조건 이 있 고 들 어 오 는 Collection 매개 변 수 는 중복 되 는 요 소 를 포함 할 수 없습니다.주의: 가 변 대상 (Mutable Object) 을 조심해 야 합 니 다.Set 의 가 변 요소 가 자신의 상 태 를 바 꾸 면 Object. equals (Object) = true 에 문제 가 생 길 수 있 습 니 다.
Map 인 터 페 이 스 는 Map 이 Collection 인 터 페 이 스 를 계승 하지 않 았 으 며, Map 은 key 에서 value 까지 의 맵 을 제공 합 니 다.하나의 맵 에 같은 키 를 포함 할 수 없습니다. 키 마다 하나의 value 만 매 핑 할 수 있 습 니 다.Map 인 터 페 이 스 는 3 가지 집합 보 기 를 제공 합 니 다. Map 의 내용 은 key 집합, value 집합 또는 key - value 맵 으로 사용 할 수 있 습 니 다.
Hashtable 클래스 Hashtable 클래스 는 Map 인 터 페 이 스 를 계승 하여 key - value 맵 의 해시 표를 실현 합 니 다.비어 있 지 않 은 대상 은 key 나 value 로 사용 할 수 있 습 니 다.데 이 터 를 추가 하려 면 put (key, value) 를 사용 하고 데 이 터 를 꺼 내 get (key) 을 사용 합 니 다. 이 두 기본 작업 의 시간 소 비 는 상수 입 니 다.Hashtable 은 initial capacity 와 load factor 두 개의 매개 변 수 를 통 해 성능 을 조정 합 니 다.일반적으로 부족 한 load factor 0.75 는 시간 과 공간의 균형 을 잘 이 루 었 다.load factor 를 확대 하면 공간 을 절약 할 수 있 지만 해당 하 는 검색 시간 이 커지 고 get 과 put 와 같은 작업 에 영향 을 줄 수 있 습 니 다.Hashtable 을 사용 하 는 간단 한 예 는 다음 과 같 습 니 다. 1, 2, 3 을 Hashtable 에 넣 으 면 그들의 key 는 각각 "one", "two", "three" 입 니 다.
Hashtable numbers = new Hashtable();
numbers.put(“one”, new Integer(1));
numbers.put(“two”, new Integer(2));
numbers.put(“three”, new Integer(3));

하나의 수 를 꺼 내야 합 니 다. 예 를 들 어 2 는 해당 하 는 key 를 사용 합 니 다.
Integer n = (Integer) numbers.get(“two”);  
System.out.println(“two = ” + n);

key 의 대상 으로서 해시 함 수 를 계산 하여 이에 대응 하 는 value 의 위 치 를 확정 하기 때문에 key 의 대상 으로서 hashCode () 와 equals () 방법 을 실현 해 야 합 니 다.hashCode () 와 equals () 방법 은 루트 Object 를 계승 합 니 다. 사용자 정의 클래스 를 key 로 사용 하려 면 상당히 조심해 야 합 니 다. 해시 함수 의 정의 에 따라 두 대상 이 같 으 면 ob1. equals (ob2) = true 는 hashCode () 가 같 아야 합 니 다. 그러나 두 대상 이 다 르 면 hashCode () 가 다 를 수 있 습 니 다. 서로 다른 대상 의 hashCode () 가 같 으 면이러한 현상 을 충돌 이 라 고 하 는데 충돌 은 해시 표를 조작 하 는 시간 비용 을 증가 시 킬 수 있 기 때문에 가능 한 한 정 의 된 hashCode () 방법 으로 해시 표 의 조작 을 가속 화 할 수 있다.같은 대상 에 서로 다른 hashCode 가 있 으 면 해시 표 의 조작 에 예상 치 못 한 결과 가 발생 할 수 있 습 니 다. (기대 하 는 get 방법 은 null 로 되 돌아 갑 니 다) 이런 문 제 를 피하 기 위해 서 는 equals 방법 과 hashCode 방법 을 동시에 복사 해 야 합 니 다. 그 중 하나 만 쓰 지 마 십시오.Hashtable 은 동기 화 되 어 있 습 니 다.
HashMap 류 HashMap 류 는 Hashtable 과 유사 합 니 다. 다른 점 은 HashMap 류 가 동기 화 되 지 않 고 null, 즉 null value 와 null key 를 허용 합 니 다.그러나 HashMap 류 를 Collection 으로 볼 때 (values () 방법 은 Collection 으로 되 돌아 갈 수 있 습 니 다. 교체 기 작업 시간 비용 과 HashMap 류 의 용량 은 비례 합 니 다.따라서 교체 작업 의 성능 이 상당히 중요 하 다 면 HashMap 류 의 초기 화 용량 을 너무 높 게 설정 하거나 load factor 를 너무 낮 게 설정 하지 마 세 요.
Weak HashMap 류 Weak HashMap 류 는 개 선 된 HashMap 으로 key 에 대해 '약 한 인용' 을 실행 합 니 다. 만약 key 가 외부 에서 인용 되 지 않 는 다 면 이 key 는 GC 에서 회수 할 수 있 습 니 다.
요약 하면 스 택, 대기 열 등 작업 과 관련 이 있 으 면 List 를 사용 해 야 합 니 다.요 소 를 빠르게 무 작위 로 접근 하려 면 Array List (집합 순서 로 저장) 류 를 사용 해 야 합 니 다.요 소 를 빠르게 삽입 하고 삭제 해 야 할 때 는 링크 드 리스트 (집합 적 인 선형 저장 소 로 이해 합 니 다) 류 를 사용 해 야 합 니 다.프로그램 이 단일 스 레 드 환경 에서 만 진행 되 거나 한 스 레 드 에서 만 접근 할 경우 비 동기 화 클래스 를 사용 해 야 합 니 다. 효율 이 높 습 니 다. 여러 스 레 드 가 한 클래스 를 동시에 조작 할 수 있다 면 동기 화 클래스 를 사용 해 야 합 니 다.특히 해시 표 에 대한 조작 에 주의해 야 합 니 다. key 의 대상 으로서 equals 와 hashCode 방법 을 정확하게 복사 해 야 합 니 다.ArrayList (클래스) 가 아 닌 실제 형식 으로 인 터 페 이 스 를 되 돌려 줍 니 다. 나중에 ArrayList 를 LinkedList 로 바 꿔 야 할 때 클 라 이언 트 코드 는 바 꾸 지 않 아 도 됩 니 다.이것 이 바로 추상 적 인 프로 그래 밍 을 겨냥 한 것 이다.

좋은 웹페이지 즐겨찾기