- 浏览: 97598 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (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 635JAVA 的checked异常和unchecked异常 (20 ... -
good upload
2013-08-01 12:48 357http://spring-geli.iteye.com/bl ... -
文件上传
2013-08-01 12:01 273http://zhangjunhd.blog.51cto.co ... -
错序死锁(Locking-ordering deadlock)
2013-07-31 15:15 679错序死锁(Locking-ordering deadlock) ... -
collection排序
2013-06-17 16:52 514http://www.cnblogs.com/huangfox ... -
ServerSocket 与 Socket的区别
2013-04-03 08:08 682http://www.cnblogs.com/mareymar ... -
java基础:关于java流与文件操作
2013-04-03 00:36 665http://www.blogjava.net/haizhig ... -
NumberFormatException异常
2013-03-17 21:48 10141. 对应String类型的对象 ... -
Heep and Stack
2013-02-20 16:52 585java中堆(heap)和堆栈(s ... -
Java中HashMap的工作机制
2013-01-12 19:50 0http://java.chinaitlab.com/adva ... -
java中去掉字符串中间的空格
2013-01-12 19:23 9291.JAVA中去掉空格 2. 3.1. S ... -
JAVA高级
2013-01-12 19:23 701http://java.chinaitlab.com/adva ... -
Java中的克隆(Clone)机制
2013-01-12 19:19 627http://java.chinaitlab.com/adva ... -
java设计模式示例
2013-01-12 19:13 758http://blog.csdn.net/chmask/art ... -
Thread
2013-01-12 18:20 691Java:使用wait()与notify()实现线程间协作 2 ... -
重要的hashcode equals转载
2012-12-28 10:26 772http://www.iteye.com/topic/2571 ... -
JAVA HashCode
2012-12-28 10:14 643http://www.cnblogs.com/batys/ar ... -
java bingfa
2012-12-27 14:29 722http://www.iteye.com/topic/3665 ... -
Good book about java
2012-12-27 14:05 585http://extjs2.iteye.com/blog/79 ... -
内部类
2012-12-04 18:51 770Java代码 内部类的分类:成员内部类,静态内部类,局部内 ...
相关推荐
- `Hashtable` 和 `HashMap` 为了提高性能,会尽量避免哈希冲突的发生,即多个对象具有相同的 `HashCode`。 - 为了减少冲突,可以通过优化 `HashCode` 的计算方法,使不同的对象尽可能获得不同的 `HashCode` 值。 ...
在 Java 中,hashCode 是 Object 类中的一个方法,默认情况下,该方法会将对象的内部地址转换成一个整数。然而,在实际应用中,我们需要重新定义 hashCode 方法,以便满足我们的需求。 例如,我们可以将对象的某个...
在这个例子中,`equals()`方法基于`name`和`age`属性来判断两个`Person`对象是否相等,而`hashCode()`方法也考虑到了这两个属性,以确保当两个对象相等时,它们的哈希码也相同。 #### 总结 `hashCode()`和`equals()...
在Java中,每个对象都具有一个独特的Hashcode,它可以用来标识对象的身份。但是Hashcode是什么?它是如何产生的?有什么作用?下面我们就来详细探讨Java中Hashcode的作用。 Hashcode的约定 在Java中,Hashcode的...
实现`hashCode()`时,需要考虑以下几点: 1. **唯一性**:尽量让不同的对象拥有不同的哈希码,避免哈希冲突。 2. **稳定性**:对于相等的对象,`hashCode()`的值必须相同。 3. **效率**:尽可能快速地计算哈希码,...
为了更好地理解`hashCode`的作用及其在实际开发中的重要性,我们可以从以下几个方面进行深入探讨: #### 1. 基本概念 `hashCode`方法是`java.lang.Object`类中的一个方法,所有Java类都继承自`Object`类,因此每个...
在Java编程语言中,`equals()` 和 `hashCode()` 方法是Object类中的两个核心方法,所有类都默认继承自Object类。这两个方法在处理对象比较和集合操作时起着至关重要的作用。当我们创建自定义类并需要对对象进行精确...
在Java中,`hashCode()` 方法是 `Object` 类的一个重要成员方法,它返回一个整数,这个整数通常用来表示对象的哈希值。哈希值在Java集合框架中扮演着至关重要的角色,尤其是在散列表(如 `HashMap` 和 `Hashtable`)...
图文并茂吃透面试题,看完这个,吊打面试官,拿高薪offer!
equals 方法和 hashCode 方法是 Java 语言中两个重要的方法,它们都是在 Object 类中定义的。equals 方法用于比较两个对象是否相等,而 hashCode 方法用于返回对象的哈希码。 在 Java 的 Object 类中,equals 方法...
在Java编程语言中,`hashCode()` 和 `equals()` 是两个非常重要的方法,它们主要用于对象的比较和哈希表(如HashMap)的操作。标题提到的"HashCode相同equals不同的2位字符集合算法"涉及到的是一个特定场景:两个...
Java 中的每个对象都有 hashCode() 和 equals() 方法,这两个方法的正确实现对于 Java 开发人员来说是非常重要的。本文将详细介绍 hashCode() 和 equals() 的本质区别和联系,并探讨在创建 Java 类时如何定义这些...
equals()和hashcode()这两个方法都是从object类中继承过来的。当String 、Math、还有Integer、Double。。。。等这些封装类在使用equals()方法时,已经覆盖了object类的equals()方法.
在Java编程中,`hashCode()`方法与`equals()`方法是对象比较中的两个非常重要的方法。它们主要用于判断对象是否相等以及对象的散列值,这对于集合类(如`HashSet`)来说尤为重要。下面将详细介绍这两个方法的实现...
`hashCode()`方法则与`equals()`密切相关,它返回一个整数值,代表对象的哈希码,这个值是基于对象的特定状态计算出来的。在哈希表中,对象通过其哈希码快速定位。如果两个对象根据`equals()`方法判断相等,那么它们...
PPT浅析hashcode定义和作用;和简单的代码演示PPT.很简单的
2. 哈希冲突处理:哈希冲突是不可避免的,但可以通过良好的哈希函数设计来减少冲突。一个良好的哈希函数应尽可能将不同的对象映射到不同的哈希桶,以提高查找效率。在Java中,可以使用`Objects.hash()`方法生成哈希...
java中hashCode()的理解
2. **避免返回固定值**:不要在`hashCode`方法中总是返回一个固定的值,比如0,这会导致所有的对象都映射到同一个哈希桶中,从而降低哈希表的性能。 3. **考虑效率**:在实现`hashCode`时,应该尽可能地让不同的对象...