2020-08-29 HashMap中关于重写equals方法和hashCode方法

以下代码分为三部分内容:

①不适用自定义键遍历

②使用自定义键的遍历,但不从写hashCode()和equals()方法

③使用自定义键的遍历+重写hashcode方法和equals方法

package map;

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

public class Demo {
    public static void main(String[] args) {
        HashMap<String,Student> map=new HashMap<>();
        map.put("一",new Student("陈碧忠",18));
        map.put("一",new Student("陈碧忠",18));
        map.put("二",new Student("张学友",18));
        map.put("三",new Student("张国荣",18));

        //不适用自定义键遍历
        System.out.println("不使用自定义键遍历");
        for (String key:map.keySet()
             ) {
            System.out.println(key+" "+map.get(key).getName()+" "+map.get(key).getAge());
        }
        /**        遍历结果:
         *          一 陈碧忠 18
         *          三 张国荣 18
         *          二 张学友 18
         *
         *          结论:
         *              ①hashMap是无序的
         *              ②在不使用自定义类做对象的时候,如果存入相同键值的数据,则会覆盖原来的键
         *
         * */
        System.out.println("使用自定义键的遍历,但不从写hashCode()和equals()方法");
        HashMap<Student,String> map1=new HashMap<>();
        map1.put(new Student("陈碧忠",18),"一");
        map1.put(new Student("张学友",18),"二");
        map1.put(new Student("陈碧忠",18),"三");
        map1.put(new Student("张学友",18),"4");
        map1.put(new Student("王大拿",18),"一");
        for (Student key1:map1.keySet()
             ) {
            System.out.println(key1.getAge()+" "+key1.getName()+" "+map1.get(key1));
        }
        /**
         *
         *      不使用自定义键遍历结果;
         *           一 陈碧忠 18
         *           三 张国荣 18
         *           二 张学友 18
         *      使用自定义键的遍历结果:
         *          18 张学友二
         *          18 王大拿一
         *          18 张学友4
         *          18 陈碧忠一
         *          18 陈碧忠三
         *      结论:
         *          如果使用自定义键但是不重写equals方法和hashCode方法,存入相同的的键,就会保存下来。
         *
         * */

        //重写equals方法和hashcode方法
        HashMap<Student02, String> map2=new HashMap<>();
        map2.put(new Student02("陈碧忠",18),"一");
        map2.put(new Student02("张学友",18),"二");
        map2.put(new Student02("陈碧忠",18),"三");
        map2.put(new Student02("张学友",18),"4");
        map2.put(new Student02("王大拿",18),"一");
        System.out.println("使用自定义键的遍历+重写hashcode方法和equals方法");
        Set<Map.Entry<Student02, String>> set=map2.entrySet();
        Iterator<Map.Entry<Student02, String>> it=set.iterator();
        while(it.hasNext()){
            Map.Entry<Student02,String> student= it.next();
            System.out.println(student.getKey().getAge()+" "+student.getKey().getName()+" "+map2.get(student));
        }

/***
 *          不使用自定义键遍历
 *              一 陈碧忠 18
 *              三 张国荣 18
 *              二 张学友 18
 *          使用自定义键的遍历,但不从写hashCode()和equals()方法
 *              18 张学友 二
 *              18 王大拿 一
 *              18 张学友 4
 *              18 陈碧忠 一
 *              18 陈碧忠 三
 *          使用自定义键的遍历+重写hashcode方法和equals方法,但不从写hashCode()和equals()方法
 *              18 王大拿 null
 *              18 张学友 null
 *              18 陈碧忠 null
 *
 *             结论:
 *                  使用自定义键,再加上重写equals方法和hashCode方法,可以保证在存入相同的自定义键时,保证不重复(自动去重)
 *		    使用自定义键就必须重写方法
 *
 */

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值