HashCode equals
HashCode:
hashcode就是一个签名。当两个对象的hashcode一样时,两个对象就有可能一样。如果不一样的话两个对象就肯定不一样。
一般用hashcode来进行比较两个东西是不是一样的,可以很容易的排除许多不一样的东西。
最常用的地方就是在一堆东西里找一个东西。先用你要找的东西的hashcode和所有东西的hashcode比较,如果不一样的话就肯定不是你要找的东西。如果一样的话就很可能是你要找的东西。然后再进行仔细的比较两个东西是不是真的一模一样。
//一个不能加重复内容的容器
class Set {
Object[] objs = new Object[10]; //装东西的的数组
int size = 0; //已经有几个东西
//添加新东西,成功的话返回true,如果已经有了的话返回false
boolean add(Object o) {
for(int i=0;i<size;i++) { //搜索所有已经加进来的对象
if(objs[i].hashCode() == o.hashCode()) //如果hashcode一样的话就说明两个有可能是一样的
if(objs[i].equals(o)) return false; //仔细的确认一下是不是真的一样,如果一样的话就不加入这个对象
}
objs[size++]=o; //确认没有过这个东西,加入数组
return true;
}
}
当使用这个类的时候要确保两个一样的东西的hashcode肯定是一样的。两个不同的东西的hashcode可以是一样的,不过这样会减慢运行速度,所以尽量避免(也就是所谓的碰撞)。
如:HashSet中插入数据,只有当equals hashCode 都为true是才加入。
即对于HashMap HashSet等集合,只有当equals 和 hashcode都返回true,才认为是同一个对象。
hashset中元素数目
Hashcode true
equals false 有两个
Hashcode false
equals false 两个
Hashcode false
equals true 两个
Hashcode true
equals true 一个
public class Student {
private int id;
private String name;
private int age;
public Student(){}
public Student(int id,String name,int age){
this.id=id;
this.name=name;
this.age=age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public boolean equals(Object obj) {//根据id判定是否相等
if(this==obj)return true;
if(null==obj)return false;
if(obj.getClass()!=getClass())return false;
Student stu = (Student)obj;
if(id!=stu.getId())return false;
return true;
}
@Override
public int hashCode() {
return 18;//返回同一个hashcode
}
}
测试类:
public class HashCodeTest {
public static void main(String[] args) {
List<Student> stuList = new ArrayList<Student>();
Set<Student> stuSet = new HashSet<Student>();
Student st1 = new Student(1, "zhangsan", 18);
Student st2 = new Student(1, "zhangsan", 18);
stuList.add(st1);
stuList.add(st2);
stuSet.add(st1);
stuSet.add(st2);
System.out.println("st1==st2 "+(st1==st2));
System.out.println("st1.equals(st2) "+st1.equals(st2));
System.out.println("list size="+stuList.size());
System.out.println("set size="+stuSet.size());
//---------remove测试
System.out.println("remove测试");
System.out.println("remove result="+stuSet.remove(st2));//删除成功,为同一个对象
System.out.println("set size="+stuSet.size());
stuSet.add(st1);
stuSet.add(st2);
//让equals不相等,hashcode相等
st2.setId(2);
System.out.println("remove测试");
System.out.println("remove result="+stuSet.remove(st2));//删除失败,st2的hashcode与equals不同时为true。即没找到要删除的对象
System.out.println("set size="+stuSet.size());
}
}
测试结果:
st1==st2 false
st1.equals(st2) true
list size=2
set size=1
remove测试
remove result=true
set size=0
remove测试
remove result=false
set size=1
HashCode equals的更多相关文章
- String类型中ToString hashCode equals compareTo等方法的经典实现
private final char value[]; private int hash; // Default to 0 public String(String original) { this. ...
- 关于覆盖Object中的hashCode, equals和toString
最近在看<Effective Java>,里面看到了关于重载hashCode.equals和toString方法的篇章,顿时觉得视野开拓了不少,而且正结合自己工作.项目中的实例,觉得有必要 ...
- Java hashCode() equals()总结
1.hashCode的存在主要是用于查找的快捷性,如Hashtable,HashMap等,hashCode是用来在散列存储结构中确定对象的存储地址的: 2.如果两个对象相同,就是适用于equals(j ...
- Java hashCode(), equals()
转自:http://blog.csdn.net/fenglibing/article/details/8905007冯立彬的博客 以下是关于HashCode的官方文档定义: hashcode方法返回该 ...
- HashSet——add remove contains方法底层代码分析(hashCode equals 方法的重写)
引言:我们都知道HashSet这个类有add remove contains方法,但是我们要深刻理解到底是怎么判断它是否重复加入了,什么时候才移除,什么时候才算是包括????????? add ...
- hashCode equals hashSet
基于hash的map也是这种机制. HashSet import java.util.HashSet; import java.util.Set; import java.util.TreeSet; ...
- Java hashCode&&equals
/** 为保证向Set中添加的对象其所在的类必须要重写hashCode和equals方法: 重写的原则:hashCode和equals尽量保持一致性: 两个相同的对象equals()返回true时,那 ...
- 判断Set里的元素是否重复、==、equals、hashCode方法研究-代码演示
被测试类,没有重写hasCode()和equals()方法: package niukewang; import java.util.Objects; public class setClass { ...
- JAVA - hashcode与equals作用、关系
Hashcode的作用 总的来说,Java中的集合(Collection)有两类,一类是List,再有一类是Set.前者集合内的元素是有序的,元素可以重复:后者元素无序,但元素不可重复. ...
随机推荐
- java编辑器eclipse如何更改jdk版本
第一步:右键点击项目选择properties 第二步:选择Java Build Path 第三步:选择libraries 第四步:选中当前jre再点击右侧Edit 第五步: ...
- sqlserver服务器常用的性能计数器
sqlserver服务器常用的性能计数器,在此标记. 性能对象 计数器 说明 Processor %Processor Time %Privileged Time 建议值:持续低于80 建议值:持续低 ...
- eclipse解压后启动弹出A Java Runtime Evironment(JRE) or Java Development Kit(JDK)....
系统环境:win7 64bit JDK:jdk-7u79-windows-x64 Eclipse:eclipse-jee-helios-win32 启动eclipse:弹出A Java Runtime ...
- [转]了解oracle自治事务
http://blog.csdn.net/indexman/article/details/7799862 1.什么是Oracle自治事务 在官方文档中,是这样的定义的“Autonomous tran ...
- label 与 input
<form onsubmit="return checkform()" > <div style=" width:100%; border:0px #0 ...
- css选择器,用来处理隔行变色的表格
CSS3 :nth-last-child() 选择器,可以用来处理隔行变色的表格,详情请参考网上资料.
- bzoj3007: 拯救小云公主
Description 英雄又即将踏上拯救公主的道路…… 这次的拯救目标是——爱和正义的小云公主. 英雄来到boss的洞穴门口,他一下子就懵了,因为面前不只是一只boss,而是 ...
- gcc和ld 中的参数 --whole-archive 和 --no-whole-archive
首先 --whole-archive 和 --no-whole-archive 是ld专有的命令行参数,gcc 并不认识,要通gcc传递到 ld,需要在他们前面加 -Wl,字串. --whole-ar ...
- Ajax方法执行跳转或者加载操作系统报出这样错误Sys.WebForms.PageRequestManagerParserErrorException:如何让解决
当你在代码中使用Response.Redirect(); 或者Response.Write();难免会遇到Sys.WebForms.PageRequestManagerParserErrorExce ...
- eclipse 中的注释 快捷键-添加/* */注释-Ctrl+Shift+/
(4)Ctrl+Shift+/ 说明:添加/* */注释 (5)Ctrl+Shift+\ 说明:消除/* */注释 更多:http://blog.csdn.net/wjeson/article/det ...