集合框架(HashSet保证元素唯一性的代码体现及图解)

核心代码:

package com.wayboo;

import java.util.HashSet;

/*
 * 需求:存储自定义对象,并保证元素的唯一性
 * 要求:如果两个对象的成员变量值都相同,则为同一个元素。
 * 
 * 目前是不符合我的要求的:因为我们知道HashSet底层依赖的是hashCode()和equals()方法。
 * 而这两个方法我们在学生类中没有重写,所以,默认使用的是Object类。
 * 这个时候,他们的哈希值是不会一样的,根本就不会继续判断,执行了添加操作。
 */
public class HashSetDemo2 {
public static void main(String[] args) {
    // 创建集合对象
    HashSet hs = new HashSet();

    // 创建学生对象
    Student s1 = new Student("林青霞", 27);
    Student s2 = new Student("柳岩", 22);
    Student s3 = new Student("王祖贤", 30);
    Student s4 = new Student("林青霞", 27);
    Student s5 = new Student("林青霞", 20);
    Student s6 = new Student("范冰冰", 22);

    // 添加元素
    hs.add(s1);
    hs.add(s2);
    hs.add(s3);
    hs.add(s4);
    hs.add(s5);
    hs.add(s6);

    // 遍历集合
    for (Student s : hs) {
        System.out.println(s.getName() + "---" + s.getAge());
        }
    }
}

//

 package com.wayboo;

/**
 * @author Administrator
 * 
 */
public class Student {
private String name;
private int age;

public Student() {
    super();
}

public Student(String name, int age) {
    super();
    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;
}

@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + age;
    result = prime * result + ((name == null) ? 0 : name.hashCode());
    return result;
}

@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    Student other = (Student) obj;
    if (age != other.age)
        return false;
    if (name == null) {
        if (other.name != null)
            return false;
    } else if (!name.equals(other.name))
        return false;
    return true;
}

// @Override
// public int hashCode() {
// // return 0;
// // 因为成员变量值影响了哈希值,所以我们把成员变量值相加即可
// // return this.name.hashCode() + this.age;
// // 看下面
// // s1:name.hashCode()=40,age=30
// // s2:name.hashCode()=20,age=50
// // 尽可能的区分,我们可以把它们乘以一些整数
// return this.name.hashCode() + this.age * 15;
// }
//
// @Override
// public boolean equals(Object obj) {
// // System.out.println(this + "---" + obj);
// if (this == obj) {
// return true;
// }
//
// if (!(obj instanceof Student)) {
// return false;
// }
//
// Student s = (Student) obj;
// return this.name.equals(s.name) && this.age == s.age;
// }
//
// @Override
// public String toString() {
// return "Student [name=" + name + ", age=" + age + "]";
// }

}
集合框架(HashSet保证元素唯一性的代码体现及图解)_第1张图片
image.png

你可能感兴趣的:(集合框架(HashSet保证元素唯一性的代码体现及图解))