运作原理:

首先判断hashCode是否相同,如果不同,直接判定为两个不同的对象。如果hashCode相同,再去比较equals是否一样,如果一样,则为同一个对象。如果不一样,则是两个不同对象。

那么直接上代码:

Book.java

package SetNoDoubleFuction01;

public class Book {
private String name;
private Integer price;
private String press;
private String author; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Integer getPrice() {
return price;
} public void setPrice(Integer price) {
this.price = price;
} public String getPress() {
return press;
} public void setPress(String press) {
this.press = press;
} public String getAuthor() {
return author;
} public void setAuthor(String author) {
this.author = author;
} public Book() {
super();
} public Book(String name, Integer price, String press, String author) {
this.name = name;
this.price = price;
this.press = press;
this.author = author;
}
   //hashCode判断结果不同才会执行equals 
//所以hashCode和equals都会参与判断(而且hashCode会先行进行判断)
public int hashCode(){
return name.hashCode()+price.hashCode()+press.hashCode()+author.hashCode();
};
//equals不能省略(hashCode并不能起到完全判断)
public boolean equals(Object obj){
System.out.println("++++++++++++++++++++++++++++++++++++++");
//用来查看equals运行了几次
if (this == obj) return true; if (obj == null) return false; if(this.getClass() != obj.getClass()) return false; Book book=(Book) obj;
if (this.name.equals(book.name)&& this.price.equals(book.price))
return true; return false; }; @Override
public String toString() {
return "Book{" +
"name='" + name + '\'' +
", price=" + price +
", press='" + press + '\'' +
", author='" + author + '\'' +
'}'+ this.hashCode();
} }

Test01.java

package SetNoDoubleFuction01;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set; public class test01 { static Set<Book> set = new HashSet<>();
//随便加几条数据
static Book book1 =new Book("laogao", 2, "憨批", "学生01");
static Book book2= new Book("wangfei", 1, "2233", "学生02");
static Book book3= new Book("123", 3, "报刊", "学生03");
static Book book4= new Book("33", 5, "2333", "学生04");
static Book book5= new Book("老色批", 4, "2报", "学生05");
//加入重复数据用来测试
static Book book6= new Book("33", 5, "2333", "学生04");
static Book book7= new Book("33", 5, "2333", "学生04"); public static void main(String[] args) {
set.add(book1);
set.add(book2);
set.add(book3);
set.add(book4);
set.add(book5);
set.add(book6);
set.add(book7); System.out.println("已有数据!!2");
for (Book it:set) {
System.out.println(it.toString());
}
System.out.println("增加新内容?"); /* System.out.println(book4.equals(book7));*/
//控制台输入数据测试
Scanner sc = new Scanner(System.in);
Book book99=new Book();
System.out.println("请输入姓名:");
book99.setName(sc.next());
System.out.println("请输入编号:");
book99.setPrice(sc.nextInt());
System.out.println("请输入类型:");
book99.setPress(sc.next());
System.out.println("请输入作者:");
book99.setAuthor(sc.next()); set.add(book99);
for (Book it:set) {
System.out.println(it.toString());
} } }

结果(去重成功!!)

