==,hashcde, equals(一)
1、Hash 的属性,
1)bucket 和 list
2、java.lang.object 的 hashcode 和 equal 通过内存地址比较
3、为什么要重写hashcode 和 equals,
1) 实现hashset不可重复的特性(http://www.cnblogs.com/happyPawpaw/p/3744971.html)
2)Hashmap
4、Hashmap的键值如果是类
5、Hashmap的put 和 get 方法
https://blog.csdn.net/lan12334321234/article/details/70048493
(https://blog.csdn.net/VIP_WangSai/article/details/77505517)
6、先判断hashcode, 再判断equals
为什么要这种判断顺序呢,因为要实现的是hash的特性,bucket由hashcode 决定;
hashcode true, equal 不一定 true
equals true, hashcode 一定true
==,hashcde, equals
public class Student{
private int id;
private String name; public Student(int id, String name){
this.id = id;
this.name = name;
}
}
main
public static void main(String args[]) { Student student01 = new Student(1,"lee");
Student student02 = new Student(1,"lee"); System.out.print("student01 == student02 :");
if(student01 == student02){
System.out.println("true.");
}else{
System.out.println("false.");
} System.out.print("student01.hashCode() == student02.hashCode() :");
if(student01.hashCode() == student02.hashCode()){
System.out.println("true.");
}else{
System.out.println("false.");
} System.out.print("student01.equals(student02) :");
if(student01.equals(student02)){
System.out.println("true.");
}else{
System.out.println("false.");
} Set<Object> set = new HashSet<Object>();
set.add(student01);
set.add(student02);
System.out.println("HashSet 长度:" + set.size());
}
输出
默认,继承Object
student01 == student02 :false.
student01.hashCode() == student02.hashCode() :false.
student01.equals(student02) :false.
HashSet 长度:2
修改student 的 hashcode类如下
public class StudentModifyHashCode{ private int id;
private String name; public StudentModifyHashCode(int id, String name){
this.id = id;
this.name = name;
} @Override
public int hashCode(){
final int prime = 31;
int result = 1;
result = prime*result+this.id;
return result;
}
}
输出,可以看到这次hashcode 一样的
修改hashcode
student01 == student02 :false.
student01.hashCode() == student02.hashCode() :true.
student01.equals(student02) :false.
HashSet 长度:2
同时修改student的hashcode 和 equals 方法如下
public class StudentModifyEqualAndHash{ private int id;
private String name; public StudentModifyEqualAndHash(int id, String name){
this.id = id;
this.name = name;
} public int getId() {
return id;
} public String getName() {
return name;
} @Override
public int hashCode(){
final int prime = 31;
int result = 1;
result = prime*result+this.id;
return result;
} @Override
public boolean equals(Object obj){
if(this == obj)
return true;
if(obj == null)
return false;
if(getClass() != obj.getClass())
return false;
StudentModifyEqualAndHash other = (StudentModifyEqualAndHash)obj;
if(this.id != other.getId() ){
return false;
}
for(int i=0;i<this.name.length();i++){
if(this.name.charAt(i) != (((StudentModifyEqualAndHash)obj).getName().charAt(i))){
return false;
}
}
return true;
}
}
输出,可以看到hashcode 和 equals 都一样
修改hashcode和equals
student01 == student02 :false.
student01.hashCode() == student02.hashCode() :true.
student01.equals(student02) :true.
HashSet 长度:1
https://blog.csdn.net/lixiaoxiong55/article/details/93376852
hashCode作用: https://blog.csdn.net/qq_38977097/article/details/80834525
==,hashcde, equals(一)的更多相关文章
- equals变量在前面或者在后面有什么区别吗?这是一个坑点
我就不废话那么多,直接上代码: package sf.com.mainTest; public class Test { public static void main(String[] args) ...
- How to implement equals() and hashCode() methods in Java[reproduced]
Part I:equals() (javadoc) must define an equivalence relation (it must be reflexive, symmetric, and ...
- 【特种兵系列】String中的==和equals()
1. 小样示例 public static void main(String[] args) { String a = "a" + "b" + 123; Str ...
- (转)浅谈Java中的equals和==
原文地址: http://www.cnblogs.com/dolphin0520/p/3592500.html 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new S ...
- 浅谈Java中的equals和==(转)
浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hello"); 2 String str ...
- List<T>Find方法,FindAll方法,Contains方法,Equals方法
假如传入的T是一个类, List<MessageInfos> MessageInfos = new List<MessageInfos>(); MessageInfos= Me ...
- 让代码重构渐行渐远系列(3)——string.Equals取代直接比较与非比较
重构背景及原因 最近由于项目组的人员在不断扩充,导致项目中代码风格各异,大有百花齐放甚至怒放之势.考虑到团队的生存与发展,经过众人多次舌战之后,最终决定项目组根据业务分成几个小分队,以加强团队管理与提 ...
- [java] 更好的书写equals方法-汇率换算器的实现(4)
[java] 更好的书写equals方法-汇率换算器的实现(4) // */ // ]]> [java] 更好的书写equals方法-汇率换算器的实现(4) Table of Content ...
- Equals和ReferenceEquals
稍微分析下一下两个方法的区别: public static bool Equals(object objA, object objB); public static bool ReferenceEqu ...
随机推荐
- PEP8规范
目录 一 代码编排 二 文档编排 三 空格使用 四 注释 五 文档描述 六 命名规范 七 编码建议 代码编排 1缩进,4个空格,不用tab键(因为可能不同系统tab的空格数不一定) 2每行最大长度79 ...
- shell基础之bash
一直单单知道部署服务器等命令,shell语言还没有用心学习过,简单的学习下以供不时之需 .sh:bash脚本文件 很多时候需要多个命令来完成一项工作,而这个工作又常常是重复的,这个时候我们自然会想到将 ...
- Excel:6种多条件查找方法
如下图所示,要求根据设备分类和品牌来查找相应的销售数量. 1. 使用VLOOKUP+辅助列进行多条件查找 本例采用的方法是在原表的最前面加一辅助列,辅助列的公式为:=B2&C2 然后再采用VL ...
- python对象-多态
调用不同的子类将会产生不同的行为,而无须明确知道这个子类实际上是什么. 比如,在一个可以播放音频文件的程序中,媒体播放器可能需要加载一个AudioFile对象然后play它,我们把一个play()的方 ...
- 剑指Offer_编程题_9
题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级.求该青蛙跳上一个n级的台阶总共有多少种跳法. class Solution { public: int jumpFloorI ...
- Struts2_参数获得方式
1.属性驱动 /** * @ClassName: Demo8Action * @Description: struts2如何获得参数 * 每次请求action时都会创建新的action实例对象 * @ ...
- flask模版继承和block
模版继承和block的目的就是为了减少前端代码量 flask_ones.py #encoding:utf-8 from flask import Flask,url_for,redirect,rend ...
- Zabbix Server 自带模板监控更加灵活MySQL数据库
Zabbix Server 自带模板监控更加灵活MySQL数据库 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.zabbix-agent端配置 1>.修改zabbix的 ...
- Shell中引号的操作
单引号.双引号.反撇号的作用与区别 单引号属于强引用,它会忽略所有被引起来的字符的特殊处理,被引用起来的字符会被原封不动的使用,唯一需要注意的点是不允许引用自身: 示例如下: sh-4.2# echo ...
- ESXI6时间源快速同步
1.使用SSH会话连接到ESXi主机. 2./etc/ntp.conf 在文本编辑器中打开 添加内天tos maxdist 303.运行此命令以访问 likewise shell /usr/lib/v ...