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.Entry> it = map.entrySet().iterator();  
while (it.hasNext()) {  
    Map.Entry entry = it.next();  
    System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());  
}

//   ,       ,TreeMap      
// entrySet  key value  
for (Map.Entry entry : map.entrySet()) {  
    System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());  
} 

3. Android 에서 자주 사용 되 는 다른 데이터 구조
SparseArray 형식, SparseArray 는 다음 과 같은 특성 이 있 습 니 다.
1SparseArray android        ,       hashmap       
2SparseArray HashMap    ,                        ,        
3SparseArray    key      
4SparseArray          ,         ,        
5SparseArray          。(          ,      。)

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

좋은 웹페이지 즐겨찾기