Java中HashMap集合

HashMap


1.HashMap是Map里面的一个实现类

2.没有额外需要学习的特有方法,直接使用Map里面的方法就可以了

3.特点都是由键决定的:无序、不重复、无索引

4.HashMap跟HashSet底层原理是一模一样的,都是哈希表结构


小结

如下图:


案例

案例一->Map集合案例-存储学生对象并遍历:

题解:

package com.qiong.myhashmap;

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

public class Test1 {
    public static void main(String[] args) {
        /*
        需求:
            一个HashMap集合,键是学生对象(Student),值是籍贯(String)。
            存储三个键值对元素,并遍历创建
            要求:同姓名,同年龄认为是同一个学生

        核心点:
            HashMap的键位置如果存储的是自定义对象,需要重写hashCode和equals方法
         */

        //1.创建HashMap对象
        HashMap <Student,String> hs = new HashMap();

        //2.创建三个学生对象
        Student s1 = new Student("张三", 18);
        Student s2 = new Student("李四", 19);
        Student s3 = new Student("李四", 19);

        //3.添加元素
        hs.put(s1,"福建");
        hs.put(s2,"上海");
        hs.put(s3,"北京");

        //4.遍历集合
        //第一种方式
        Set<Student> keys = hs.keySet();
        for (Student key : keys) {
            String value = hs.get(key);
            System.out.println(key + "=" + value);

        }

        System.out.println("----------------------");
        //第二种方式
        Set<Map.Entry<Student, String>> entries = hs.entrySet();
        for (Map.Entry<Student, String> entry : entries) {
            Student key = entry.getKey();
            String value = entry.getValue();
            System.out.println(key + "=" + value);
        }

        System.out.println("----------------------");
        //第三种方式
        hs.forEach((key, value) -> System.out.println(key + "=" + value));
    }
}
package com.qiong.myhashmap;

import java.util.Objects;

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


    public Student() {
    }

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

    /**
     * 获取
     * @return name
     */
    public String getName() {
        return name;
    }

    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 获取
     * @return age
     */
    public int getAge() {
        return age;
    }

    /**
     * 设置
     * @param age
     */
    public void setAge(int age) {
        this.age = age;
    }

    public String toString() {
        return "Student{name = " + name + ", 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);
    }
}

案例二->Map集合案例-统计投票人数:

题解:

package com.qiong.myhashmap;

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

public class Test2 {
    public static void main(String[] args) {
        /*
        需求:
            某个班级80名学生,现在需要组成秋游活动,班长提供了四个景点依次是(A、B、C、D),每个学生只
            能选择一个景点,请统计出最终哪个景点想去的人数最多。
        */


        //1.需要先让同学们投票
        String[] arr = {"A", "B", "C", "D"};
        //利用随机数模拟80个同学投票,并把投票的结果存储
        ArrayList<String> list = new ArrayList<>();
        Random r = new Random();
        for (int i = 0; i < 80; i++) {
            int index = r.nextInt(arr.length);
            list.add(arr[index]);
        }

        //2.创建HashMap对象
        HashMap<String,Integer> hs = new HashMap();
        for (String name : list) {
            //判断当前景点在map集合当中是否存在
            if(hs.containsKey(name)){
                //存在
                //先获取该景点已经获取的票数
                Integer count = hs.get(name);
                //自增一次
                count++;
                //把新的次数再次添加到新的集合中
                hs.put(name,count);

            }else {
                //不存在
                hs.put(name,1);
            }
        }

        //3.求最大值
        int max = 0;
        hs.forEach(new BiConsumer<String, Integer>() {
            @Override
            public void accept(String s, Integer integer) {

            }
        });

        //4.判断哪个景点次数跟最大值一样,如果一样,打印出来
        Set<Map.Entry<String, Integer>> entries = hs.entrySet();
        for (Map.Entry<String, Integer> entry : entries) {
            int count = entry.getValue();
            if(max < count){
                max = count;
            }
        }

        for (Map.Entry<String, Integer> entry : entries) {
            int count = entry.getValue();
            if(max == count){
                System.out.println(entry.getKey() + "=" + count);;
            }
        }

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值