哈希值、HashSet、LinkedHashSet

一.哈希值

  1. 哈希值其实就是一个int数字,我们可以把哈希值看成对象的一个标识,Object中的hashCode方法,可以获取到对象的哈希值

  2. Object中的hashCode方法是根据地址值进行计算的

  3. 不过一般哈希值不是根据地址值计算,而是根据对象的属性进行计算,这就需要在Object的子类中重写hashCode方法(idea中一般都用alt+insert快捷键重写,部分电脑用alt+fn+insert快捷键重)

二.HashSet存储自定义对象

  1.存储条件: HashSet存储自定义对象,保证元素的唯一性

  2.满足存储条件分析:

    2.1: 线比较两个对象哈希值(子类中需要重写Object中的hashCode()方法)

    2.2:   如果两个对象哈希值相同,调用equals方法进行比较(子类中需要重写Object中的equals()方法)

  代码演示:

    子类代码也没什么可以演示的,子类中重写的hashCode方法和equals()方法都是快捷键生  成的,若想研究方法内部可在idea中生成方法研究

  HashSet集合存储对象演示:

  

       //创建一个HashSet,用来保存Dog对象
        Set<Dog> set = new HashSet<>();
        set.add(new Dog("哮天犬", 18));
        set.add(new Dog("旺财", 8));
        set.add(new Dog("王可可", 3));
        //添加一个集合中相同的对象,添加不会成功,子类中重写了hashSet方法和equal方法
        set.add(new Dog("旺财", 8));


        //遍历set集合,并打印每一个狗对象
        for(Dog dog : set) {
            System.out.println(dog);    
         }

 三.LinkedHashSet是Set接口的一个实现类

  1. LinkedHash没有延续Set接口的无序特点,它是一个有序的Set集合

  2.  这个类内部出了一个哈希表,还有一个链表,

       链表的作用就是保证LinkedHashSet集合石有序的

  3. Set是无序的,LinkedHashSet就是一个不孝子,没有延续Set接口无序特点(实际上是青出于蓝,   子类更加强大的表现)

  代码演示LinkedHashSet集合是有序的:

    

         Set<String> set = new LinkedHashSet<>();
        //添加元素
        set.add("张三丰");
        set.add("张翠山");
        set.add("莫声谷");
        set.add("张无忌");
        set.add("宋远桥");

        //打印set集合
        System.out.println(set); //[张三丰, 张翠山, 莫声谷, 张无忌, 宋远桥]  ,证实该集合是有序的

 

  

    

    

  

猜你喜欢

转载自www.cnblogs.com/xiangshaui/p/9561466.html