Java后端接参数实体和map的区别 java map是接口还是类_Java集合类

  • Map 接口属于抽象类
  • Map 下面有两个实现类,HashMap 和 TreeMap

一、Map 接口

1、概述

  • 将键映射到值的对象
  • 一个映射不能包含重复的键
  • 每个键最多只能映射到一个值

2、Map 集合和 Collection 集合的区别

  • Map集合存储元素是成对出现的,Map集合的键是唯一的,值是可重复的。可以把这个理解为:夫妻对
  • Collection集合存储元素是单独出现的,Collection的儿子Set是唯一的,List是可重复的。可以把这个理解为:光棍(11.11)
  • Map集合的数据结构值针对键有效,跟值无关
  • Collection集合的数据结构是针对元素有效
package map01;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class MapDemo {
    public static void main(String[] args) {
        Map<String, String> m = new HashMap<>();
        m.put("001", "刘德华");
        m.put("001", "张学友");
        m.put("002", "刘亦菲");
        m.put("003", "林志玲");
        m.put("004", "林志玲");
        m.put("001", "刘德华");//完全重复

        //增强for循环
        for (Map.Entry<String, String> en : m.entrySet()) {
            System.out.println("键名:" + en.getKey() + "----键值:" + en.getValue());
        }
        System.out.println("------------------------------");

        //通过 KeySet 循环
        Set<String> keys = m.keySet();
        for (String k : keys) {
            System.out.println("键名:" + k + "----键值:" + m.get(k));
        }
        System.out.println("+++++++++++++++++++++++++++++++");
        System.out.println(m.containsKey("005"));
        System.out.println(m.containsKey("002"));
        System.out.println(m.containsValue("刘德华"));
        System.out.println(m.containsValue("张学友"));
    }
}

运行显示:

Java后端接参数实体和map的区别 java map是接口还是类_Map 接口_02


3、Map 接口的成员方法

  • V put(K key,V value)
  • V remove(Object key)
  • void clear()
  • boolean containsKey(Object key)
  • boolean containsValue(Object value)
  • boolean isEmpty()
  • int size()
  • V get(Object key)
  • Set<K> keySet()
  • Collection<V> values()
  • Set<Map.Entry<K,V>> entrySet()

4、Map 集合遍历(根据键找值)

  • 获取所有键的集合
  • 遍历键的集合,获取到每一个键
  • 根据键找值

5、Map 集合遍历(根据键值对对象找键和值)

  • 获取所有键值对对象的集合
  • 遍历键值对对象的集合,获取到每一个键值对对象
  • 根据键值对对象找键和值

6、Map集合的特点

  • 可以存储键值对的元素

二、HashMap 实现类

1、概述

  • 键是哈希表结构,可以保证键的唯一性

2、HashMap 案例

  • HashMap<String,String>
  • HashMap<Integer,String>
  • HashMap<String,Student>
  • HashMap<Student,String>

3、案例

package map02;

public class Student {
    private String name;
    private int age;

    public Student() {
        super();
    }

    public Student(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + age;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Student other = (Student) obj;
        if (age != other.age)
            return false;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        return true;
    }
}
package map02;

import java.util.HashMap;
import java.util.Set;

public class HashMapDemo {
    public static void main(String[] args) {
        // 创建集合对象
        HashMap<Student, String> hm = new HashMap<Student, String>();

        // 创建学生对象
        Student s1 = new Student("貂蝉", 27);
        Student s2 = new Student("王昭君", 30);
        Student s3 = new Student("西施", 33);
        Student s4 = new Student("杨玉环", 35);
        Student s5 = new Student("貂蝉", 27);

        // 添加元素
        hm.put(s1, "8888");
        hm.put(s2, "6666");
        hm.put(s3, "5555");
        hm.put(s4, "7777");
        hm.put(s5, "9999");

        // 遍历
        Set<Student> set = hm.keySet();
        for (Student key : set) {
            String value = hm.get(key);
            System.out.println(key.getName() + "---" + key.getAge() + "---" + value);
        }
    }
}

三、LinkedHashMap 实现类

