JAVA——双列集合(MAP接口及相关实现类)

1.双列集合的特点

①在java中,双列集合·一次存储一对数据(键、值),这一对数据称为键值对或键值对对象、也可以称为Entry对象;

键不可以重复,值可以重复

键和值是一一对应的,每个键都可以唯一的找到其所对应的值;

2.MAP

MAP是一个接口,故需使用其他类来实现此接口;常用类有HasMap,LinkedHasMap,TreeMap,Hashtable,Properties;

①MAP总常见的API

V put(k key,v value):常用来添加元素;

当我们添加的键值重复时,后面添加的会覆盖前面添加的值(返回值是被覆盖的值);

V remove(Object key):根据建删除键值对元素;

void clear():移除所有键值对元素;

boolean containsKey(Object key):判断集合中是否包含指定的键;

boolean containsValue(Object value):判断集合中是否包含指定的值;

boolean isEmpty():判断集合是否为空;

int size():求集合中键值对的个数;

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

public class TestMap {
    public static void main(String[] args) {
 Map map=new HashMap<>();//创建一个集合
        map.put("1","杨过");//添加键值对
        map.put("2","小龙女");
        map.put("3","郭靖");
        map.put("4","黄蓉");
        map.put("5","魏无羡");
        map.remove("5");//根据建删除对应的键值对
    }
}

②遍历方式

键找值,键值对,Lambda表达式;

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

public class TestMap {
    public static void main(String[] args) {
        Map map=new HashMap<>();
        map.put("1","杨过");
        map.put("2","小龙女");
        map.put("3","郭靖");
        map.put("4","黄蓉");
        map.put("5","魏无羡");
        Set keys = map.keySet();//将获取到的键存在SET集合中
        for(String key:keys){
            String values = map.get(key);//遍历集合,获取每个键对应的值
            System.out.println(key+"="+values);//输出打印
        }
       System.out.println("*******************************通过键值对进行遍历");
        Set> entries = map.entrySet();//获取集合中的每个键值对
        for (Map.Entry entry : entries) {
            String key=entry.getKey();//获取键
            String value=entry.getValue();//获取值
            System.out.println(key+"="+value);
        }
        System.out.println("*******************************foreach");
        map.forEach(new BiConsumer() {
            @Override
            public void accept(String key, String value) {
                System.out.println(key+"="+value);
            }
        });
        System.out.println("*******************************Lambda表达式遍历");
        map.forEach((key,values)-> System.out.println(key+"="+values));
    }
}

3.案例分析

需求:某班级100名同学要出去团建,有“吃烧烤”,“轰趴馆”,“爬华山”,“大排档”,这几个选项,每人只能选一次,计算票数最多的;

分析:首先得有一个容器来存储这几个地方,其次还需要一个集合来存储学生的投票情况(可以使用随机数模拟学生投票情况),然后遍历集合获取地址看在HashMAP集合中是否存在若存在需现获取对应的键值,给其++,再将其键值对储存到集合中;若不存在,则需将键值设为1,再将键值对存到集合中;

具体代码如下:

public class testHasMap {
    public static void main(String[] args) {

       String []addias={"吃烧烤","轰趴馆","爬华山","大排档"};
        ArrayList list=new ArrayList<>();
        Random random=new Random();
        for (int i = 0; i < 100; i++) {
            int index=random.nextInt(addias.length);
            list.add(addias[index]);
        }
        Map map=new HashMap<>();
        for (String name : list) {
            if(map.containsKey(name)){
                int count = map.get(name);
                count++;
                map.put(name,count);
            }
            else{
                map.put(name,1);
            }
        }
        System.out.println(map);
        int max=0;
        Set> entries = map.entrySet();
        for (Map.Entry entry : entries) {
            int value = entry.getValue();
            if(value>max){max=value;}
        }
        System.out.println(max);
        for (Map.Entry entry : entries) {
            int value = entry.getValue();
            if(value==max){
                System.out.println(entry);
            }
        }

4.LinkedMap

①主要由键决定有序,不重复,无索引

存储时的顺序和取出时的顺序一致

③底层数据结构是哈希表,每个键值对元素含有一个双链表存储机制

因为其实现了MAP接口故大多使用方法都和HashMap相差不大;

5.TreeMap

TreeMap和TreeSet底层原理一样,都是红黑树结构

②由键决定特性不重复,无索引,可排序(对键进行排序,默认情况下升序);

也可通过实现Comparable接口来指定排序;

或创建集合时传递Comparator比较器对象来指定排序;

案例分析:

需求:键存学生对象;值存储籍贯;先按照年龄进行升序,年龄相同,在按照名字开头大写字母顺序进行排列,同名同龄视为同一人;

具体代码如下:

import java.util.Objects;

public class Student implements Comparable {//学生类
    private String name;
    private int age;

    public Student(String name, int age) {
        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 boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return age == student.age && Objects.equals(name, student.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }

    public String toString() {
        return "Student{name = " + name + ", age = " + age + "}";
    }

    @Override
    public int compareTo(Student o) {
        int i = this.getAge() - o.getAge();//先按照年龄进行升序
         i = i == 0 ? this.getName().compareTo(o.getName()) : i;
        return i;
    }
}

测试代码:

import java.security.Key;
import java.util.*;
import java.util.function.BiConsumer;

public class testHasMap {
    public static void main(String[] args) {
       
        Student s1=new Student("张三",21);
        Student s2=new Student("刘小三",23);
        Student s3=new Student("张三",21);
        Student s4=new Student("王五",21);
        Student s5=new Student("李四",22);
        TreeMap tm=new TreeMap<>();
        tm.put(s1,"陕西");
        tm.put(s2,"河北");
        tm.put(s3,"石家庄");
        tm.put(s4,"西安");
        tm.put(s5,"重庆");
       
        System.out.println(tm);
      
    }
}

你可能感兴趣的:(java,intellij-idea)