Set重写hashCode和equals方法实现引用对象去重的更多相关文章

  1. 重写hashcode和equals方法

    重写hashcode和equals方法 简乐君 2019-05-07 21:55:43 35481 收藏 191分类专栏: Java 文章标签: equals() hashcode()版权 一.前言我 ...

  2. 为什么要重写hashcode和equals方法?初级程序员在面试中很少能说清楚。

    我在面试 Java初级开发的时候,经常会问:你有没有重写过hashcode方法?不少候选人直接说没写过.我就想,或许真的没写过,于是就再通过一个问题确认:你在用HashMap的时候,键(Key)部分, ...

  3. (转)为什么要重写 hashcode 和 equals 方法?

    作者丨hsm_computer cnblogs.com/JavaArchitect/p/10474448.html 我在面试Java初级开发的时候,经常会问:你有没有重写过hashcode方法?不少候 ...

  4. HashMap中使用自定义类作为Key时,为何要重写HashCode和Equals方法

    之前一直不是很理解为什么要重写HashCode和Equals方法,才只能作为键值存储在HashMap中.通过下文,可以一探究竟. 首先,如果我们直接用以下的Person类作为键,存入HashMap中, ...

  5. 为什么要重写hashcode和equals方法

    我在面试 Java初级开发的时候,经常会问:你有没有重写过hashcode方法?不少候选人直接说没写过.我就想,或许真的没写过,于是就再通过一个问题确认:你在用HashMap的时候,键(Key)部分, ...

  6. 【转】 如何重写hashCode()和equals()方法

    转自:http://blog.csdn.net/neosmith/article/details/17068365 hashCode()和equals()方法可以说是Java完全面向对象的一大特色.它 ...

  7. 如何重写hashCode()和equals()方法

    hashCode()和equals()方法可以说是Java完全面向对象的一大特色.它为我们的编程提供便利的同时也带来了很多危险.这篇文章我们就讨论一下如何正解理解和使用这2个方法. 如何重写equal ...

  8. 【java编程】重写HashCode和equals方法

    [一]重写equals方案的规则 equals方法本来的原则 1.类的每个实例本质上都是唯一的. 2.不关心类是否提供了“逻辑相等”的测试功能 3.超类已经覆盖了equals,从超类继承过来的行为对于 ...

  9. Hibernate中用到联合主键的使用方法,为何要序列化,为何要重写hashcode 和 equals 方法

    联合主键用Hibernate注解映射方式主要有三种: 第一.将联合主键的字段单独放在一个类中,该类需要实现java.io.Serializable接口并重写equals和hascode,再将该类注解为 ...

随机推荐

  1. WPF教程五:附加依赖项属性

    附加依赖项属性是一个属性本来不属于对象自己,但是某些特定场景其他的对象要使用该对象在这种场景下的值.这个值只在这个场景下使用.基于这个需求设计出来的属性.这里主要涉及到一个解耦问题.最大的优势是在特定 ...

  2. python使用笔记13--清理日志小练习

    1 ''' 2 写一个删除日志的程序,删除5天前或为空的日志,不包括当天的 3 1.删除5天前的日志文件 4 2.删除为空的日志文件 5 ''' 6 import os 7 import time 8 ...

  3. Pandas高级教程之:自定义选项

    目录 简介 常用选项 get/set 选项 经常使用的选项 最大展示行数 超出数据展示 最大列的宽度 显示精度 零转换的门槛 列头的对齐方向 简介 pandas有一个option系统可以控制panda ...

  4. python + Excel数据读取(更新)

    data.xlsx 数据如下: import xlrd#1.读取Excel数据# table = xlrd.open_workbook("data.xlsx","r&qu ...

  5. elastic query match_all 数据目标超过10000条出错 Result window is too large

    起因 elastic做文本索引,match_all目标索引超过10000条时,出错 { "error": { "root_cause": [ { "t ...

  6. Error: Could not find or load main class ***

    jni 本地方法的总结 1,第一步,javah D:\wksp_study\designbook\target\classes> //clas文件所在目录执行 javah -cp D:\wksp ...

  7. vue keep-alive的实现原理和缓存策略

    使用 <!-- 基本 --> <keep-alive> <component :is="view"></component> < ...

  8. 卷积的等变性(equivariant) / 不变性(invariant)

    不变性:输入x发生变换,但是F之后的输出不变 \(F(x)=F [\)transform\((x)]\) 池化:近似不变性,当图像发生微小变化,最大池化的输出不变,还是一个池化范围内的max 等变性: ...

  9. 随处可编辑的编辑器之神VIM

    据说这世界上只有三种编辑器:Vim,Emacs 和 其他编辑器,其中 Vim 被称作编辑器之神,Emacs 被称作神的编辑器,当然,其他编辑器永远只能是其他编辑器. 拿一位 网友的话 来说,VIM 的 ...

  10. 抽奖动画 - lao虎机抽奖

    本文介绍一个lao虎机抽奖动画的实现,lao虎机抽奖在各类商家营销活动中非常常见,这里主要介绍动画的实现过程,其他细节不做详细分析. ps:lao虎机是敏感词,博客园不允许出现,所有老用拼音. 1. ...