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.前者集合内的元素是有序的,元素可以重复:后者元素无序,但元素不可重复. ...
随机推荐
- 浅析Struts1和Struts2的Action线程安全问题 转
浅析Struts1和Struts2的Action线程安全问题 转 http://blog.csdn.net/virgoboy2004/article/details/5876133 [问题描述]最近 ...
- es6语法重构react代码
1.使用React.Component创建组件,需要通过在constructor中调用super()将props传递给React.Component.另外react 0.13之后props必须是不可变 ...
- You need to use a Theme.AppCompat theme (or descendant) with this activity解决方法
报错如下:java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.test2/com.exampl ...
- ORA-27086: unable to lock file - already in use
问题现象: SQL> startup ORACLE instance started. Total System Global Area 1854021632 bytes Fixed Size ...
- 内容模块PC标签调用说明
内容模块 模块名:content 模块提供的可用操作 操作名 说明 lists 内容数据列表 relation 内容相关文章 hits 内容数据点击排行榜 category 内容栏目列表 positi ...
- 别样的checkbox
<style type="text/css"> input[type=checkbox] { visibility: hidden; } .slide_check_bo ...
- Android的onCreateOptionsMenu()创建菜单Menu详解
Android一共有三种形式的菜单: 1.选项菜单(optinosMenu) 2.上下文菜单(ContextMenu) 3.子菜单(s ...
- web几个高性能框架的简单测试
参考的这里 压测工具 wrk -t16 -c100 -d30s http://127.0.0.1:8080/rest/hello 测试代码 package main import ( "st ...
- sgu233 little kings
题目大意: 有n*n的棋盘上放k个国王.国王可以攻击与它相邻的八个格子.现在要使国王不相互攻击,有多少种放置的方案数.一个格子不能放两个国王. n<=10,k<=n*n. 分析:简单的状态 ...
- Sqlserver 树形查询
WITH tree AS(SELECT dwpid, dwid,1 AS x2level,dwmc,/*CAST(dwmc AS NVARCHAR(max)) x2name,*/CAST(+dwid ...