Java集合框架4TreeMap

2017-04-11  本文已影响0人  paulpaullong

TreeMap定义

package java.util;
public class TreeMap<K,V>
    extends AbstractMap<K,V>
    implements NavigableMap<K,V>, Cloneable, java.io.Serializable{
}
public interface NavigableMap<K,V> extends SortedMap<K,V>{}

TreeMap继承AbstractMap,实现NavigableMap、Cloneable、Serializable三个接口。其中AbstractMap表明TreeMap为一个Map即支持key-value的集合, NavigableMap则意味着它支持一系列的导航方法,具备针对给定搜索目标返回最接近匹配项的导航方法。

private final Comparator<? super K> comparator;  //比较器
private transient Entry<K,V> root = null;  //TreeMap红-黑节点,为TreeMap的内部类 
private transient int size = 0;  //容器大小 
private transient int modCount = 0;  //TreeMap修改次数 
private static final boolean RED = false;  //红黑树的节点颜色–红色 
private static final boolean BLACK = true; //红黑树的节点颜色–黑色 

对于实体节点Entry是TreeMap的内部类,是通过红黑树实现的。
红黑树顾名思义就是节点是红色或者黑色的平衡二叉树,它通过颜色的约束来维持着二叉树的平衡。对于一棵有效的红黑树二叉树而言我们必须增加如下规则:
1)每个节点都只能是红色或者黑色
2)根节点是黑色
3)每个叶节点(NIL节点,空节点)是黑色的。
4)如果一个结点是红的,则它两个子节点都是黑的。也就是说在一条路径上不能出现相邻的两个红色结点。
5)从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。

TreeMap特点

Map m = Collections.synchronizedSortedMap(new TreeMap(…));
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;
    }
}

测试代码

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
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;
    }

    //getter and setter方法省略....
}

测试代码

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的区别

上一篇 下一篇

猜你喜欢

热点阅读