4.29Java TreeMap

2021/4/30 22:25:41

本文主要是介绍4.29Java TreeMap,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

4.29Java TreeMap

TreeMap概念

TreeMap是红黑二叉树的典型实现,打开TreeMap源码:

private transient Entry<k,V> root = null;

root用来存储树的根节点(Entry是TreeMap的内部类())

Entry Code

static final class Entry<K,V> implements Map,Entry<K,V>{
    K key;
        V value;
        Entry<K,V> left = null;
        Entry<K,V> right = null;
        Entry<K,V> parent;
        boolean color = BLACK;
}
从源码看TreeMap结构:

属性:

  • 左节点

  • 右节点

  • 父节点

  • 节点颜色---红黑二叉树

TreeMap的put和remove方法大量使用了红黑树的理论---深入学习红黑树理论---在需要排序的Map时才选用TreeMap

Emloyee类:

package collection.map.TreeMap;
​
/*
因为key可以是任意对象,treemap是递增的方式排序
如果key的值为类会如何排序?
新的接口---comparable
 */
/*定义一个新的类*/
public class Employee implements Comparable<Employee>{
​
    //定义它的属性
    int id;
    String name;
    double salary;
    /*以Employee为key,按照salary排序--->需要实现comparable接口*/
​
    /*构造器*/
    public Employee(int id, String name, double salary){
        super();
        this.id = id;
        this.name = name;
        this.salary = salary;
    }
​
    /*重写toString方法*/
    @Override
    public String toString(){
        return "id:" +  id + ",name:" + name + ",salary:" + salary;
    }
​
    /*实现接口当中未实现的方法*/
    @Override
    public int compareTo(Employee o){
        //TODO Auto-generated method stub
        //负数 : 小于, 0 : 等于, 正数 : 大于--->1 -1 0代替
        //比较salary
        if (salary > o.salary){
            //返回值
            return 1;
        }else if (salary < o.salary){
            return -1;
        }else {
            //如果工资相等利用id排序
            if (this.id > o.id){
                return 1;
            }else if (this.id < o.id){
                return -1;
            }else {
                return 0; //相等
            }
        }
    }
}

TreeMap类:

package collection.map.TreeMap;
​
import java.util.Map;
​
/**
 * 测试TreeMap的使用
 * @author Lucifer
 */
public class TreeMap {
    public static void main(String[] args) {
        //新建Map对象
        Map<Integer,String> treemap1 = new java.util.TreeMap<>();
        //利用put方法往里面放入链表
        treemap1.put(20,"aa");
        treemap1.put(3,"bb");
        treemap1.put(6,"cc");
        /*对Map进行遍历---对链表遍历(可以使用增强for循环)*/
        //按照key递增的方式进行排序
        for (Integer key : treemap1.keySet()){
            //keySet返回的是一个Set集合,放到临时变量里面
            System.out.println(key + "---" + treemap1.get(key)); //打印结果按照key递增的方式进行排序然后打印出来
        }
​
        /*定义一个新的对象---新的Map*/
        Map<Employee, String> treemap2 = new java.util.TreeMap<>();
        //put方法往里面添加链表内容
        treemap2.put(new Employee(100,"Lucifer",100000),"他好坏呀!");
        treemap2.put(new Employee(200,"James",90000),"还可以!");
        treemap2.put(new Employee(300,"Harden",80000),"真不戳!");
        treemap2.put(new Employee(400,"Kevin",80000),"我带你们打!"); //薪水相同会按照id递增的方式排序
​
        /*在进行一个排序--->按照key递增进行排序--->key是Employee对象--->Employee对象递增的方法(Employee类定义了)*/
        for (Employee key : treemap2.keySet()){
            System.out.println(key + "---" + treemap2.get(key));
        }
    }
}

HashMap和HashTable

map接口有一个子类叫hashtable

特点:

  • hashmap是一个map接口的实现类!!!!!

  • hashmap采用hash算法实现,是map接口最常用的实现类!!!

  • hashmap在查找、删除、修改方面都有非常高的效率

HashMap和HashTable的区别

  1. HashMap:线程不安全、效率高、允许key或value为null

  2. HashTable:线程安全、效率低、不允许key或value为null

如果key是一个类那么就要实现compareble接口



这篇关于4.29Java TreeMap的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程