zoukankan      html  css  js  c++  java
  • Java 集合系列10 TreeMap集合

    1. TreeMap集合介绍

      TreeMap是一个有序的key-value集合,它是通过红黑树实现的。

      可排序是TreeMap集合的最重要特点,其映射根据键的自然顺序进行排序,或者根据创建映射时提供的Comparator比较器进行排序。

    2. TreeMap数据结构

    public class TreeMap<K,V>
        extends AbstractMap<K,V>
        implements NavigableMap<K,V>, Cloneable, java.io.Serializable
        static final class Entry<K,V> implements Map.Entry<K,V> {
            K key;
            V value;
            Entry<K,V> left;
            Entry<K,V> right;
            Entry<K,V> parent;
            boolean color = BLACK;
        }

      TreeMap继承AbstractMap,并且实现了NavigableMap接口。

      TreeMap的本质是红黑树,包含几个重要的成员变量:root,size,comparator。

      root是红黑树的根节点,是一个Entry类型。Entry是红黑树的节点,包含红黑树的6个基本组成部分:key,value,left(左孩子),right(右孩子),parent(父节点),color(颜色)。Entry节点根据key进行排序,Entry节点包含的内容为value。Entry中的key比较大小是根据比较器comparator来判断的。

    3. TreeMap源码解析

    //无参构造方法,默认比较机制
    public TreeMap() {
            comparator = null;
        }
    //自定义比较器的构造方法
    public TreeMap(Comparator<? super K> comparator) {
            this.comparator = comparator;
        }
    //构造已知Map对象的TreeMap
    public TreeMap(Map<? extends K, ? extends V> m) {
            comparator = null;   //默认比较机制
            putAll(m);
        }
    //构造已知的SortedMap对象为TreeMap
    public TreeMap(SortedMap<K, ? extends V> m) {
            comparator = m.comparator();  //使用已知对象的构造器
            try {
                buildFromSorted(m.size(), m.entrySet().iterator(), null, null);
            } catch (java.io.IOException | ClassNotFoundException cannotHappen) {
            }
        }

    4. TreeMap实例

    public class TreeMapTest {
        public static void main(String[] args) {
            Random r = new Random();
            TreeMap<String,Integer> treeMap = new TreeMap<>();
            treeMap.put("one",r.nextInt(10));
            treeMap.put("two",r.nextInt(10));
            treeMap.put("three",r.nextInt(10));
    
            System.out.println(treeMap);
            System.out.println("通过keySet遍历");
            Set<String> set = treeMap.keySet();
            Iterator<String> it = set.iterator();
            while (it.hasNext()){
                String key = it.next();
                Integer value = treeMap.get(key);
                System.out.println(key + "=" + value);
            }
            for(String s : set){
                System.out.println(s + "=" + treeMap.get(s));
            }
            System.out.println("通过entrySet遍历");
            Set<Map.Entry<String,Integer>> set1 = treeMap.entrySet();
            Iterator<Map.Entry<String,Integer>> it1 = set1.iterator();
            while (it1.hasNext()){
                Map.Entry<String,Integer> map = it1.next();
                String key = map.getKey();
                Integer value = map.getValue();
                System.out.println(key + "=" + value);
            }
            for(Map.Entry<String,Integer> mm : set1){
                System.out.println(mm.getKey() + "=" + mm.getValue());
            }
    
            System.out.println(treeMap.size());
            System.out.println(treeMap.containsKey("one"));
            System.out.println(treeMap.containsValue(0));
            System.out.println(treeMap.remove("three"));
            System.out.println(treeMap);
            treeMap.clear();
            System.out.println(treeMap.isEmpty());
        }
    }
  • 相关阅读:
    20162309《程序设计与设计结构》第一周学习总结
    20162309《程序设计与数据结构》课程总结
    网络编程与安全实验报告
    四则运算挑战出题
    Android实验报告
    四则运算第二周实验报告
    XP实验报告
    20162319 2017-2018-1 《程序设计与数据结构》第3周学习总结
    20162319 2017-2018-1 《程序设计与数据结构》第1周学习总结
    结对编程-马尔克夫链
  • 原文地址:https://www.cnblogs.com/homle/p/15027134.html
Copyright © 2011-2022 走看看