HashMap

含义

key-value结构

常用方法

put
get
isEmpty
size
containsKey
containsValue
clear
remove

示意图

案例

public class HashMapDemo {
    
    //HashMap
        //含义:key-value结构
        //底层
            //数组+单向链表
      
        //Map
            //HashMap
        //初步使用
    
        //常用方法
            //put
            //get
            //isEmpty
            //size
            //containsKey
            //containsValue
            //clear
            //remove
    
    public static void main(String[] args) {
        
        HashMap data = new HashMap();
        
        data.put("name", "zhangsan");
        data.put("age",18);
        data.put("address", "广东");
        
        System.out.println(data.get("name"));
        System.out.println(data.get("age"));
        System.out.println(data.get("address"));
        
        System.out.println(data.isEmpty());   //false
        System.out.println(data.size());      //3
        System.out.println(data.containsKey("name"));  //true 
        System.out.println(data.containsValue("广东")); //true
        
        data.remove("name");
        System.out.println(data);
        
        //data.clear();
        
        //遍历
        System.out.println("---------------------方式一-----------------");
        Set keies = data.keySet();
        //理解为类似list,此处包含所有的key
        
        for(Object key : keies){
            System.out.println(key+"======="+data.get(key));
        }
        
        System.out.println("---------------------方式二-----------------");
        Collection values = data.values();
        for(Object value : values){
            System.out.println(value);
        }
        
        System.out.println("---------------------方式三-----------------");
        
        //<Entry>代表此时set里面的每个元素的类型是Entry
        Set<Entry> entries =   data.entrySet();
        
        for(Entry entry : entries){
            System.out.println(entry.getKey()+"========="+entry.getValue());
        }
    }
}

LinkedHashMap

含义

有序的HashMap

案例

public class LinkedHashMapDemo {
    
    //LinkedHashMap
        //继承HashMap
            //特点:有序
    public static void main(String[] args) {
        
        Map data =  new LinkedHashMap();
        
        data.put(33,33);
        data.put("aa","aa");
        data.put("ff","ff");
        data.put("dd","dd");
        data.put("cc","cc");
        data.put("11","11");
        data.put("22","22");
        
        System.out.println(data);
    }
}

HashTable

含义

  • 重量级的HashMap【线程安全的HashMap】
  • 里面的方法都是加了synchronized

注意

  • 里面的方法都是加了synchronized
  • key和value都不能 null

体系结构

  • Map

    • Hashtable

案例

package com.neu.day08._03map;

import java.util.Hashtable;

public class HashTableDemo {
    
    //含义:重量级的HashMap【线程安全的HashMap】
           //里面的方法都是加了synchronized
    
    //注意点
         //里面的方法都是加了synchronized
         //key和value都不能 null
    
    //体系结构
        //Map
            //HashTable
    
    public static void main(String[] args) {
        Hashtable data = new Hashtable();
        data.put("name","zs");
        
        System.out.println(data.get("name"));
    }
}

TreeMap

含义

底层采用红黑树[红黑树是一种平衡二叉树的实现]

体系结构

  • Map

    • SortedMap

      • TreeMap

注意点

因为底层采用红黑色,所以需要对key进行排序,有两个方式可以对key进行排序,分别如下:

  • key实现java.lang.Comparable接口
  • 在TreeMap构造器中传递一个比较器

案例一

 public class TreeMapDemo {
    
    //体系结构
        //Map
           //SortedMap
               //TreeMap
    public static void main(String[] args) {
        
        TreeMap data = new TreeMap();
        
        data.put("name","zhangsan");
        data.put("age",10);
        
        System.out.println(data.get("name"));
        
        System.out.println(data.size());
        System.out.println(data.isEmpty());
        System.out.println(data.containsKey("name"));
        System.out.println(data.containsValue("zhangsan"));
        
        //其他方法自行尝试
    }
}

案例二

public class TreeMapOtherDemo {
    
    //体系结构
        //Map
           //SortedMap
               //TreeMap
                  
    //注意点
        //放入的key要具体比较性
    
    //有序
        //放入进入的和拿出的顺序是一样
        //放入进入的会按照一定的规则排好序
    
    //方案
        //将key实现Comporable接口
        //在构造器传递一个比较器
    
    public static void main(String[] args) {
        
        /*
        TreeMap data = new TreeMap();
        data.put("aa", "aa");
        data.put("ee", "ee");
        data.put("cc", "cc");
        
        System.out.println(data);
        */
        
        
        TreeMap data = new TreeMap();
        
        User user1 = new User("zs", 10);
        User user2 = new User("ls", 20);
        
        data.put(user1, "zhangsan");
        data.put(user2, "lisi");
        
        System.out.println(data);
        
        
        
        TreeMap studentData = new TreeMap(new MyComparator());
        
        Student student1 = new Student("zs",10);
        Student student2 = new Student("ls",20);
        studentData.put(student1, "zs");
        studentData.put(student2, "ls");
        
        System.out.println(studentData);
        
         
    }
}



class User implements Comparable<User>{
    
    public int num;
    public String name;
    
    public User(String name,int num){
        this.name = name;
        this.num = num;
    }

    @Override
    public String toString() {
        return "User [num=" + num + ", name=" + name + "]";
    }

    //0代表
    @Override
    public int compareTo(User o) {
        return this.num == o.num ? 0 :(this.num < o.num ? 1:-1);
    }
}

class MyComparator implements Comparator{

    @Override
    public int compare(Object o1, Object o2) {
        Student stu1 = (Student) o1;
        Student stu2 = (Student) o2;
        return stu1.num==stu2.num?0:(stu1.num>stu2.num?-1:1);
    }
}

class Student{
    
    public int num;
    public String name;
    
    public Student(String name,int num){
        this.name = name;
        this.num = num;
    }

    @Override
    public String toString() {
        return "Student [num=" + num + ", name=" + name + "]";
    }
}

还有几个比较常见的属性,老师没讲

Map 自带的forEach方法

hashMap.forEach((k,v)->{
    System.out.println("Key:" + k + "    Value:" + v);
});

hashMap.compute()

compute() 方法对 hashMap 中指定 key 的值进行重新计算。

compute() 方法的语法为:

hashmap.compute(K key, BiFunction remappingFunction)
返回值如果 key 对应的 value 不存在,则返回该 null,如果存在,则返回通过 remappingFunction 重新计算后的值。实例以下实例演示了 compute() 方法的使用:实例import java.util.HashMap;class Main {    public static void main(String[] args) {        //创建一个 HashMap        HashMap<String, Integer> prices = new HashMap<>();        // 往HashMap中添加映射项        prices.put("Shoes", 200);        prices.put("Bag", 300);        prices.put("Pant", 150);        System.out.println("HashMap: " + prices);        // 重新计算鞋子打了10%折扣后的值        int newPrice = prices.compute("Shoes", (key, value) -> value - value * 10/100);        System.out.println("Discounted Price of Shoes: " + newPrice);        // 输出更新后的HashMap        System.out.println("Updated HashMap: " + prices);    }}
最后修改:2021 年 09 月 16 日 05 : 54 PM