Map集合之TreeMap

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Map集合之TreeMap相关的知识,希望对你有一定的参考价值。

参考技术A

TreeMap: 键不允许重复 底层是树的结构 可排序
TreeMap 如果将自定义类放在 key的位置 ,那这个类必须实现 自然排序或者 定制排序,否则报 ClassCastException
如何实现排序? 两种方式:
1 自然排序:
1> 创建需要排序的类 实现 Comparable <需要排序的类型>
2> 重写 compareTo 返回值如果返回0 证明两个对象相同,则不能存入集合
如果返回 1 -1 升序 降序
调用者比参数大 返回1 就是升序
调用者比参数小 返回1 就是降序
允许出现 第一条件...第二条件...
3> 创建TreeSet集合 将类放入 TreeSet集合的泛型中
2 定制排序:
1> 创建需要排序的类
2> 创建比较器的类 实现 Comparator <需要排序的类>
3> 重写 compare方法
参数 o1 类似于 compareTo方法中的this 也就是调用者
参数 o2 类似于 compareTo方法中的参数
4> 创建TreeSet集合 泛型< 需要排序的类> 构造方法中 必须传递 比较器对象
举个例子
自然排序

Text.java

java 集合框架之 Map

show Me the code!

常用的Map 下 有treeMap,hashmap,hashtable,linkhashMap,下列代码就对以上四种做了比较 并简单说明其底层实现。

public class MyMap {
    public static void testaddTreeMap(){
        TreeMap<String,Object> treeMap = new TreeMap<String, Object>();
        treeMap.put("赵云",23);
        treeMap.put("曹操",24);
        treeMap.put("马超",25);
        treeMap.put("司马懿",26);
        treeMap.put("2",0);
        treeMap.put("1",0);
        treeMap.put("3",null);
        for(Map.Entry<String, Object> entry : treeMap.entrySet()) {
            System.out.println(entry.getKey() + ": " +entry.getValue());
        }
//1: 0 2: 0 3: null 司马懿: 26 曹操: 24 赵云: 23 马超: 25 --treeMap 
//--特点:key值有序 非线程安全 父类:AbstractMap 允许value为null key 禁止为null");
    MyMap.testaddTreeMap();
// 底层实现是平衡二叉树(红黑树)对key 进行排序 如果需要key 有序即可使用,这里多给treeMap 设置一个2与1的key 结果表明对key进行了排序


    }
    public static void testHashMap(){
        Map<String, Object> hashMap = new HashMap<String, Object>();
        hashMap.put("赵云",23);
        hashMap.put("曹操",24);
        hashMap.put("马超",25);
        hashMap.put("司马懿",26);
        hashMap.put(null,null);
        for(Map.Entry<String, Object> entry : hashMap.entrySet()) {
            System.out.println(entry.getKey() + ": " +entry.getValue());
        }
//null: null 司马懿: 26 曹操: 24 马超: 25 赵云: 23
//  --hashMap  --:特点:无序,非线程安全,父类:AbstractMap- 允许 null  key/value;
    }
MyMap.testHashMap(); 
/**底层实现:是散列表(数组配合单链表实现)HashMap会先用key的hash值来检查是否发生了hash碰撞,也就是对应的位置是否为空,
这个没问题。问题是当发生了hash碰撞时,就会比较该位置上存储的每一个key是否与新存入的相等,如果相等就替换之,否则就在该位置的索引+1的位置增加一个值。*/

public static void testLinkedHashMap(){
        LinkedHashMap<String,Object> linkedHashMap = new LinkedHashMap<String, Object>();
        linkedHashMap.put("赵云",23);
        linkedHashMap.put("曹操",24);
        linkedHashMap.put("马超",25);
        linkedHashMap.put("司马懿",26);
        linkedHashMap.put(null,null);
        linkedHashMap.put("2",1);
        linkedHashMap.put("1",1);
        for(Map.Entry<String, Object> entry : linkedHashMap.entrySet()) {
            System.out.println(entry.getKey() + ": " +entry.getValue());
        }
//赵云: 23 曹操: 24 马超: 25 司马懿: 26  null: null 2: 1 1: 1
//"-linkHashMap--特点:有序!(这里的有序不是指排序!而是根据插入的顺序返回) 非线程安全, 父类hashMap 允许 null key/value;
  //MyMap.testLinkedHashMap();//与hashMap的实现一致,唯一不同采用了双向循环链表,加入before指针,所以可以轻易的找到上一个节点实现有序


    }
    public static     void  testHashTable(){
        Hashtable<String,Object> hashtable = new Hashtable<String, Object>();
        hashtable.put("赵云",23);
        hashtable.put("曹操",24);
        hashtable.put("马超",25);
        hashtable.put("司马懿",26);
//        hashtable.put(null,null);
        for(Map.Entry<String, Object> entry : hashtable.entrySet()) {
            System.out.println(entry.getKey() + ": " +entry.getValue());
        }
      //马超: 25 司马懿: 26 赵云: 23 曹操: 24
      //--HashTable --特点:无序,线程安全,父类dirtory,禁止 null key/value;
        //MyMap.testHashTable(); //底层实现与hashMap一致 只是在所有方法上加了synchronized    }

    public static void main(String[] args) {

 }
}

 

 

hashMap 底层数据结构展示图

hashMap 是由数组与单链表组合而成,而linkhashmap 大致与上相同,但唯一不同他采用的双向循环链表所以,除了上图的next 还有个before 所以这样就可以找到前一个元素实现有序。

以上是关于Map集合之TreeMap的主要内容,如果未能解决你的问题,请参考以下文章

Java之Map集合

Map集合之TreeMap

JAVA 基础之容器集合(Collection和Map)

集合详解之 Map

java之map接口

集合面试题之双列集合Map