标签:comm imp pre java pack this vat 创建 super
package com.yjf.esupplier.common.test; import java.util.HashSet; /** * @author shusheng * @description * @Email shusheng@yiji.com * @date 2018/12/14 14:11 */ public class HashSetDemo { /** * 需求:存储自定义对象,并保证元素的唯一性 * 要求:如果两个对象的成员变量值都相同,则为同一个元素。 * * 目前是不符合要求的:因为我们知道HashSet底层依赖的是hashCode()和equals() 方法 * 而这两个方法我们在学生类中没有重写,所以,默认使用的是Object类的。 * 这个时候,他们的哈希值是不一样的,根本就不会继续判断,执行了添加操作。 */ public static void main(String[] args) { //创建集合对象 HashSet<Student> hs = new HashSet<Student>(); Student s1 = new Student("林青霞", 27); Student s2 = new Student("王祖贤", 21); Student s3 = new Student("柳岩", 23); Student s4 = new Student("林青霞", 27); Student s5 = new Student("范冰冰", 32); Student s6 = new Student("林青霞", 27); //添加元素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()); } } } class Student { private String name; private int age; 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; } /** * 如果对象的哈希值相同了,就会走equals()方法进行比较对象的成员变量是否相同 * 如果不同,就添加到集合,如果相同,就不添加 * 哈希表:是一个元素为链表的数组,综合了数组和链表的好处。如何优化代码: * 让对象的哈希值尽可能的不同。哈希值和哪些内容相关呢? * 和对象的成员变量值相关。 * 所以,我们的最终解决方法就是把对象的成员变量值进行相加: 如果是基本类型,就直接加值。 * 如果是引用类型,就加哈希值。 */ @Override public int hashCode() { return this.name.hashCode() + this.age * 113; } @Override public boolean equals(Object 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; } }
标签:comm imp pre java pack this vat 创建 super
原文地址:https://www.cnblogs.com/zuixinxian/p/10340897.html