- 浏览: 898272 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (537)
- Java SE (114)
- Struts (18)
- Hibernate (25)
- Spring (3)
- Page_Tech (41)
- Others (87)
- Database (29)
- Server (24)
- OpenSource_Tools (15)
- IDE_Tool (22)
- Algorithm (28)
- Interview (22)
- Test (28)
- Hardware (1)
- Mainframe (25)
- Web application (4)
- Linux (3)
- PHP (17)
- Android (1)
- Perl (6)
- ubuntu (1)
- Java EE (9)
- Web Analysis (5)
- Node.js (2)
- javascript (2)
最新评论
-
一键注册:
request.getRequestURL()和request.getRequestURI() -
SuperCustomer:
...
SED的暂存空间和模式空间 -
juyo_ch:
讲得挺好理解的,学习了
java 死锁及解决 -
chinaalex:
最后一题答案正确,但是分析有误.按照如下过程,上一行为瓶,下一 ...
zz智力题 -
liaowuxukong:
多谢博主啦,弱弱的了解了一点。
C++/Java 实现多态的方法(C++)
Java中的很多对象都override了equals方法,都知道,这是为了能比较两个对象是否相等而定义,如果不需要比较,则不需要定义equals方法。比如StringBuffer类,没有提供equals方法,则说明没有两个StringBuffer对象是相等的。再比如Collections类,全部是静态方法,根本没必要创建对象,所以也就没有提供equals方法。
我们程序中自定义的对象有时候需要比较它们是否相等,也需要重写equals方法。如果我们要将对象放到HashMap或者Hashtable这样的hash集合中的时候,就需要重写hashcode方法了。因为它们是根据hashcode来标识对象的。
如果我们不重写hashcode方法,把他们作为key放入hashmap中是什么情况呢?看看下面代码:
- import java.util.HashMap;
- public class HashTest {
- public static void main(String...args) {
- MyBean a = new MyBean();
- a.x = 1;
- a.s = "xyz";
- MyBean b = new MyBean();
- b.x = 1;
- b.s = "xyz";
- HashMap<MyBean, String> map = new HashMap<MyBean, String>();
- map.put(a, "a");
- map.put(b, "b");
- System.out.println("a equals b:"+a.equals(b));
- System.out.println("map size:"+map.size());
- System.out.println("a:"+map.get(a));
- System.out.println("b:"+map.get(b));
- }
- }
- class MyBean {
- int x;
- String s;
- @Override
- public boolean equals(Object obj) {
- if(this == obj) return true;
- if(!(obj instanceof MyBean)) return false;
- if(((MyBean)obj).x == x) return true;
- return false;
- }
- }
import java.util.HashMap;
public class HashTest {
public static void main(String...args) {
MyBean a = new MyBean();
a.x = 1;
a.s = "xyz";
MyBean b = new MyBean();
b.x = 1;
b.s = "xyz";
HashMap<MyBean, String> map = new HashMap<MyBean, String>();
map.put(a, "a");
map.put(b, "b");
System.out.println("a equals b:"+a.equals(b));
System.out.println("map size:"+map.size());
System.out.println("a:"+map.get(a));
System.out.println("b:"+map.get(b));
}
}
class MyBean {
int x;
String s;
@Override
public boolean equals(Object obj) {
if(this == obj) return true;
if(!(obj instanceof MyBean)) return false;
if(((MyBean)obj).x == x) return true;
return false;
}
}
结果如下:
a equals b:true
map size:2
a:a
b:b
a和b明明是相等的,可是放进hashmap中之后,却被认为是两个对象,很诡异哦。
下面加上hashcode,再看看什么结果:
- class MyBean {
- int x;
- String s;
- @Override
- public boolean equals(Object obj) {
- if(this == obj) return true;
- if(!(obj instanceof MyBean)) return false;
- if(((MyBean)obj).x == x) return true;
- return false;
- }
- @Override
- public int hashCode() {
- return (s!=null?s.hashCode():1)*31+x;
- }
- }
class MyBean {
int x;
String s;
@Override
public boolean equals(Object obj) {
if(this == obj) return true;
if(!(obj instanceof MyBean)) return false;
if(((MyBean)obj).x == x) return true;
return false;
}
@Override
public int hashCode() {
return (s!=null?s.hashCode():1)*31+x;
}
}
结果如下:
a equals b:true
map size:1
a:b
b:b
这样才保证了相等的对象在hash集合中也相等。计算hashcode的时候,一般使用关键的属性的hashcode值。计算hashcode的属性较多则计算复杂,降低了效率,若较少的属性计算,则重复的hashcode较多,同样降低性能,写一个好的hashcode方法,还比较难。
所以,我们重写equals的时候,一定要重写hashcode方法。
发表评论
-
maven 在Mac OS下运行的问题总结
2014-05-16 17:24 787在maven下生成基本的项目结构。 生成eclipse项 ... -
【zz】 java函数参数类型后添加三点的用法
2012-07-02 09:48 1008今天看到一个没见过的函数参数列表test(int... a), ... -
【zz】Java编码的理解和Java加载器的理解
2012-06-08 15:59 713一,我对java中编码的理解1. 编码的产生 对电脑而言 ... -
类加载器入门级应用
2012-06-08 15:17 8961、类加载器负责加载 Ja ... -
ClassLoader详解
2012-06-08 14:23 1214Point One 将J2EE应用程序移植到W ... -
Java静态代理与动态代理
2012-05-29 10:32 896JAVA的静态代理与动态代 ... -
JDK的动态代理深入解析(Proxy,InvocationHandler)(转)
2012-05-29 10:31 5139调用处理器InvocationHandle ... -
zz 动态反射实现AOP的简单原理
2012-05-28 17:46 864其实AOP的意思就是面向切面编程. OO注重的是我们 ... -
理解Java枚举在单例模式的应用
2012-06-05 15:50 12455.3.9 单例和枚举 按照《高效Java 第二版》中的说 ... -
Java 枚举的介绍
2012-05-23 16:50 0一、使用简单程序完成枚举的功能 例:使用简单类完成枚举操作 ... -
枚举类型的用法
2012-06-05 15:50 1384DK1.5引入了新的类型——枚举。在 Java 中它虽然算 ... -
单例模式的七种写法 (包括1.5新特性)
2012-05-23 16:18 0第一种(懒汉,线程不安全): <!--<br / ... -
JDK Log的设计思想
2012-05-23 14:39 1273最近在看《Agile Java》,看到日志一节,收获颇多,所以 ... -
[zz] Synchronized和Static Synchronized区别
2012-05-23 14:07 741通过分析这两个用法的分析,我们可以理解java中锁的概念。一 ... -
双精度、单精度的有效位数
2012-05-22 17:25 4997浮点数7位有效数字。(应该是单精度数) 双精度数16位有效 ... -
DecimalFormat 使用方法
2012-05-22 16:44 989我们经常要将数字进行格式化,比如取2位小数,这是最常见的。Ja ... -
Java Applet 无法运行的一个问题
2012-04-28 15:09 2499当你用JDK1.6开发出的新功能,在JDK1.6上re ... -
JDK1.5之中的Map相关的类
2012-04-26 10:14 1815java5的java.util包提供了大量集合类。其中最常用的 ... -
设计模式应用场景总结
2012-04-11 16:47 1231在J2EE的开发和测试中,其实不知不觉已经使用了许多设计模式。 ... -
【转】有状态和无状态的Servlet
2012-04-06 14:57 3705我相信有不少人还不明白有状态和无状态(Stateful and ...
相关推荐
Java重写equals同时需要重写hashCode的代码说明,以及如何重写hashCode方法,此代码演示按照effective java书籍说明的重写思路。代码中演示了使用集合存储对象,并且对象作为key,需重写equals和hashCode.
重写equals和hashcode方法,学习和进步
为什么重写equals方法,还必须要重写hashcode方法
主要介绍了重写hashCode()和equals()方法详细介绍,涉及重写equals()方法,重写hashCode()方法,重写equals()而不重写hashCode()的风险等相关内容的介绍,具有一定借鉴价值,需要的朋友可以参考下
String重写了equals方法,引用指向同一个地址,一定返回true。并且如果String包含的字符串 完全相同,同样返回true. public boolean equals(Object anObject) { if (this == anObject) { return true; } /
文章目录1、hashCode与equals两者之间的关系2、== 和equals的区别`3、为什么要重写equals()方法?4、重写equals()方法5、为什么要重写hashCode()方法?6、什么时候需要重写hashCode()方法?7、重写hashCode()方法: ...
主要给大家介绍了关于java中为什么重写equals时必须重写hashCode方法的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
java 序列化和重写 hashCode 以及 equals 方法的例子
Object 类是所有类的父类,其 equals 方法比较的是两个对象的引用指向的地址,hashcode 是一个本地方法,返回的是对象地址值。他们都是通过比较地址来比较对象是否相等的
首先我们先来看下String类的源码:可以发现String是重写了Object类的equals方法的,并且也重写了hashcode方法
下面小编就为大家带来一篇java中重写equals()方法的同时要重写hashcode()方法(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
关于重写equals,hashcode以及compareTo方法!
深入 HashCode 方法~~~~~
NULL 博文链接:https://zpointer.iteye.com/blog/1058337
1.概述 2.为什么重写equels方法要重写hashcode方法 3.例子
个人学习终结成果:为什么要重新equals和hashCode方法?如何重写?站好马步需从j2se基础开始
这里是一个文档,里边讲解了hashCode与equals方法使用,大家要是不明白,可以去看看
主要介绍了java中重写equals和重写hashCode()的相关资料,需要的朋友可以参考下
equals()和hashcode()这两个方法都是从object类中继承过来的。当String 、Math、还有Integer、Double。。。。等这些封装类在使用equals()方法时,已经覆盖了object类的equals()方法.
ATM系统 Clone方法 toString方法:表示返回对象的字符串表示形式 包名.类名@hashCode(内存地址) 打印对象时,默认调用 如果不是想使用object类,toString...如果equal返回true的话,hashCode相同,重写hashCode方法