Android List, Set, Map 의 소개 와 사용
19071 단어 Android 기본 지식
Android 에서 자주 사용 하 는 데이터 구 조 는 List, Set, Map 등 세 가지 집합 을 포함 하 는데 그 중에서 List 와 Set 는 Collection 에 속한다.List 와 set 의 차 이 는 List 가 중복 되 는 데 이 터 를 저장 할 수 있 지만 set 는 안 된다 는 것 이다.Map 은 일반적으로 key - value 와 같은 관계, 예 를 들 어 자주 사용 하 는 HashMap 이다.Android 의 집합 클래스 관계 도
Collection
|-List ,
| |-LinkedList , ,
| |-ArrayList , ,
| |_Vector ,
|_Set ,
| |-HashSet HashSet Hash ,
|
| |-LinkedHashSet LinkedHashSet hashCode , HashSet , , 。
|—Queue ( )
|-PriorityQueue
Map , Map
|-HashMap key hash , index, hash 。 。
|-LinkedHashMap HashMap HashMap, , 。
|-TreeMap HashMap , 。
|HashTable Hashtable , HashMap 。
2. List, Set 와 Map 의 소개 와 사용 사례
자주 사용 하 는 List 는 Array List, Linked List, Vector 를 포함 하여 이들 을 일일이 소개 한다.2.1 ArrayList ArrayList 비 스 레 드 안전, 바 텀 은 배열 에 의 해 이 루어 집 니 다. 그의 구 조 는 주로 AbstractList 에서 이 루어 집 니 다. 주로 초기 요소 의 용량 을 판단 하 는 것 입 니 다. ArrayList 의 가장 큰 특징 은 바로 Add, Get 작업 을 제공 하 는 것 입 니 다. 물론 교체 기 를 통 해 옮 겨 다 닐 수 있 고 요소 의 존 재 는 contains 방법 으로 판단 할 수 있 습 니 다.ArrayList 초기 화 및 할당
// :
ArrayList<String> list = new ArrayList<String>();
String str01 = String("test1");
String str02 = String("test2");
list.add(test1);
list.add(test2);
// :
ArrayList<String> list = new ArrayList<String>(){{add("test1"); add("test2");}};
Array List 사용 과정 에서 주의해 야 할 문 제 는 옮 겨 다 니 는 과정 에서 Item 요 소 를 삭제 하 는 것 입 니 다. 이 문 제 는 면접 자가 Array List 의 reove 를 사용 하 느 냐, Iterator 의 reove 를 사용 하 느 냐 하 는 것 입 니 다. 조작 이 잘못 되면 삭 제 된 요소 가 완전히 삭제 되 지 않 거나 Concurrent ModificationException 이상 이 발생 할 수 있 습 니 다.
// For ,
public class Test1 {
public static void main(String[] args) {
ArrayList aList = new ArrayList();
aList.add("a");
aList.add("ab");
aList.add("abc");
aList.add("abc");
aList.add("abcr");
aList.add("abc");
aList.add("abcf");
aList.add("abc");
aList.add("abdc");
for(int i = 0;i < aList.size();i++){
if(aList.get(i).equals("abc")){
aList.remove(i);
}
}
System.out.println(aList);
}
}
// :[a, ab, abc, abcr, abcf, abdc], abc
//
Iterator<String> iter = aList.iterator();
while(iter.hasNext()){
if(iter.next().equals("abc")){
iter.remove();
}
// [a, ab, abcr, abcf, abdc]
//
for (String tar : aList) {
if (tar.equals("abc")){
aList.remove(tar);
}
}
//
다시 말 하면 Array List 를 옮 겨 다 니 며 삭제 할 때 옮 겨 다 니 기 iterator 를 사용 하여 옮 겨 다 니 며 삭제 하 는 것 을 권장 합 니 다.
2.2 LinkedList Android 의 LinkedList 는 양 방향 목록 을 통 해 이 루어 집 니 다.링크 요 소 는 자신의 값 을 포함 하 는 것 외 에 도 이전 요소 와 다음 요소 의 참조 도 포함 하고 있 습 니 다.
private static final class Link<T> {
T data;//
Link<T> previous, next;// ,
Link(T o, Link<T> p, Link<T> n) {
data = o;
previous = p;
next = n;
}
}
LinkedList 의 삽입 과 삭제 작업 은 양 방향 링크 의 삽입 과 삭제 작업 입 니 다. 다음 과 같 습 니 다.
//
private boolean addLastImpl(E object) {
Link<E> oldLast = voidLink.previous;
// ,
Link<E> newLink = new Link<E>(object, oldLast, voidLink);
//
voidLink.previous = newLink;
//
oldLast.next = newLink;
size++;
modCount++;
return true;
}
//
@Override
public E remove(int location) {
if (location >= 0 && location < size) {
Link<E> link = voidLink;
if (location < (size / 2)) {
for (int i = 0; i <= location; i++) {
link = link.next;
}
} else {
for (int i = size; i > location; i--) {
link = link.previous;
}
}
Link<E> previous = link.previous;
Link<E> next = link.next;
previous.next = next;
next.previous = previous;
size--;
modCount++;
return link.data;
}
throw new IndexOutOfBoundsException();
}
LinkedList 는 List 의 인 터 페 이 스 를 실현 하 는 동시에 Queue 의 인터페이스 도 실현 했다.
2.3 Vector Vector 는 동기 화 작업 을 하 는 ArrayList 에 해당 하지만 동기 화 특성 으로 인해 일부 성능 의 손실 을 초래 할 수 있 습 니 다.Vector 는 배열 과 동기 화 특성 을 바탕 으로 요소 추가, 제거, 교체 등 모든 작업 을 지원 하 며 NULL 을 포함 한 요 소 를 허용 합 니 다.2.4 HashSet Set 은 가장 간단 한 집합 이다.집합 중인 대상 은 특정한 방식 으로 정렬 하지 않 고 중복 대상 이 없다.HashSet 류 는 해시 알고리즘 에 따라 집합 중의 대상 을 액세스 하고 액세스 속도 가 비교적 빠르다.일반적으로 HashSet 로 List 에서 같은 요 소 를 다시 제거 합 니 다. 다음 을 참고 하 십시오.
public static void main(String[] args) {
List list = new ArrayList<>();
list.add("a");
list.add("f");
list.add("b");
list.add("c");
list.add("a");
list.add("d");
System.out.println(list);
list = removeSame(list);
System.out.println(list);
}
private static List removeSame(List list) {
Set set = new HashSet<>();
set.addAll(list);
List listSingle = new ArrayList<>();
for(String s : set){
listSingle.add(s);
}
return listSingle;
}
2.5 TreeSet 과 LinkedHashSet TreeSet 는 순 서 를 저장 하 는 Set 이 고, 밑 층 은 트 리 구조 입 니 다.이 를 사용 하면 Set 에서 질서 있 는 서열 을 추출 할 수 있 습 니 다.LinkedHashSet 은 HashSet 의 조회 속 도 를 가지 고 내부 에서 링크 유지 요 소 를 사용 하 는 순서 (삽 입 된 순서) 입 니 다.따라서 교체 기 를 사용 하여 set 를 옮 겨 다 닐 때 구 조 는 요소 가 삽 입 된 순서에 따라 표 시 됩 니 다.2.6 Queue Queue 는 '대기 열' 이라는 데이터 구 조 를 모 의 하 는 데 사 용 됩 니 다.Queue 가 제공 하 는 동작 함 수 는 다음 과 같 습 니 다.
대열 에 들어가다
대열 에 나가다
검색 하 다.
offer(E e)
poll()
peek()
add(E e)
remove()
element()
Queue 의 실현 유형 은 주로 세 가지 비 스 레 드 안전 으로 나 뉜 다. LinkedList, Priority Queue 등 이다.스 레 드 보안: 비 차단 ConcurrentLinkedQueue 스 레 드 안전, 차단: BlockingQueue 구현 클래스: Array BlockingQueue, LinkedBlockingQueue, Priority BlockingQueue.Queue 는 안 드 로 이 드 개발 에서 많은 장면 을 사용 합 니 다. 예 를 들 어 온라인 프로 세 스 탱크 의 작업 대기 열 은 보통 링크 드 BlockingQueue 로 저 장 됩 니 다.
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(
nThreads, nThreads,
0L, TimeUnit.SECONDS,
new LinkedBlockingQueue() // LinkedBlockingQueue
);
2.7 Map 은 일반적인 코드 에 사용 되 는 키 쌍 을 저장 하 는 기능 을 제외 하고 맵 이 평소에 사용 하 는 옮 겨 다 니 는 동작 만 요약 합 니 다. 다음 을 참조 하 십시오.
// Map.values() value, key
for (String v : map.values()) {
System.out.println("value= " + v);
}
// , key value, key , 、
// keySet key value
for (String key : map.keySet()) {
System.out.println("key= "+ key + " and value= " + map.get(key));
}
// , key value
// entrySet iterator key value
Iterator
3. Android 에서 자주 사용 되 는 다른 데이터 구조
SparseArray 형식, SparseArray 는 다음 과 같은 특성 이 있 습 니 다.
1、SparseArray android , hashmap
2、SparseArray HashMap , ,
3、SparseArray key
4、SparseArray , ,
5、SparseArray 。( , 。)
SparseArray 의 삽입
SparseArray<String> sparseArray = new android.util.SparseArray<String>(16);
sparseArray.put(10, "value");
sparseArray.get(10);
참고 블 로그
원본 코드 에서 안 드 로 이 드 가 자주 사용 하 는 데이터 구조 (SDK 23 버 전) (3, Queue 편) 안 드 로 이 드 List, Set, Map 집합 안전 집합 구별 및 집합 류 성능 분석Array Map 과 SparseArray