运作原理:

首先判断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. Java实验项目四——多线程矩阵相乘算法的设计

    Program:多线程矩阵相乘算法的设计 Description:利用多线程实现矩阵相乘,因为各个线程的运算互不影响, 所以不用使用锁,代码如下: thread.OperateMatrix类,实现矩阵 ...

  2. XCTF simple-unpacked

    一.查壳 是UPX的壳,拖入IDA,发现很多函数无法反编译也无法查看 二.骚操作 将那个文件放入记事本,ctrl+F搜索flag. 找到了. 实际上,是需要专门的UPX脱壳工具或者手工来脱壳的,我目前 ...

  3. 刷算法,这些api不可不知!

    大家好,我是老三,最近在刷算法,发现有些api记得不熟,所以整理了一波,如果你也在刷题,赶紧收藏吧! 集合 在刷题中,各种数据结构是我们常常用到的,例如栈实现迭代.哈希存储键值对等等,我们来看看常用集 ...

  4. vue(17)vue-route路由管理的安装与配置

    介绍 Vue Router 是 Vue.js官方的路由管理器.它和 Vue.js 的核心深度集成,让构建单页面应用变得易如反掌.包含的功能有: 嵌套的路由/视图表 模块化的.基于组件的路由配置 路由参 ...

  5. python numpy 数据集合操作函数

    arrarray([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])arr1array([0, 1, 2, 3, 4])np.intersect1d(arr,arr1)#计算数组ARR A ...

  6. [WPF] 使用 Visual Studio App Center 持续监视应用使用情况和问题

    1. 什么是AppCenter Visual Studio App Center 是几个常见移动开发和云集成服务(如持续集成.持续交付和自动 UI 测试等服务)的集合. 这些 App Center 服 ...

  7. 家庭账本开发day05

    套用layUI模板,成功完成账单的添加,并且能同时对用户的余额进行增加和减少

  8. urllib库中的URL编码解码和GETPOST请求

    在urllib库的使用过程中,会在请求发送之前按照发送请求的方式进行编码处理,来使得传递的参数更加的安全,也更加符合模拟浏览器发送请求的形式.这就需要用urllib中的parse模块.parse的使用 ...

  9. 11. Linux从入门到进阶

    课程大纲 • Linux简介 • Linux基础 • Linux常用命令 • Shell编程&awk

  10. Python 机器学习实战 —— 无监督学习(上)

    前言 在上篇<Python 机器学习实战 -- 监督学习>介绍了 支持向量机.k近邻.朴素贝叶斯分类 .决策树.决策树集成等多种模型,这篇文章将为大家介绍一下无监督学习的使用.无监督学习顾 ...