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,再将该类注解为 ...
随机推荐
- Luogu P4553 80人环游世界
link 题目大意 自东向西有 \(n\) 个国家.有 \(m\) 个人,他们可以选择 \(n\) 个国家中任意一个开始,任意一个结束,但路线必须自东向西,且第 \(i\) 个国家必须恰好经过 \(v ...
- 『与善仁』Appium基础 — 1、Android系统的测试环境搭建
目录 1.Android操作系统简介 (1)Android系统诞生 (2)Android系统的结构 (3)Android测试环境搭建整体思路 2.Java环境安装 (1)JDK8下载 (2)安装JDK ...
- Java 8 Function 函数接口
这篇文章属于 Java 8 教程(LTS)系列教程 在 Java 8 中,Function 接口是一个函数接口,它位于包 java.util.function 下. Function 接口中定义了一个 ...
- Docker的学习体验
由于兴致使然,便想学习一点Docker技术.于是,写了这篇学习Docker的体会.笔拙,见谅. 第一件事--把网线插上 相信很多人都被官网的<Sample application>的 do ...
- 队列Queue:任务间的消息读写,安排起来~
摘要:本文通过分析鸿蒙轻内核队列模块的源码,掌握队列使用上的差异. 本文分享自华为云社区<鸿蒙轻内核M核源码分析系列十三 消息队列Queue>,作者:zhushy . 队列(Queue)是 ...
- 上手Coc.nvim 完全指南
上手Coc.nvim 完全指南 介绍 Coc.nvim 是一个基于NodeJS 的适用于Vim8, Neovim 的Vim 智能补全插件. 拥有完整的LSP 支持.配置.使用方式及插件系统的整体风格类 ...
- 【动态规划DP】[USACO16OPEN]248
题目描述 Bessie likes downloading games to play on her cell phone, even though she doesfind the small to ...
- 关于hashcode和equals方法说明
一.前言 我们都知道,要比较两个对象是否相等时需要调用对象的equals()方法,即判断对象引用所指向的对象地址是否相等,对象地址相等时,那么与对象相关的对象句柄.对象头.对象实例数据.对象类型数据等 ...
- BOM(Bill of Material)物料清单基础知识(一)
一.BOM的基础概念 概 ...
- (python函数02)列表生成式
(python函数02)列表生成式 示例代码 num = [i for i in range(1, 10)] print(num) num = [i for i in range(1, 10) ...