Set接口与HashSet、HashCode 、LinkedHashSet

Set 具有与 Collection 完全一样的接口,只是行为上不同,Set 不保存重复的元素,而且Set接口中元素无序。

package MONA.demo04_set;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class Demo01 {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("aaa");
        list.add("bbb");
        list.add("ccc");

        System.out.println("list = " + list);

        //排序无序
        //不能存储重复元素
        Set set = new HashSet();
        set.add("bbb");
        set.add("aaa");
        set.add("ccc");
        System.out.println("set = " + set);
    }
}
HashSet存储自定义对象
package MONA.demo04_set;

import java.util.HashSet;

public class Demo02 {
    public static void main(String[] args) {
//        HashSet hashSet = new HashSet();
//        //String
//        hashSet.add("aaa");
//        hashSet.add("bbb");
//        hashSet.add("ccc");
//        hashSet.add("ccc");

        //Set集合不存储重复元素
        HashSet<Student> hashSet = new HashSet<>();
        hashSet.add(new Student("李四",19));
        hashSet.add(new Student("王五",20));
        hashSet.add(new Student("赵六",21));
        hashSet.add(new Student("赵六",21));

        System.out.println(hashSet);

        //HashSet集合在存储元素时,会调用hashCode和equals方法
        //只有hashCode返回相同时,我们才会调用equals
        //为什么调用方法?
        //Student是我们自己定义的类型(对象),匹配相等的规则是由我们来编写的

//        String name1 = "李四";
//        String name2 = "李四";
//        System.out.println(name1.hashCode());
//        System.out.println(name2.hashCode());

    }
}
class Student{
    String name;
    int age;

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

    //计算内存的值
    //返回该对象内存地址的值
    @Override
    public int hashCode() {
        System.out.println("hashCode 被调用了");
        //姓名地址的值加上年龄
        return this.name.hashCode() + age;
    }

    @Override
    public boolean equals(Object obj) {
        System.out.println("equals 被调用了");

        Student s = (Student) obj;
        if(this.name.equals(s.name) && this.age == age){
            return true;
        }
        return true;
    }

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

HashCode 的使用

package MONA.demo04_set;

import java.util.HashSet;
import java.util.Objects;

/**
 * HashSet 不存储重复元素
 *  依靠
 *      hashCode equals来判断元素是否重复
 */
public class Demo03 {
    public static void main(String[] args) {
        HashSet<Teacher> hashSet = new HashSet<>();
        hashSet.add(new Teacher("老王",29));
        hashSet.add(new Teacher("老李",35));
        hashSet.add(new Teacher("老李1",35));
        hashSet.add(new Teacher("老李1",36));
        System.out.println(hashSet);
    }
}
class Teacher{
    String name;
    int age;

    public Teacher(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;
    }

    //重写HasCode 和 equals方法
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Teacher teacher = (Teacher) o;
        return age == teacher.age &&
                Objects.equals(name, teacher.name);
    }

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

    @Override
    public String toString() {
        return "Teacher{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
为什么java提供的类不需要重写hashcode和equals方法

因为所有的包装类都重写了hashCode 和 equals方法

package MONA.demo04_set;

import java.util.HashSet;

public class Demo04 {
    public static void main(String[] args) {
        HashSet hashSet = new HashSet();
        //String
//        hashSet.add("aaa");
//        hashSet.add("bbb");
//        hashSet.add("aaa");
        //为什么我们没有重写String的hashCode和equals方法
        //HashSet就可以自动判断重复?
        //String 因为Java在写String类时,已经帮我们重写了两个方法

        //int--->Integer
        hashSet.add(111);
        hashSet.add(222);
        hashSet.add(333);
        hashSet.add(111);

        //所有的包装类都重写了hashCode 和 equals方法

        System.out.println(hashSet);
    }
}
LinkedHashSet集合使用
package MONA.demo05_linkedhashset;

import java.util.LinkedHashSet;

public class Demo01 {
    public static void main(String[] args) {
        //存取顺序有序
        LinkedHashSet linkedHashSet = new LinkedHashSet();
        linkedHashSet.add("ddd");
        linkedHashSet.add("bbb");
        linkedHashSet.add("aaa");
        linkedHashSet.add("ccc");

        System.out.println(linkedHashSet);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值