equals()和hashCode()方法在集合类set中的使用
Object的方法 equals()和hashCode() 是用来判断两个对象是否相等。基础类型判断是否相等时,使用“==”来判断,按java的说话,“==”当用来判断是基础类型是判断内容的,而引用对象是判断内存地址的。一般情况我们之间继承Object的默认方法是可以的。但是,某些情况是要我们Override的。特别是在处理java集合时。按java的集合分类:List,Set,Map 其中List是有序的,可以有重复项的。如ArrayList。Set 是无序的并且不允许有重复项的。Map 是个键值对,也是对key有要求的。这边主要说Set因为他不允许重复项。
当我们使用自定义类型时,在add到Set时,就需要我们自己处理一下对象是否相等的情况。一般情况下,我们多是使用下面类似的代码

UserInfo i1=new UserInfo("zz",11);
UserInfo i2=new UserInfo("zz",11);
Set s=new HashSet();
s.add(i1);
s.add(i2);
//判断i1的内容是否和i2的相等
System.out.println( i1.equals(i2));
//i1的hashCode
System.out.println( i1.hashCode());
//i2的hashCode
System.out.println( i2.hashCode());
//S 集合的元素个数
System.out.println(s.size());
其中UserInfo 是我们自定义类型。具体定义如下

public class UserInfo {
private String userName;
private int userAge;
public UserInfo(String userName, int userAge) {
super();
this.userName = userName;
this.userAge = userAge;
}
@Override
public boolean equals(Object obj)
{
if(obj==this)
return true;
UserInfo userinfo=(UserInfo)obj;
if(userName.equals(userinfo.getUserName()) && userAge==userinfo.getUserAge())
return true;
return false;
}
@Override
public String toString() {
// TODO Auto-generated method stub
//return super.toString();
return "UserInfo UserName:"+getUserName()+"UserAge:"+getUserAge();
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public int getUserAge() {
return userAge;
}
public void setUserAge(int userAge) {
this.userAge = userAge;
}
}
请注意,UserInfo 我并没有Override hashCode这个函数,只是重写了equals。所以第一步的代码输出结果是
true //i1和i2的内容是相等
33263331 //i1的hashCode
6413875 //i2的hashCode
2 //s的元素个数
默认情况 是我们要同时重写 equals和hashCode的函数。要不就会出现上面的情况,按规定两个值的内容相等的对象应该就是同一个对象(这个话可能会有歧义)。也就是 hashCode相等 一定是同一个对象。但是反之缺不一定。
Set集合是按hashCode来判断对象是否相等的。所以,我们要重写 hashCode 如下:

@Override
public int hashCode()
{
final int offer=31; return userAge*userName.hashCode()*offer; }
其实好对人对java默认的hashCode 不是太明白为啥要那么复杂,其实就是按自己的一个规则生成一个int值就行。
当我们复写了hashCode以后,马上我们的输出结果就不一样了。
true
1331264
1331264
1
这样就达到了我们的目的了。内容相同就应该hashCode也一样。这样Set add的时候就只会插入一个,另一个会自动过滤掉。并不会出异常。这点需要注意一下。
equals()和hashCode()方法在集合类set中的使用的更多相关文章
- 转:Java中的equals和hashCode方法详解
转自:Java中的equals和hashCode方法详解 Java中的equals方法和hashCode方法是Object中的,所以每个对象都是有这两个方法的,有时候我们需要实现特定需求,可能要重写这 ...
- java中equals和hashCode方法随笔二
前几天看了篇关于java中equals和hashCode方法的解析 1.Object类中的equals方法和hashCode方法. Object类中的equals和hashCode方法简单明了,所有的 ...
- Java中的equals和hashCode方法
本文转载自:Java中的equals和hashCode方法详解 Java中的equals方法和hashCode方法是Object中的,所以每个对象都是有这两个方法的,有时候我们需要实现特定需求,可能要 ...
- Java中==、equals、hashcode的区别与重写equals以及hashcode方法实例(转)
Java中==.equals.hashcode的区别与重写equals以及hashcode方法实例 原文地址:http://www.cnblogs.com/luankun0214/p/4421770 ...
- 【转】Java中==、equals、hashcode的区别与重写equals以及hashcode方法实例
原文地址:http://www.cnblogs.com/luankun0214/p/4421770.html 感谢网友的分享,记录下来只为学习. 1.重写equals方法实例 部分代码参考http ...
- java集合(3)- Java中的equals和hashCode方法详解
参考:http://blog.csdn.net/jiangwei0910410003/article/details/22739953 Java中的equals方法和hashCode方法是Object ...
- Java中的equals和hashCode方法详解
Java中的equals和hashCode方法详解 转自 https://www.cnblogs.com/crazylqy/category/655181.html 参考:http://blog.c ...
- Java中==、equals、hashcode的区别与重写equals以及hashcode方法实例
1.重写equals方法实例 部分代码参考http://blog.csdn.net/wangloveall/article/details/7899948 重写equals方法的目的是判断两个对象 ...
- 探索equals()和hashCode()方法
探索equals()和hashCode()方法 在根类Object中,实现了equals()和hashCode()这两个方法,默认: equals()是对两个对象的地址值进行的比较(即比较引用是否相同 ...
随机推荐
- JavaScript空假值及其判断
一.javaScript五种空值和假值 分别为undefined,null,false,"",0,这五个值的共同点是在执行if语句时都会执行false分支,执行对应的非语句的时候都 ...
- 加载动画插件spin.js的使用随笔
背景: 在请求后台的“漫长”等待过程中,为了提升用户体验,需要一个类似 的加载动画效果,让用户明确现在处于请求过程中,而不是机子down掉或者网站死了 静态demo(未与后台交互): HTML代码如 ...
- ABAP function group和Tomcat library重复加载问题
ABAP ABAP help文档里对**LOAD-OF-PROGRAM"的关键字是这样描述的: This event keyword defines the program construc ...
- async/await的使用以及注意事项
使用 async / await, 搭配 promise, 可以通过编写形似同步的代码来处理异步流程, 提高代码的简洁性和可读性. 本文介绍 async / await 的基本用法和一些注意事项. a ...
- SC || Chapter 8
栈:方法调用和局部变量的存储位置,保存基本类型 堆:在一块内存里分为多个小块,每块包含 一个对象,或者未被占用
- Luogu [P3367] 模板 并查集
[模板]并查集 题目详见:[[P3367][模板]并查集] (https://www.luogu.org/problemnew/show/P3367) 这是一道裸的并查集题目(要不然叫模板呢) 废话不 ...
- Bootstrap历练实例:模态框(Modal)插件
模态框(Modal)是覆盖在父窗体上的子窗体.通常,其目的是显示来自一个单独源的内容,可以在不离开父窗体的情况下进行一些交互,子窗体提供一些交互或信息. <!DOCTYPE html>&l ...
- atomic nonatomic区别
摘要 atomic和nonatomic区别用来决定编译器生成的getter和setter是否为原子操作.atomic提供多线程安全,是描述该变量是否支持多线程的同步访问,如果选择了atomic 那么就 ...
- 状态压缩dp 状压dp 详解
说到状压dp,一般和二进制少不了关系(还常和博弈论结合起来考,这个坑我挖了还没填qwq),二进制是个好东西啊,所以二进制的各种运算是前置知识,不了解的话走下面链接进百度百科 https://baike ...
- Ubuntux下简单设置vim
我自己在vim下的设置,基本写简单脚本用的,在~/.vimrc作出如下设置 syntax on "高亮 set nu "行号显示 set smartindent "基于a ...