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,再将该类注解为 ...
随机推荐
- XCTF EasyRE
一.查壳 无壳,并且发现是vc++编译的 二.拖入ida,来静态分析,这题让我深刻感觉到汇编的nb. 这段算是灵性的一段了,单从静态语句来看,发现分析不出啥,只能靠猜一下,我当时猜的是将输入的字符串又 ...
- ADO.NET整理 [转]
虽然我们都知道ADO.NET是对数据库的操作,但是要真的说出ADO.NET的具体含义还不是很容易. ADO.NET是ActiveX Data Objects的缩写,它是一个COM组件库,用于在micr ...
- Django基础-04篇 Django开发前后端联动
1. 写views views.py代码块 1.在前端以/article/{{ article.id }}这种方式请求后台, 参数配置在urls.py中path('category/<int:i ...
- DEV C++5.11编译没有结果提示
点击"视图"菜单--选择"浮动报告 窗口"
- c语言:输出汉字编码
#include<stdio.h> main() { //char a[5]; //strcpy(a,"啊"); char a[5]="职"; pr ...
- 高校表白App-团队冲刺第十天
今天要做什么 做一个类似于淘宝的小云播报 做了什么 没有完全实现,轮转实现,功能没有 遇到的问题 遇到的问题好多啊,感觉写一天都写不完,我还是好好学习一下再重新写吧
- Spring总结之SpringMvc下
五.拦截器 SpringMVC中的拦截器是通过HandlerInterceptor来实现的,定义一个Interceptor有两种方式 1.实现HandlerInterceptor接口或者继承实现了Ha ...
- Redis主从复制那点事
我们在 Redis持久化机制你学会了吗?学习了AOF和RDB,如果Redis宕机,他们分别通过回放日志和重新读入RDB文件的方式恢复数据,从而提高可靠性.我们今天来想这么一个问题,假如我们 ...
- [HAOI2012]外星人 题解
人类智慧题. 首先,只有 \(\varphi(1)=\varphi(2)=1\).再考虑题目中给的提示: \[\varphi\left(\prod_{i = 1}^m p_i^{q_i}\right) ...
- 第十篇 -- 下拉列表框QComboBox
效果图: ui_ComboBox.py # -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'ui ...