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方法,可以保证在存入相同的自定义键时,保证不重复(自动去重)
 *		    使用自定义键就必须重写方法
 *
 */

    }
}

你可能感兴趣的:(Java基础,java,hashmap)