1、概述

  • Map 接口的哈希表和链接列表实现,具有可预知的迭代顺序
  • 由哈希表保证键的唯一性
  • 由链表保证键盘的有序(存储和取出的顺序一致)
package map03;

import java.util.LinkedHashMap;
import java.util.Set;

public class LinkedHashMapDemo {
    public static void main(String[] args) {
        LinkedHashMap<String, String> lh = new LinkedHashMap<>();
        lh.put("aaa", "java");
        lh.put("bbb", "python");
        lh.put("ccc", "PHP");
        lh.put("ddd", "CSS");
        lh.put("eee", "HTML");
        lh.put("fff", "javascript");
        lh.put("111", "android");
        lh.put("222", "android");
        lh.put("222", "android");
        //遍历
        Set<String> s = lh.keySet();
        for (String key : s) {
            String value = lh.get(key);
            System.out.println("键名:" + key + "---键值:" + value);
        }
    }
}

运行显示:

Java后端接参数实体和map的区别 java map是接口还是类_Java后端接参数实体和map的区别_03

四、TreeMap 实现类

1、概述

  • 键是红黑树结构,可以保证键的排序和唯一性
  • 由链表保证键盘的有序(存储和取出的顺序一致)
package map04;

import java.util.Set;
import java.util.TreeMap;

public class TreeMapDemo {
    public static void main(String[] args) {
        TreeMap<String, String> tm = new TreeMap<>();
        tm.put("aaa", "java");
        tm.put("bbb", "python");
        tm.put("ccc", "PHP");
        tm.put("ddd", "CSS");
        tm.put("eee", "HTML");
        tm.put("fff", "javascript");
        tm.put("111", "android");
        tm.put("222", "android");
        tm.put("222", "android");

        //遍历
        Set<String> s = tm.keySet();
        for (String key : s) {
            String value = tm.get(key);
            System.out.println("键名:" + key + "---键值:" + value);
        }
    }
}

运行结果显示:

Java后端接参数实体和map的区别 java map是接口还是类_TreeMap 实现类_04

2、TreeMap 案例

  • TreeMap<String,String>
  • TreeMap<Student,String>

3、案例

package map05;

public class Student {
    private String name;
    private int age;

    public Student() {
        super();
    }

    public Student(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
package map05;

import java.util.Comparator;
import java.util.Set;
import java.util.TreeMap;

public class TreeMapDemo {
    public static void main(String[] args) {
        TreeMap<Student, String> tm = new TreeMap<Student, String>(new Comparator<Student>() {
            @Override
            public int compare(Student s1, Student s2) {
                int num1 = s1.getAge() - s2.getAge();
                int num2 = num1 == 0 ? s1.getName().compareTo(s2.getName()) : num1;
                return num2;
            }
        });
        Student s1 = new Student("潘安", 18);
        Student s2 = new Student("姜子牙", 19);
        Student s3 = new Student("宋江", 22);
        Student s4 = new Student("李世民", 20);
        Student s5 = new Student("刘备", 21);
        Student s6 = new Student("刘亦菲", 22);

        tm.put(s1, "宋朝");
        tm.put(s2, "商朝");
        tm.put(s3, "宋朝");
        tm.put(s4, "唐朝");
        tm.put(s5, "三国");
        tm.put(s6, "现代");

        // 遍历
        Set<Student> set = tm.keySet();
        for (Student key : set) {
            String value = tm.get(key);
            System.out.println(key.getName() + "---" + key.getAge() + "---" + value);
        }
    }
}

五、Hashtable 实现类

1、Hashtable 和 HashMap 的区别

  • Hashtable:线程安全,效率低。不允许null键和null值
  • HashMap:线程不安全,效率高。允许null键和null值

2、List,Set,Map等接口是否都继承子Map接口

  • List,Set继承自Collection接口
  • Map接口本身就是一个顶层接口

3、案例

package map06;

import java.util.Hashtable;

public class HashtableDemo {
    public static void main(String[] args) {
        Hashtable<String, String> ht = new Hashtable<>();
        ht.put("0001", "Lemon");
        System.out.println(ht);
    }
}