- 浏览: 93497 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (133)
- jQuery (11)
- XML (3)
- 组件 (1)
- JAVA (20)
- WEB (3)
- SPRING (6)
- HIBERNATE (5)
- AJAX (2)
- JS (1)
- JAVA webservice (1)
- Ditu (1)
- WEBSITE (1)
- HIBERNATE ANNOTATION (1)
- 排序 (1)
- TCP_NODELAY (1)
- ConvertUtils (1)
- Logistics (1)
- SQL SERVER 中identity (4)
- sql server (35)
- MYSQL (1)
- Eclipse (6)
- ORACLE (6)
- FLEX (4)
- notepad++ (0)
- UNION ALL (1)
- JUnit (3)
- SQL 异常处理 (1)
- @@trancount (1)
- IOS (1)
- ORA-02266 (1)
- REMOTE DESKTOP (0)
- HTML 优化 (1)
- CRLF (1)
- SQL Server Sequence (1)
最新评论
-
zjuttsw:
看的舒服
重要的hashcode equals转载
对于hashcode方法和equals方法,我们需要注意以下几点:
1.equals方法所需要的几个特性
?什么情况下进行equals的比较?答案是用equals比较的只是值本身,对于equals方法,读者需要记住按照两种情况来运用,一比较基本类型的值的比较,二比较的是对象。equals比较的只是值或者对象的内容。
非空的x,y,z,
一致性:无论x.equals(y)比较多少次,都应该返回true
反射性:任何对象和它本身比较都应该返回true
类推性:x.equals(y), y.equals(z),x.equals(z)都应该返回true
对称性:x.equals(y)和y.equals(x)返回的应该都是true.
非空和null比较永久都该返回false.
2.hashcode和equals的关系
对于java中的object类来说,hashcode返回的是对象的内存地址(可以粗略的这样认为),String类(以及其他原生数据类型如int ,flat等的引用数据类型Integer Float等)重写了object的hashcode和equals方法,但是在这里注意,不要被基本数据类型的对于hashcode和equals方法重写所迷惑了。基本数据类型对于OBJECT的该2个方法的重写并不意味着你再现实的代码中也同样照做(下面会解释).基本类型String等对于这两个方法的重写其实着重在内容上。
Java定义的规则中硬性的绑定了2个原则:
hashcode值相同的2个对象(注意这里是对象)并不一定是同一个对象,也就是说equals方法返回的不一定是true,即对象的内容可能不同。
equals方法返回true,hashcode的返回的int类型的值并不一定相同,即内容相同的两个对象不一定是同一个对象(名字相同的人不一定是同一个人)。
相同对象必定equals方法返回true且hashcode值相同
3.重点关键所在:现实当中重写equals方法必定要重写hashcode?
读者可以直接读取java的目录中的rt.jar,找到string类的源码,可以发现,String的hashcode方法是读取字符串中的每个字符,并不是对象的内存地址,换句话来说,object的hashcode方法在string中被重写,equals方法也是对2个字符串内容进行比较,hashcode也被定义成与内容相关,所以我们可以发现为了保证基本类型对象是同一个对象:必须让hashcode返回值和equals方法都绑定到对于内容的处理上,换句话来说,满足了上面第二点的分析,同一个对象hashcode,equals2个方法都必须满足。
现实当中,只有在用到集合类的时候,才需要重写hashcode方法,否则不需要重写hashcode方法,比较2个对象只需要equals方法即可,当用到集合类时,重写hashcode方法并不是效率的考虑,而是必须重写hashcode方法,否则会出现宏观上的理解错误:
mport java.util.*;
public class HashSetTest
{
public static void main(String[] args)
{
HashSet hs=new HashSet();
hs.add(new Student(1,"t1"));
hs.add(new Student(2,"t2"));
hs.add(new Student(3,"t3"));
hs.add(new Student(1,"t1"));
Iterator it=hs.iterator();
while(it.hasNext())
{
System.out.println(it.next());
}
}
}
class Student
{
int num;
String name;
Student(int num,String name)
{
this.num=num;
this.name=name;
}
public String toString()
{
return num+":"+name;
}
}
输出结果为:
1:t1
1:t1
3:t3
2:t2
可见这样的效果并不是我们从宏观上想要的,对于我们自己定义的对象student来说,我们需要num,name相同的对象就应当是同一个对象,但是由于没有重写equals方法和hashcode方法,使用new 运算符创建对象时,内存地址是不同的,因为沿用了object的hashcode和equals方法,导致set对传入的对象的判断上发生错误,导致我们重复塞了2个“相同的对象”(这种相同是指我们自己定义的规则,比如学号相同,名称相同我们就认为是同一个对象)。
读者可以查看HashSet的源码,可以发现HashSet底层采用HashMap实现,HashMap并不允许重复的K值存入,所以当存入新的K时,会对传入的参数K的hashCode值进行判断,如果K相同,那么覆盖老的V,用新的V:
if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
我们可以发现这里双重调用到了hash和equals,所以为了避免存入重复对象,我们需要重写我们自己的student类的hashcode和equals方法,以告诉hashSet避免存入我们宏观意义上的重复对象。
而对于String等基本类型来说,比如
HashSet hs=new HashSet();
hs.put("1","2");
hs.put("1","3"); //第二步
当进行put时,代码第二步处会对传入的"1"(K)进行判断,因为已经存在一个K的hashcode以及equals方法和第二步处传入的"1"相同,所以视作同一个K处理。
最后总结一点:一般项目中如果需要用到集合类如hashtable,hashset时,那么我们自己新建的对象如果需要存入该集合类,那么必须重写hashcode以及equals方法,不能漏掉任何一个。
1.equals方法所需要的几个特性
?什么情况下进行equals的比较?答案是用equals比较的只是值本身,对于equals方法,读者需要记住按照两种情况来运用,一比较基本类型的值的比较,二比较的是对象。equals比较的只是值或者对象的内容。
非空的x,y,z,
一致性:无论x.equals(y)比较多少次,都应该返回true
反射性:任何对象和它本身比较都应该返回true
类推性:x.equals(y), y.equals(z),x.equals(z)都应该返回true
对称性:x.equals(y)和y.equals(x)返回的应该都是true.
非空和null比较永久都该返回false.
2.hashcode和equals的关系
对于java中的object类来说,hashcode返回的是对象的内存地址(可以粗略的这样认为),String类(以及其他原生数据类型如int ,flat等的引用数据类型Integer Float等)重写了object的hashcode和equals方法,但是在这里注意,不要被基本数据类型的对于hashcode和equals方法重写所迷惑了。基本数据类型对于OBJECT的该2个方法的重写并不意味着你再现实的代码中也同样照做(下面会解释).基本类型String等对于这两个方法的重写其实着重在内容上。
Java定义的规则中硬性的绑定了2个原则:
hashcode值相同的2个对象(注意这里是对象)并不一定是同一个对象,也就是说equals方法返回的不一定是true,即对象的内容可能不同。
equals方法返回true,hashcode的返回的int类型的值并不一定相同,即内容相同的两个对象不一定是同一个对象(名字相同的人不一定是同一个人)。
相同对象必定equals方法返回true且hashcode值相同
3.重点关键所在:现实当中重写equals方法必定要重写hashcode?
读者可以直接读取java的目录中的rt.jar,找到string类的源码,可以发现,String的hashcode方法是读取字符串中的每个字符,并不是对象的内存地址,换句话来说,object的hashcode方法在string中被重写,equals方法也是对2个字符串内容进行比较,hashcode也被定义成与内容相关,所以我们可以发现为了保证基本类型对象是同一个对象:必须让hashcode返回值和equals方法都绑定到对于内容的处理上,换句话来说,满足了上面第二点的分析,同一个对象hashcode,equals2个方法都必须满足。
现实当中,只有在用到集合类的时候,才需要重写hashcode方法,否则不需要重写hashcode方法,比较2个对象只需要equals方法即可,当用到集合类时,重写hashcode方法并不是效率的考虑,而是必须重写hashcode方法,否则会出现宏观上的理解错误:
mport java.util.*;
public class HashSetTest
{
public static void main(String[] args)
{
HashSet hs=new HashSet();
hs.add(new Student(1,"t1"));
hs.add(new Student(2,"t2"));
hs.add(new Student(3,"t3"));
hs.add(new Student(1,"t1"));
Iterator it=hs.iterator();
while(it.hasNext())
{
System.out.println(it.next());
}
}
}
class Student
{
int num;
String name;
Student(int num,String name)
{
this.num=num;
this.name=name;
}
public String toString()
{
return num+":"+name;
}
}
输出结果为:
1:t1
1:t1
3:t3
2:t2
可见这样的效果并不是我们从宏观上想要的,对于我们自己定义的对象student来说,我们需要num,name相同的对象就应当是同一个对象,但是由于没有重写equals方法和hashcode方法,使用new 运算符创建对象时,内存地址是不同的,因为沿用了object的hashcode和equals方法,导致set对传入的对象的判断上发生错误,导致我们重复塞了2个“相同的对象”(这种相同是指我们自己定义的规则,比如学号相同,名称相同我们就认为是同一个对象)。
读者可以查看HashSet的源码,可以发现HashSet底层采用HashMap实现,HashMap并不允许重复的K值存入,所以当存入新的K时,会对传入的参数K的hashCode值进行判断,如果K相同,那么覆盖老的V,用新的V:
if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
我们可以发现这里双重调用到了hash和equals,所以为了避免存入重复对象,我们需要重写我们自己的student类的hashcode和equals方法,以告诉hashSet避免存入我们宏观意义上的重复对象。
而对于String等基本类型来说,比如
HashSet hs=new HashSet();
hs.put("1","2");
hs.put("1","3"); //第二步
当进行put时,代码第二步处会对传入的"1"(K)进行判断,因为已经存在一个K的hashcode以及equals方法和第二步处传入的"1"相同,所以视作同一个K处理。
最后总结一点:一般项目中如果需要用到集合类如hashtable,hashset时,那么我们自己新建的对象如果需要存入该集合类,那么必须重写hashcode以及equals方法,不能漏掉任何一个。
发表评论
-
JAVA 的checked异常和unchecked异常
2015-03-03 17:23 610JAVA 的checked异常和unchecked异常 (20 ... -
good upload
2013-08-01 12:48 334http://spring-geli.iteye.com/bl ... -
文件上传
2013-08-01 12:01 246http://zhangjunhd.blog.51cto.co ... -
错序死锁(Locking-ordering deadlock)
2013-07-31 15:15 655错序死锁(Locking-ordering deadlock) ... -
collection排序
2013-06-17 16:52 488http://www.cnblogs.com/huangfox ... -
ServerSocket 与 Socket的区别
2013-04-03 08:08 651http://www.cnblogs.com/mareymar ... -
java基础:关于java流与文件操作
2013-04-03 00:36 636http://www.blogjava.net/haizhig ... -
NumberFormatException异常
2013-03-17 21:48 9861. 对应String类型的对象 ... -
Heep and Stack
2013-02-20 16:52 562java中堆(heap)和堆栈(s ... -
Java中HashMap的工作机制
2013-01-12 19:50 0http://java.chinaitlab.com/adva ... -
java中去掉字符串中间的空格
2013-01-12 19:23 8981.JAVA中去掉空格 2. 3.1. S ... -
JAVA高级
2013-01-12 19:23 688http://java.chinaitlab.com/adva ... -
Java中的克隆(Clone)机制
2013-01-12 19:19 603http://java.chinaitlab.com/adva ... -
java设计模式示例
2013-01-12 19:13 741http://blog.csdn.net/chmask/art ... -
Thread
2013-01-12 18:20 668Java:使用wait()与notify()实现线程间协作 2 ... -
重要的hashcode equals转载
2012-12-28 10:26 736http://www.iteye.com/topic/2571 ... -
JAVA HashCode
2012-12-28 10:14 626http://www.cnblogs.com/batys/ar ... -
java bingfa
2012-12-27 14:29 695http://www.iteye.com/topic/3665 ... -
Good book about java
2012-12-27 14:05 561http://extjs2.iteye.com/blog/79 ... -
内部类
2012-12-04 18:51 760Java代码 内部类的分类:成员内部类,静态内部类,局部内 ...
相关推荐
实际上,hashcode根本不能代表object的内存地址。
而我有个类,这个类有个字段叫ID,我要把这个类存放在以上8个位置之一,如果不用hashcode而任意存放,那么当查找时就需要到这八个位置里挨个去找,或者用二分法一类的算法。 但如果用hashcode那就会使效率提高很多
深入 HashCode 方法~~~~~
更清楚的了解hashcode()和equals()方法。
这里是一个文档,里边讲解了hashCode与equals方法使用,大家要是不明白,可以去看看
hashcode是用来查找的,如果你学过数据结构就应该知道,在查找和排序这一章有……
equals()和hashcode()这两个方法都是从object类中继承过来的。当String 、Math、还有Integer、Double。。。。等这些封装类在使用equals()方法时,已经覆盖了object类的equals()方法.
hashcode的作用.doc hashcode的作用.doc hashcode的作用.doc
重写equals和hashcode方法,学习和进步
本文介绍了Java语言不直接支持关联数组,可以使用任何对象作为一个索引的数组,但在根Object类中使用 hashCode()方法明确表示期望广泛使用HashMap。理想情况下基于散列的容器提供有效插入和有效检索;直接在对象模式...
PPT浅析hashcode定义和作用;和简单的代码演示PPT.很简单的
java中hashCode()的理解
1,如果两个对象相同,那么它们的hashCode值一定要相同; 2,如果两个对象的hashCode相同,它们并不一定相同 上面说的对象相同指的是用eqauls方法比较。 3,HashCode码不唯一
java中Hashcode的作用
深入HashCode 最近学习HashCode的小结与整理,希望对大家有帮助
在Java语言中,equals()和hashCode()两个函数的使用是紧密配合的,你要是自己设计其中一个,就要设计另外一个。在多数情况下,这两个函数是不用考虑的,直接使用它们的默认设计就可以了。但是在一些情况下,这两个...
利用反射绕过编译器和hashcode高级应用
Java重写equals同时需要重写hashCode的代码说明,以及如何重写hashCode方法,此代码演示按照effective java书籍说明的重写思路。代码中演示了使用集合存储对象,并且对象作为key,需重写equals和hashCode.
HashCode相同equals不同的2位字符集合算法 另附ASCII码表
字符串哈希码 字符串的其他实用程序。... equal ( code , code2 ) ;原料药hashCode(str)参数: str:字符串对象返回: 编号:哈希码返回字符串的哈希码。 请注意,哈希码对于特定字符串是不可变的。执照麻省理工学院