Java基础巩固系列 Set的主要实现类HashSet

代码示例:

Person类

public class Person {
    private String name;
    private Integer age;

    public Person() {
    }

    public Person(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

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


    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return Objects.equals(name, person.name) &&
                Objects.equals(age, person.age);
    }

//    private static int init = 1000; //不能这样用
    @Override
    public int hashCode() { //return age.hashCode() + name.hashCode;没下述的健壮性好。
        return Objects.hash(name, age); //能保证两个的哈希值的不同
//        return 1; //不能这样用
//        return init++;  //不能这样用
    }
}

Test类:

/**
 * Collection接口
 *    |-------List接口
 *         |--------ArrayList(主要的实现类)
 *         |--------LinkedList(对于频繁的插入、删除操作)
 *         |--------Vector(古老的实现类、线程安全的,但效率低于ArrayList)
 *    |-------Set接口:存储无序、不可重复的元素.Set中常用的方法都是Collection下定义的。
 *         |--------HashSet(主要的实现类)
 *         |--------LinkedHashSet
 *         |--------TreeSet
 *
 */
public class TestSet {
/*
*   Set:存储的元素是无序的,不可重复的!
*   1.无序性:无序性 != 随机性。真正的无序性,指的是元素在底层存储的位置是无序的。
*   2.不可重复性:当向Set中添加进相同的元素的时候,后面的这个不能添加进去.
*
*   说明:要求添加进Set中的元素所在的类,一定要重写equals()和hashCode()方法。进而保证Set元素的不可重复性!
*
*   Set中的元素是如何存储的呢?使用哈希算法。
*   当向Set中添加对象时,首先调用此对象所在类的hashCode()方法,计算此对象的哈希值,此哈希值
*   决定了此对象在Set中的存储位置。若此位置之前没有对象存储,则这个对象直接存储到此位置。若此位置
*   已经有对象存储,再通过equals()方法比较这两个对象是否相同。如果相同,后一个对象就不能再添加进来。
*   万一返回false呢,都存储。(不建议如此)
*   >要求:hashCode()方法要与equals()方法一致。
*
* */

    @Test
    public void test1(){
        Set set = new HashSet();
        set.add(123);
        set.add(456);
        set.add("AA");
        set.add("AA");
        set.add("BB");
        set.add(null);
        Person p1 = new Person("GG",23);
//        Person p2 = new Person("GG",23);
        Person p2 = new Person(null,23);
        System.out.println(p1.equals(p2));
        System.out.println(p1.hashCode());
        System.out.println(p2.hashCode());
        set.add(p1);
        set.add(p2);
        System.out.println(set.size());
        System.out.println(set); //无序 != 随机
    }
}

结果:

false
71416
77366
7
[AA, BB, null, Person{name='MM', age=21}, 456, Person{name='GG', age=23}, 123]

猜你喜欢

转载自blog.csdn.net/Peter__Li/article/details/88977241