집합 - treeMap 상세 해석 과 TreeSet 상세 해석 및 이들 의 차이 점

TreeMap 바 텀 데이터 구조: TreeMap 바 텀 데이터 구 조 는 빨 간 검 은 나무 입 니 다.
검 붉 은 나무 특성:
  • 모든 노드 는 빨간색 이나 검은색 만 있 을 수 있다.
  • 뿌리 노드 는 검은색 이다.
  • 각 잎 노드 (NLL 노드, 빈 노드) 는 검은색 이다.
  • 만약 에 한 노드 가 빨간색 이 라면 그의 두 노드 는 모두 검은색 이다.즉, 한 경로 에 인접 한 두 개의 빨간색 노드 가 나타 나 면 안 된다 는 것 이다.
  • 모든 노드 에서 모든 잎의 모든 경 로 는 같은 수량의 검은색 노드 를 포함한다.

  • 특징:
    TreeMap 은 비 스 레 드 가 안전 합 니 다. 그러나 다음 과 같은 방식 으로 스 레 드 안전 으로 설정 할 수 있 습 니 다.
       Map m=Collections.synchronizedSortedMap(new TreeMap());

    TreeMap 은 키 로 정렬 되 어 있 으 며, 기본적으로 오름차 순 으로 정렬 됩 니 다.Comparable 또는 Comparator 를 통 해 정렬 하기;TreeMap 은 SortedMap 인터페이스 가 붉 은 검 은 나 무 를 기반 으로 한 것 입 니 다.이 는 맵 이 오름차 순 으로 키 워드 를 배열 하 는 것 을 보장 합 니 다. 사용 하 는 구조 방법 에 따라 키 의 자 연 스 러 운 순서 로 정렬 하거나 만 들 때 제공 하 는 비교 기 (사용자 정의) 에 따라 정렬 할 수 있 습 니 다.
    값 중복 허용, 키 중복 허용 하지 않 음;
    키 는 null (비교 기 가 null 을 처리 하면 null 일 수 있 습 니 다) 이 고 값 은 null 일 수 있 습 니 다.
    TreeMap 의 응용:
    사용자 정의 정렬:
      Map<Integer,Integer> map = new TreeMap<>();
            map.put(1, null);
            map.put(10, 1);
            map.put(3, 2);
            map.put(2, 3);
            
            for(Map.Entry<Integer, Integer> entry:map.entrySet())
            {
                System.out.println(entry.getKey()+":"+entry.getValue());
            }
    
           //    
           // 1:null
           // 2:3
           // 3:2
           // 10:1
    

    Comparable 정렬: 사용자 정의 클래스 가 Comparable 인 터 페 이 스 를 실현 하면 정렬 이 가능 합 니 다.
    
        public class Person1 implements Comparable<Person1>
    {
        private int age;
        private String name;
     
        public Person1(String name, int age)
        {
            this.name = name;
            this.age = age;
        }
     
     
        @Override
        public int compareTo(Person1 o)
        {
            return this.age-o.age;
        }
     
        @Override 
        public String toString()
        {
            return name+":"+age;
        }
    }
     public class TreeMapDemo{
        public static void main(String [] args){
            Map<Person1,Integer> map = new TreeMap<>();
            Person1 person1 = new Person1("zzh",18);
            Person1 person2 = new Person1("jj",17);
            Person1 person3 = new Person1("qq",19);
            map.put(person1, 1);
            map.put(person2, 2);
            map.put(person3, 3);
            for(Entry<Person1, Integer> entry:map.entrySet()){
                System.out.println(entry.getKey()+":"+entry.getValue());
            }
    
         }
     }    
    
    
      //    :
      //jj:17:2
      //zzh:18:1
      //qq:19:3
    
    

    Comparator 정렬: TreeMap 을 만 드 는 구조 함수 에서 Comparator 인터페이스의 실현 을 설명 하기 만 하면 됩 니 다
    
       public final class Person2
    {
        private int age;
        private String name;
     
        public Person2(String name, int age)
        {
            this.name = name;
            this.age = age;
        }
     
        @Override 
        public String toString()
        {
            return name+":"+age;
        }
      
    }
    
      public class TreeMapDemo{
        public static void main(String [] args){
    
          Map<Person2,Integer> map2 = new TreeMap<>(new Comparator<Person2>(){
                @Override
                public int compare(Person2 o1, Person2 o2)
                {
                    if(o1 == null || o2 == null)
                        return 0;
                    return o1.getAge()-o2.getAge();
                }
            });
            Person2 p1 = new Person2("zzh",18);
            Person2 p2 = new Person2("jj",17);
            Person2 p3 = new Person2("qq",19);
            map2.put(p1, 1);
            map2.put(p2, 2);
            map2.put(p3, 3);
            for(Entry<Person2, Integer> entry:map2.entrySet())
            {
                System.out.println(entry.getKey()+":"+entry.getValue());
            }
       }
    }
       
       //    :
       //jj:17:2
       //zzh:18:1
       //qq:19:3
     
    

    HashMap 과 TreeMap 의 차이 점:
    실현 방식
    HashMap: 해시 표를 바탕 으로 이 루어 집 니 다.HashMap 에서 요구 하 는 키 클래스 를 사용 하여 HashCode () 와 equals () 방법 (이 두 가지 방법 을 다시 쓸 수 있 음) 을 명 확 히 정 의 했 습 니 다. HashMap 공간의 사용 을 최적화 하기 위해 초기 용량 과 부하 인 자 를 조정 할 수 있 습 니 다.
    TreeMap: 붉 은 검 은 나 무 를 기반 으로 이 루어 집 니 다.트 리 맵 은 트 리 가 항상 균형 상태 에 있 기 때문에 옵션 을 조정 하지 않 았 습 니 다.
    용도:
    HashMap: 맵 에 요 소 를 삽입 하고 삭제 하 며 포 지 셔 닝 하 는 데 적 용 됩 니 다.
    TreeMap: 자연 순서 나 사용자 정의 순서 로 키 (key) 를 옮 겨 다 니 는 데 적 용 됩 니 다.
    HashMap 은 보통 TreeMap 보다 빠 릅 니 다 (수 와 해시 표 의 데이터 구조 때 문 입 니 다). HashMap 을 많이 사용 하고 정렬 할 때 TreeMap 을 사용 하 는 것 을 권장 합 니 다.
    containsKey 방법 이 다 르 기 때문에 HashMap 은 equals () 방법 으로 비교 하고 TreeMap 은 비교 기 를 사용 하여 비교 하 며 이들 의 차이 가 0 이면 이들 이 같다 고 판단 한다.
    TreeSet: TreeSet 은 TreeMap 에 대한 패 키 징 을 실 현 했 고 응용 방법 은 모두 같 습 니 다.값 은 모두 new Object ();키 중복 불가;
    TreeSet 정렬 은 TreeMap 과 마찬가지 로 Comparator 비교 기 정렬 방식 만 알려 줍 니 다.
       package collection.Map;
    
    import java.util.Comparator;
    import java.util.Iterator;
    import java.util.Map;
    import java.util.TreeMap;
    
    /**
     * @Created with IntelliJ IDEA
     * @Description:
     * @Package: collection.Map
     * @author: FLy-Fly-Zhang
     * @Date: 2019/2/27
     * @Time: 19:38
     */
    class Preson{
        int val;
        String s;
    }
    
    public class TreeMapDemo {
        public static void main(String[] args) {
            //Comparator  
            TreeMap<Preson,Integer> treeMap=new TreeMap<>(new Comparator<Preson>() {
                @Override
                public int compare(Preson o1, Preson o2) {
                    return 0;
                }
            });
          
            //      map      
            Iterator<Map.Entry<Preson,Integer>> iterator=treeMap.entrySet().iterator();
            Iterator iterator1=treeMap.keySet().iterator();
            Iterator iterator2=treeMap.values().iterator();
        }
    }
    
    

    두 가 지 는 주로 다르다. 응용 장면 이 다 르 기 때문에 TreeSet 의 응용 장면 은 key 값 을 다시 추가 하고 key 값 을 정렬 하 는 것 이다.

    좋은 웹페이지 즐겨찾기