Set重写hashCode和equals方法实现引用对象去重
运作原理:
首先判断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方法实现引用对象去重的更多相关文章
- 重写hashcode和equals方法
重写hashcode和equals方法 简乐君 2019-05-07 21:55:43 35481 收藏 191分类专栏: Java 文章标签: equals() hashcode()版权 一.前言我 ...
- 为什么要重写hashcode和equals方法?初级程序员在面试中很少能说清楚。
我在面试 Java初级开发的时候,经常会问:你有没有重写过hashcode方法?不少候选人直接说没写过.我就想,或许真的没写过,于是就再通过一个问题确认:你在用HashMap的时候,键(Key)部分, ...
- (转)为什么要重写 hashcode 和 equals 方法?
作者丨hsm_computer cnblogs.com/JavaArchitect/p/10474448.html 我在面试Java初级开发的时候,经常会问:你有没有重写过hashcode方法?不少候 ...
- HashMap中使用自定义类作为Key时,为何要重写HashCode和Equals方法
之前一直不是很理解为什么要重写HashCode和Equals方法,才只能作为键值存储在HashMap中.通过下文,可以一探究竟. 首先,如果我们直接用以下的Person类作为键,存入HashMap中, ...
- 为什么要重写hashcode和equals方法
我在面试 Java初级开发的时候,经常会问:你有没有重写过hashcode方法?不少候选人直接说没写过.我就想,或许真的没写过,于是就再通过一个问题确认:你在用HashMap的时候,键(Key)部分, ...
- 【转】 如何重写hashCode()和equals()方法
转自:http://blog.csdn.net/neosmith/article/details/17068365 hashCode()和equals()方法可以说是Java完全面向对象的一大特色.它 ...
- 如何重写hashCode()和equals()方法
hashCode()和equals()方法可以说是Java完全面向对象的一大特色.它为我们的编程提供便利的同时也带来了很多危险.这篇文章我们就讨论一下如何正解理解和使用这2个方法. 如何重写equal ...
- 【java编程】重写HashCode和equals方法
[一]重写equals方案的规则 equals方法本来的原则 1.类的每个实例本质上都是唯一的. 2.不关心类是否提供了“逻辑相等”的测试功能 3.超类已经覆盖了equals,从超类继承过来的行为对于 ...
- Hibernate中用到联合主键的使用方法,为何要序列化,为何要重写hashcode 和 equals 方法
联合主键用Hibernate注解映射方式主要有三种: 第一.将联合主键的字段单独放在一个类中,该类需要实现java.io.Serializable接口并重写equals和hascode,再将该类注解为 ...
随机推荐
- Java实验项目四——多线程矩阵相乘算法的设计
Program:多线程矩阵相乘算法的设计 Description:利用多线程实现矩阵相乘,因为各个线程的运算互不影响, 所以不用使用锁,代码如下: thread.OperateMatrix类,实现矩阵 ...
- XCTF simple-unpacked
一.查壳 是UPX的壳,拖入IDA,发现很多函数无法反编译也无法查看 二.骚操作 将那个文件放入记事本,ctrl+F搜索flag. 找到了. 实际上,是需要专门的UPX脱壳工具或者手工来脱壳的,我目前 ...
- 刷算法,这些api不可不知!
大家好,我是老三,最近在刷算法,发现有些api记得不熟,所以整理了一波,如果你也在刷题,赶紧收藏吧! 集合 在刷题中,各种数据结构是我们常常用到的,例如栈实现迭代.哈希存储键值对等等,我们来看看常用集 ...
- vue(17)vue-route路由管理的安装与配置
介绍 Vue Router 是 Vue.js官方的路由管理器.它和 Vue.js 的核心深度集成,让构建单页面应用变得易如反掌.包含的功能有: 嵌套的路由/视图表 模块化的.基于组件的路由配置 路由参 ...
- 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 ...
- [WPF] 使用 Visual Studio App Center 持续监视应用使用情况和问题
1. 什么是AppCenter Visual Studio App Center 是几个常见移动开发和云集成服务(如持续集成.持续交付和自动 UI 测试等服务)的集合. 这些 App Center 服 ...
- 家庭账本开发day05
套用layUI模板,成功完成账单的添加,并且能同时对用户的余额进行增加和减少
- urllib库中的URL编码解码和GETPOST请求
在urllib库的使用过程中,会在请求发送之前按照发送请求的方式进行编码处理,来使得传递的参数更加的安全,也更加符合模拟浏览器发送请求的形式.这就需要用urllib中的parse模块.parse的使用 ...
- 11. Linux从入门到进阶
课程大纲 • Linux简介 • Linux基础 • Linux常用命令 • Shell编程&awk
- Python 机器学习实战 —— 无监督学习(上)
前言 在上篇<Python 机器学习实战 -- 监督学习>介绍了 支持向量机.k近邻.朴素贝叶斯分类 .决策树.决策树集成等多种模型,这篇文章将为大家介绍一下无监督学习的使用.无监督学习顾 ...