자바 집합 프레임 워 크 의 체계 구조 상세 설명

6995 단어
최근 J2EE 의 책 에서 집합 프레임 워 크 에 대한 좋 은 설명 글 을 보 았 습 니 다. 선별 한 후에 보 내 드 리 겠 습 니 다. 집합 프레임 워 크 는 관리 대상 이 집합 하 는 인터페이스 와 클래스 를 제공 합 니 다. 인터페이스, 클래스, 알고리즘 을 포함 하고 다음은 각 구성 요소 에 대한 설명 입 니 다.
컬 렉 션 인터페이스
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 는 질서 있 는 Collection 입 니 다. 이 인 터 페 이 스 를 사용 하면 모든 요소 가 삽 입 된 위 치 를 정확하게 제어 할 수 있 습 니 다.사용 자 는 색인 (요소 가 List 에 있 는 위치, 배열 아래 표 시 된 것 과 유사) 을 사용 하여 List 에 있 는 요 소 를 방문 할 수 있 습 니 다. 이것 은 자바 와 유사 한 배열 입 니 다.
아래 에서 언급 할 Set 와 달리 List 는 같은 요 소 를 허용 합 니 다.
Collection 인터페이스 에 필요 한 iterator () 방법 을 제외 하고 List 는 listIterator () 방법 을 제공 하여 ListIterator 인 터 페 이 스 를 되 돌려 줍 니 다. 표준 Iterator 인터페이스 에 비해 ListIterator 는 add () 와 같은 방법 을 제공 하여 추가, 삭제, 설정 요 소 를 앞으로 또는 뒤로 옮 길 수 있 습 니 다.
List 인 터 페 이 스 를 실현 하 는 상용 클래스 는 LinkedList, Array List, Vector 와 Stack 이다.
LinkedList 클래스
LinkedList 는 List 인 터 페 이 스 를 실현 하여 null 요 소 를 허용 합 니 다.또한 링크 드 리스트 는 추가 get, remove, insert 방법 을 링크 드 리스트 의 첫 부분 이나 끝 부분 에 제공 합 니 다.이 동작 들 은 LinkedList 를 스 택 (stack), 대기 열 (queue) 또는 양 방향 대기 열 (deque) 로 사용 할 수 있 습 니 다.
링크 드 리스트 에 동기 화 방법 이 없습니다.여러 스 레 드 가 하나의 List 에 동시에 접근 하려 면 스스로 방문 동기 화 를 실현 해 야 합 니 다.하나의 해결 방법 은 List 를 만 들 때 동기 화 된 List 를 만 드 는 것 입 니 다.
List list = Collections.synchronizedList(new LinkedList(...));
ArrayList 클래스
Array List 는 가 변 크기 의 배열 을 실현 했다.null 을 포함 한 모든 요 소 를 허용 합 니 다.Array List 가 동기 화 되 지 않 았 습 니 다.
size, isEmpty, get, set 방법 운행 시간 은 상수 입 니 다.그러나 add 방법 은 분담 상수 로 지출 하고 n 개의 요 소 를 추가 하 는 데 O (n) 의 시간 이 필요 합 니 다.다른 방법 은 운행 시간 이 선형 이다.
모든 Array List 인 스 턴 스 는 하나의 용량 (Capacity) 이 있 습 니 다. 즉, 요 소 를 저장 하 는 배열 의 크기 입 니 다.이 용량 은 새로운 요 소 를 계속 추가 하면 서 자동 으로 증가 할 수 있 지만 성장 알고리즘 은 정의 되 지 않 았 다.대량의 요 소 를 삽입 해 야 할 때 삽입 하기 전에 ensureCapacity 방법 을 사용 하여 ArrayList 의 용량 을 증가 시 켜 삽입 효율 을 높 일 수 있 습 니 다.
LinkedList 와 마찬가지 로 Array List 도 동기 화 되 지 않 습 니 다 (unsynchronized).
벡터 클래스
Vector 는 Array List 와 매우 유사 하지만 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 는 중복 되 는 요 소 를 포함 하지 않 는 Collection 입 니 다. 즉, 임의의 두 요소 e1 과 e2 는 모두 e1. equals (e2) = false 가 있 고 set 는 최대 하나의 null 요소 가 있 습 니 다.
분명 한 것 은 set 의 구조 함수 에 제약 조건 이 있 고 들 어 오 는 Collection 매개 변 수 는 중복 되 는 요 소 를 포함 할 수 없습니다.
주의: 가 변 대상 (Mutable Object) 을 조심해 야 합 니 다.Set 의 가 변 요소 가 자신의 상 태 를 바 꾸 면 Object. equals (Object) = true 에 문제 가 생 길 수 있 습 니 다.
지도 인터페이스
맵 은 Collection 인 터 페 이 스 를 계승 하지 않 았 습 니 다. 맵 은 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 를 너무 낮 게 설정 하지 마 세 요.
WeakHashMap 클래스
Weak HashMap 은 개 선 된 HashMap 으로 key 에 대해 '약 한 인용' 을 실행 합 니 다. 만약 key 가 외부 에서 인용 되 지 않 는 다 면 이 key 는 GC 에서 회수 할 수 있 습 니 다.
총결산
스 택, 대기 열 등 과 관련 된 작업 이 있 으 면 List 를 사용 하 는 것 을 고려 해 야 합 니 다. 요 소 를 빠르게 삽입 하고 삭제 해 야 할 경우 LinkedList 를 사용 해 야 합 니 다. 요 소 를 빠르게 무 작위 로 접근 하려 면 ArrayList 를 사용 해 야 합 니 다.
만약 에 프로그램 이 단일 스 레 드 환경 에서 만 진행 되 거나 한 스 레 드 에서 만 방문 할 경우 동기 화 되 지 않 은 종 류 를 고려 하면 효율 이 높 습 니 다. 만약 에 여러 스 레 드 가 한 종 류 를 동시에 조작 할 수 있다 면 동기 화 된 종 류 를 사용 해 야 합 니 다.
특히 해시 표 에 대한 조작 에 주의해 야 합 니 다. key 의 대상 으로서 equals 와 hashCode 방법 을 정확하게 복사 해 야 합 니 다.
ArrayList 가 아 닌 실제 형식 으로 인 터 페 이 스 를 되 돌려 줍 니 다. 예 를 들 어 ArrayList 가 아 닌 List 로 돌아 가 려 면 나중에 ArrayList 를 LinkedList 로 바 꿔 야 할 때 클 라 이언 트 코드 는 바 꾸 지 않 아 도 됩 니 다.이것 이 바로 추상 적 인 프로 그래 밍 을 겨냥 한 것 이다.

좋은 웹페이지 즐겨찾기