本章内容:map的底层原理,底层存储过程,hashmap\treemap的使用

map(键值对):有hashMap实现类:hashMap底层实现了哈希表,这是一个非常重要的数据结构。
 *               哈希表:基本结构是“数组+链表”,将两个的优点结合起来了。
 *                链表:指的是entry类型的对象,每一个entry对象就是一个单向链表结构,存储结构:
 *                 hash,key,value,next  hash:键对象的hash值; next:下一个节点(链表)
 *                数组:entry链表放在entry[]数组里,默认大小是16.
 *             treeMap:树结构。
 *  如何存储:1.存储map对象的时候,先通过对象.hashCode()方法,获得hashCode,也就是一串号码
 *           2.根据hashCode计算出hash值(要求在(0,数组长度-1)区间);hashCode是一个整
 *           数,需要将它转换为(0,数组长度-1)区间,转化后的hash值尽量均匀的分布在(0,
 *           数组长度-1)区间这个区间,减少“hash冲突”
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;
public class TestMap {
    public static void main(String[] args) {
        test3();
    }

    //hashmap常用方法
    public static void test1(){
        Map<Integer,String> m1= new HashMap<>();
        Map<Integer,String> m2= new HashMap<>();
        m1.put(1,"a");//设值
        m1.put(2,"b");
        m1.put(3,"c");
        m1.put(4,"d");

        m2.put(5,"one");
        m2.put(6,"two");

        String s =m1.get(2);
        System.out.println(m1.size());
        System.out.println(m1.containsKey(2));
        System.out.println(m1.containsValue("d"));
        m2.put(4,"four");//map中键值不能重复,新的会把旧的覆盖
        m1.putAll(m2);
        System.out.println(m1);
    }
    //hashmap常用方法
    public static void test2(){
        Employee e1 = new Employee(01,"小白",8000);
        Employee e2 = new Employee(02,"小花",80000);
        Employee e3 = new Employee(03,"小黑",10000);

        Map<Integer,Employee> map = new HashMap<>();
        map.put(001,e1);
        map.put(002,e2);
        map.put(003,e3);
        System.out.println(map.hashCode());
    }

    //treemap
    public static void test3(){
        Map<Integer,String> tm = new TreeMap<>();
        tm.put(9,"h");
        tm.put(3,"f");
        tm.put(10,"k");

        //按照key递增的方式排序
        for(Integer key:tm.keySet()){
              System.out.println(key+"---"+tm.get(key));
        }

        Map<Emp,String> empMap = new TreeMap<>();
        empMap.put(new Emp(100,"jack",30000),"工作努力");
        empMap.put(new Emp(10,"tom",3000),"工作偷懒");
        empMap.put(new Emp(500,"mile",10000),"工作还行");

        //根据salary递增来排序
        for(Emp key:empMap.keySet()){
            System.out.println(key+"---"+empMap.get(key));
        }

    }

}

class Emp implements Comparable<Emp>{
    int id ;
    String name;
    double salary;

    public Emp(int id, String name, double salary) {
        this.id = id;
        this.name = name;
        this.salary = salary;
    }

    @Override
    public String toString() {
        return "Emp{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", salary=" + salary +
                '}';
    }

    @Override
    public int compareTo(Emp o) {//正数:大于;负数:小于;0:等于
        if(this.salary > o.salary){
            return 1;
        }else if(this.salary < o.salary){
            return -1;
        }else{
            if(this.id > o.id){
                return 1;
            }else if(this.id<o.id){
                return -1;
            }else{
                return 0 ;
            }
        }
    }
}
//雇员信息
class Employee{
    private int id ;
    private String name;
    private double salary;

    public Employee(int id,String name,double salary){
        this.id = id;
        this.name = name;
        this.salary = salary;
    }
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }
}