일반적인 집합 용기(자바)
24800 단어 Java
자바 용기 라 이브 러 리 의 용 도 는'소지 대상'이 고 이 를 두 가지 서로 다른 개념 으로 나 누 었 다.
1)Collection:하나의 독립 된 요소 의 서열,이런 요 소 는 모두 한 가지 또는 여러 가지 규칙 에 따른다. List 는 삽 입 된 순서에 따라 요 소 를 저장 해 야 하 며,set 는 중복 되 는 요소 가 있어 서 는 안 됩 니 다.Queue 는 줄 서기 규칙 에 따라 대상 이 발생 하 는 순 서 를 결정 합 니 다.(보통 삽입 되 는 순서 와 같 습 니 다.) 2)Map:쌍 을 이 루 는"키 쌍"대상 은 키 를 사용 하여 값 을 찾 을 수 있 습 니 다.
|Collection | ├List | │-├LinkedList | │-├ArrayList | │-└Vector | │ └Stack | ├Set | │├HashSet | │├TreeSet | │└LinkedSet | |Map ├Hashtable ├HashMap └WeakHashMap
주: 1.java.util.collection 은 집합 인터페이스 입 니 다.그것 은 집합 대상 에 대해 기본 적 인 조작 을 하 는 통용 인터페이스 방법 을 제공 했다.Collection 인 터 페 이 스 는 자바 라 이브 러 리 에서 구체 적 인 실현 이 많다.Collection 인터페이스의 의 미 는 각종 구체 적 인 집합 에 최대 화 된 통일 조작 방식 을 제공 하 는 것 이다. 2.java.util.collections 는 포장 류 입 니 다.그것 은 집합 작업 과 관련 된 각종 정적 다 형 방법 을 포함한다.도구 류 처럼 자바 에 서 비 스 를 제공 하 는 Collection 프레임 워 크 를 예화 할 수 없습니다.
2.Collection 집합 인터페이스
Collection 은 가장 기본 적 인 집합 인터페이스 로 하나의 Collection 은 Object,즉 Collection 의 요소(Elements)를 대표 합 니 다.일부 Collection 은 같은 요 소 를 허용 하고 다른 요 소 는 안 됩 니 다.일 부 는 정렬 할 수 있 지만 다른 일 부 는 안 된다.자바 SDK 는 자체 Collection 을 직접 계승 하 는 클래스 를 제공 하지 않 으 며,자바 SDK 가 제공 하 는 클래스 는 모두 자체 Collection 을 계승 하 는'하위 인터페이스',예 를 들 어 List 와 Set 이다.
:
boolean add(Object o)
boolean remove(Object o)
int size()
boolean contains(Object o)
boolean isEmpty()
Iterator iterator()
boolean containsAll(Collection c) c
boolean addAll(Collection c) c
void clear()
void removeAll(Collection c) c
void retainAll(Collection c) c
1
2
3
4
5
6
7
8
9
10
11
12
1.List 인터페이스
List 는 질서 있 는 Collection 입 니 다.이 인 터 페 이 스 를 사용 하면 모든 요소 가 삽 입 된 위 치 를 정확하게 제어 할 수 있 습 니 다.사용 자 는 색인(요소 가 List 에 있 는 위치,배열 아래 표 시 된 것 과 유사)을 사용 하여 List 에 있 는 요 소 를 방문 할 수 있 습 니 다.이것 은 자바 와 유사 한 배열 입 니 다. List 인 터 페 이 스 를 실현 하 는 상용 클래스 는 LinkedList,Array List,Vector 와 Stack 이다.
1)LinkedList 클래스 LinkedList 는 List 인 터 페 이 스 를 실현 하여 null 요 소 를 허용 합 니 다.또한 링크 드 리스트 는 추가 get,remove,insert 방법 을 링크 드 리스트 의 첫 부분 이나 끝 부분 에 제공 합 니 다.이 동작 들 은 LinkedList 를 스 택(stack),대기 열(queue)또는 양 방향 대기 열(deque)로 사용 할 수 있 습 니 다.
메모:LinkedList 는 동기 화 방법 이 없습니다.여러 스 레 드 가 하나의 List 에 동시에 접근 하려 면 스스로 방문 동기 화 를 실현 해 야 합 니 다.하나의 해결 방법 은 List 를 만 들 때 동기 화 된 List:List list=Collections.synchronizedList(new LinkedList(...)를 만 드 는 것 입 니 다.
2)ArrayList 클래스 Array List 는 가 변 크기 의 배열 을 실현 했다.null 을 포함 한 모든 요 소 를 허용 합 니 다.Array List 가 동기 화 되 지 않 았 습 니 다.size,isEmpty,get,set 방법 운행 시간 은 상수 입 니 다.그러나 add 방법 은 분담 상수 로 지출 하고 n 개의 요 소 를 추가 하 는 데 O(n)의 시간 이 필요 합 니 다.다른 방법 은 운행 시간 이 선형 이다.모든 Array List 인 스 턴 스 는 하나의 용량(Capacity)이 있 습 니 다.즉,요 소 를 저장 하 는 배열 의 크기 입 니 다.이 용량 은 새로운 요 소 를 계속 추가 하면 서 자동 으로 증가 할 수 있 지만 성장 알고리즘 은 정의 되 지 않 았 다.대량의 요 소 를 삽입 해 야 할 때 삽입 하기 전에 ensureCapacity 방법 을 사용 하여 ArrayList 의 용량 을 증가 시 켜 삽입 효율 을 높 일 수 있 습 니 다.
LinkedList 와 마찬가지 로 Array List 도 동기 화 되 지 않 습 니 다(unsynchronized).일반적으로 이 두 개 를 사용 하면 된다.동기 화 되 지 않 기 때문에 효율 이 비교적 높다. 스 택,대기 열 등 과 관련 된 작업 이 있 으 면 List 를 사용 하 는 것 을 고려 해 야 합 니 다.요 소 를 빠르게 삽입 하고 삭제 해 야 할 경우 LinkedList 를 사용 해 야 합 니 다.요 소 를 빠르게 무 작위 로 접근 하려 면 ArrayList 를 사용 해 야 합 니 다.
3)벡터 클래스 Vector 는 Array List 와 매우 유사 하지만 Vector 는 동기 화 됩 니 다.Vector 에서 만 든 Iterator 는 Array List 에서 만 든 Iterator 와 같은 인터페이스 이지 만 Vector 가 동기 화 되 어 있 기 때문에 하나의 Iterator 가 만 들 어 졌 고 사용 되 고 있 습 니 다.다른 스 레 드 는 Vector 의 상 태 를 바 꾸 었 습 니 다(예 를 들 어 일부 요 소 를 추가 하거나 삭 제 했 습 니 다).이때 Iterator 를 호출 하 는 방법 은 Concurrent ModificationException 을 던 집 니 다.따라서 이 이상 을 포착 해 야 한다.
4)Stack 클래스 Stack 은 Vector 에서 계승 하여 후진 선 출 스 택 을 실현 합 니 다.Stack 은 Vector 를 스 택 으로 사용 할 수 있 도록 5 가지 추가 방법 을 제공 합 니 다.기본 적 인 push 와 pop 방법,그리고 peek 방법 은 스 택 꼭대기 의 요 소 를 얻 을 수 있 습 니 다.empty 방법 은 스 택 이 비어 있 는 지,search 방법 은 스 택 에 있 는 요 소 를 검사 합 니 다.Stack 이 생 성 된 후 빈 창고 입 니 다.
2.인터페이스 설정
set 는 중복 되 는 요 소 를 포함 하지 않 는 Collection 입 니 다.즉,임의의 두 요소 e1 과 e2 는 모두 e1.equals(e2)=false 가 있 고 set 는 최대 하나의 null 요소 가 있 습 니 다.set 의 구조 함 수 는 제약 조건 이 있 습 니 다.들 어 오 는 Collection 매개 변 수 는 중복 되 는 요 소 를 포함 할 수 없습니다. Set 용기 류 는 주로 HashSet 과 TreeSet 등 이 있다. 1)HashSet 클래스 자바.util.HashSet 류 는 자바.util.set 인 터 페 이 스 를 실현 했다. ->중복 요 소 를 허용 하지 않 습 니 다. ->정 집합 에서 원소 의 순 서 를 보장 하지 않 음 ->값 이 null 인 요 소 를 포함 할 수 있 지만,최대 한 개의 null 요소 만 있 을 수 있 습 니 다.
public class TestHashSet
{
public static void main(String [] args)
{
HashSet h=new HashSet();
h.add("1st");
h.add("2nd");
h.add(new Integer(3));
h.add(new Double(4.0));
h.add("2nd"); // ,
h.add(new Integer(3)); // ,
h.add(new Date());
System.out.println(" :size="+h.size());
Iterator it=h.iterator();
while(it.hasNext())
{
Object o=it.next();
System.out.println(o);
}
h.remove("2nd");
System.out.println(" :size="+h.size());
System.out.println(h);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2)TreeSet TreeSet 는 Set 의 변형 체 를 묘사 합 니 다.정렬 등 기능 을 실현 할 수 있 는 집합 입 니 다.대상 요 소 를 집합 에 추가 할 때 특정한 비교 규칙 에 따라 질서 있 는 대상 서열 에 자동 으로 삽입 하고 이 집합 요소 로 구 성 된 읽 기 uixiangxulie 는 항상'오름차 순'에 따라 배열 합 니 다.
public class TestTreeSet
{
public static void main(String [] args)
{
TreeSet ts=new TreeSet();
ts.add("orange");
ts.add("apple");
ts.add("banana");
ts.add("grape");
Iterator it=ts.iterator();
while(it.hasNext())
{
String fruit=(String)it.next();
System.out.println(fruit);
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
3.맵 집합 인터페이스
Map 은 Collection 인 터 페 이 스 를 계승 하지 않 았 습 니 다.Map 은 key 에서 value 까지 의 맵 을 제공 합 니 다.하나의 맵 에 같은 키 를 포함 할 수 없습니다.키 마다 하나의 value 만 매 핑 할 수 있 습 니 다.Map 인 터 페 이 스 는 3 가지 집합 보 기 를 제공 합 니 다.Map 의 내용 은 key 집합,value 집합 또는 key-value 맵 으로 사용 할 수 있 습 니 다.
:
boolean equals(Object o)
boolean remove(Object o)
put(Object key,Object value) key value
Hashtable
1
2
3
4
5
1.Hashtable 클래스 Hashtable 은 Map 인 터 페 이 스 를 계승 하여 key-value 맵 의 해시 표를 실현 합 니 다.비어 있 지 않 은(non-null)대상 은 키 나 value 로 사용 할 수 있 습 니 다.**데 이 터 를 추가 하려 면 put(key,value)를 사용 하고 데 이 터 를 꺼 내 려 면 get(key)을 사용 합 니 다.이 두 기본 작업 의 시간 소 비 는 상수 입 니 다.**Hashtable 은 initial capacity 와 load factor 두 개의 매개 변 수 를 통 해 성능 을 조정 합 니 다.일반적으로 부족 한 load factor 0.75 는 시간 과 공간의 균형 을 잘 이 루 었 다.load factor 를 확대 하면 공간 을 절약 할 수 있 지만 해당 하 는 검색 시간 이 커지 고 get 과 put 와 같은 작업 에 영향 을 줄 수 있 습 니 다.
key 의 대상 으로서 해시 함 수 를 계산 하여 이에 대응 하 는 value 의 위 치 를 확정 하기 때문에 key 의 대상 으로서 hashCode 와 equals 방법 을 실현 해 야 합 니 다.hashCode 와 equals 방법 은 루트 클래스 Object 를 계승 합 니 다.사용자 정의 클래스 를 key 로 사용 하려 면 상당히 조심해 야 합 니 다.해시 함수 의 정의 에 따라 두 대상 이 같 으 면 ob1.equals(ob2)=true 는 hashCode 가 같 아야 합 니 다.그러나 두 대상 이 다 르 면 hashCode 가 반드시 다 르 지 않 습 니 다.만약 두 대상 의 hashCode 가 같다 면,이러한 현상 을 충돌 이 라 고 하 는데 충돌 은 해시 표를 조작 하 는 시간 비용 을 증가 시 킬 수 있 기 때문에 가능 한 한 정 의 된 hashCode()방법 으로 해시 표 의 조작 을 가속 화 할 수 있다.
같은 대상 에 서로 다른 hashCode 가 있 으 면 해시 표 의 조작 에 예상 치 못 한 결과 가 발생 할 수 있 습 니 다.(기대 하 는 get 방법 은 null 로 되 돌아 갑 니 다)이런 문 제 를 피하 기 위해 서 는 equals 방법 과 hashCode 방법 을 동시에 복사 해 야 합 니 다.그 중 하나 만 쓰 지 마 십시오.
2,HashMap 클래스 HashMap 은 Hashtable 과 유사 합 니 다.다른 점 은 HashMap 이 동기 화 되 지 않 고 null,즉 null value 와 null key 를 허용 하지만 HashMap 을 Collection 으로 볼 때(values()방법 은 Collection 으로 돌아 갈 수 있 습 니 다.교체 서브 작업 시간 비용 과 HashMap 의 용량 은 비례 합 니 다.따라서 교체 작업 의 성능 이 상당히 중요 하 다 면 HashMap 의 초기 화 용량 을 너무 높 게 설정 하거나 load factor 를 너무 낮 게 설정 하지 마 세 요.
-JDK 1.0 은 첫 번 째 관련 집합 류 인 HashTable 을 도 입 했 는데 스 레 드 가 안전 합 니 다.Hash Table 의 모든 방법 은 동기 화 됩 니 다. -JDK 2.0 은 HashMap 을 도입 하여 동기 화 되 지 않 는 기본 클래스 와 동기 화 된 포장 기 synchronizedMap 을 제공 합 니 다.synchronizedMap 조건 부 스 레 드 보안 클래스. -JDK 5.0 util.concurrent 패키지 에 맵 스 레 드 안전 실현 Concurrent HashMap 을 도입 하여 synchronizedMap 보다 더욱 높 은 유연성 을 제공 합 니 다.동시에 진행 되 는 읽 기와 쓰기 동작 은 모두 병행 할 수 있다.
HashTable 과 HashMap 의 차이 점
、 。
public class Hashtable extends Dictionary implements Map
public class HashMap extends AbstractMap implements Map
、Hashtable , HashMap 。 , Hashtable, HashMap 。
、Hashtable ,key value null 。 HashMap ,null , ; null。 get() null , HashMap , null。 , HashMap get() HashMap , containsKey() 。
、 。Hashtable、HashMap Iterator。 ,Hashtable Enumeration 。
、 ,HashTable hashCode。 HashMap hash 。
、Hashtable HashMap 。HashTable hash 11, old*2+1。HashMap hash 16, 2 。
1
2
3
4
5
6
7
8
3,WeakHashMap 클래스 Weak HashMap 은 개 선 된 HashMap 으로 key 에 대해'약 한 인용'을 실행 합 니 다.만약 key 가 외부 에서 인용 되 지 않 는 다 면 이 key 는 GC 에서 회수 할 수 있 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.