- 浏览: 914671 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (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 824在maven下生成基本的项目结构。 生成eclipse项 ... -
【zz】 java函数参数类型后添加三点的用法
2012-07-02 09:48 1046今天看到一个没见过的函数参数列表test(int... a), ... -
【zz】Java编码的理解和Java加载器的理解
2012-06-08 15:59 747一,我对java中编码的理解1. 编码的产生 对电脑而言 ... -
类加载器入门级应用
2012-06-08 15:17 9241、类加载器负责加载 Ja ... -
ClassLoader详解
2012-06-08 14:23 1240Point One 将J2EE应用程序移植到W ... -
Java静态代理与动态代理
2012-05-29 10:32 937JAVA的静态代理与动态代 ... -
JDK的动态代理深入解析(Proxy,InvocationHandler)(转)
2012-05-29 10:31 5183调用处理器InvocationHandle ... -
zz 动态反射实现AOP的简单原理
2012-05-28 17:46 895其实AOP的意思就是面向切面编程. OO注重的是我们 ... -
理解Java枚举在单例模式的应用
2012-06-05 15:50 12725.3.9 单例和枚举 按照《高效Java 第二版》中的说 ... -
Java 枚举的介绍
2012-05-23 16:50 0一、使用简单程序完成枚举的功能 例:使用简单类完成枚举操作 ... -
枚举类型的用法
2012-06-05 15:50 1428DK1.5引入了新的类型——枚举。在 Java 中它虽然算 ... -
单例模式的七种写法 (包括1.5新特性)
2012-05-23 16:18 0第一种(懒汉,线程不安全): <!--<br / ... -
JDK Log的设计思想
2012-05-23 14:39 1307最近在看《Agile Java》,看到日志一节,收获颇多,所以 ... -
[zz] Synchronized和Static Synchronized区别
2012-05-23 14:07 779通过分析这两个用法的分析,我们可以理解java中锁的概念。一 ... -
双精度、单精度的有效位数
2012-05-22 17:25 5101浮点数7位有效数字。(应该是单精度数) 双精度数16位有效 ... -
DecimalFormat 使用方法
2012-05-22 16:44 1021我们经常要将数字进行格式化,比如取2位小数,这是最常见的。Ja ... -
Java Applet 无法运行的一个问题
2012-04-28 15:09 2528当你用JDK1.6开发出的新功能,在JDK1.6上re ... -
JDK1.5之中的Map相关的类
2012-04-26 10:14 1858java5的java.util包提供了大量集合类。其中最常用的 ... -
设计模式应用场景总结
2012-04-11 16:47 1264在J2EE的开发和测试中,其实不知不觉已经使用了许多设计模式。 ... -
【转】有状态和无状态的Servlet
2012-04-06 14:57 3742我相信有不少人还不明白有状态和无状态(Stateful and ...
相关推荐
如果我们不重写 hashCode(),那么对象的 hashCode 将会默认使用 Object 类中的 hashCode 方法,这样将会导致对象的存储位置不确定。 例如,如果我们有两个对象,它们的 hashCode 都是 1,那么它们将会被存放在同一...
理解并正确地重写这两个方法对于优化程序性能和确保逻辑一致性具有重要意义。 1. **为什么使用`hashCode()`?** 在集合类如`HashSet`或`HashMap`中,`hashCode()`的主要作用是快速定位对象。当试图将一个对象添加...
然而,这样的输出对于调试和日志记录通常并不友好,所以我们常常需要重写`toString()`方法来提供更有意义的信息。 在Java中,`toString()`方法的重写通常是为了展示对象内部的状态,即它的成员变量的值。这样做可以...
通常,我们会重写这个方法来提供更有意义的字符串表示,比如类实例的状态信息。 5. **clone()方法**:`clone()`方法创建并返回当前对象的一个副本。这个方法涉及到浅拷贝和深拷贝的概念,需要注意的是,不是所有的...
为了调试或输出有意义的信息,常常需要重写此方法,返回一个描述对象状态的字符串。例如,你可以让一个用户类返回用户名和电子邮件的组合。 通过观看"day15_04(常用API)重写equals方法.avi","day15_03(常用API)...
- **实现**:通常会在子类中重写该方法,以便返回更有意义的信息。 - **示例**: ```java public class Demo extends Object { private int id; private String name; // 构造函数 public Demo(int id, ...
- 在实际应用中,我们通常会重写`toString()`方法,以便打印出对象的有意义的信息,如类的属性值。在示例中,`Person`类重写了`toString()`,输出了`Person{name='张三', age=18}`这样的格式。 2. **equals() 方法...
为了提供更有意义的信息,通常建议对自定义类重写`toString()`方法,以便返回一个更易于理解的字符串表示。 **示例代码**: ```java public class MyClass { private int myField; public MyClass(int myField) ...
Java中 == 和 equals 和 hashCode 的区别 int、char、long 各占多少字节数 int 和 Integer 的区别 谈谈对Java多态的理解 String、StringBuffer、StringBuilder的区别 什么是内部类?内部类的作用 抽象类和接口的区别...
- **重写equals和hashCode**:当自定义对象作为键存储在散列表中时,需要同时重写`equals()`和`hashCode()`方法,确保逻辑一致性。 - **toString()的重写**:提供更有意义的字符串表示,增强程序的可读性。 - **合理...
因此,所有Java对象都有`Object`类提供的方法,如`toString()`、`equals()`和`hashCode()`。 5. **`toString()`方法**: - `Object`类的`toString()`方法返回类名加`@`加16进制的哈希码。在打印或连接对象时,默认...
方法的重载是指多个方法具有相同的方法名,但具有不同的参数列表,方法的重写是指子类重写父类的方法。 本文总结了 Java 面试题中的知识点,涵盖了 Java 的基础知识、集合框架、数据库访问、多线程、面向对象编程等...
- 在重写`equals()`时,通常也需重写`hashCode()`,以保持两个方法的一致性,遵循equals和hashCode约定,确保当两个对象相等时,它们的哈希码也应该相等。 总结来说,理解`Object`类及其提供的方法是Java开发的基础...
如果只重写了equals而没有重写hashCode,则可能导致两个逻辑上相等的对象有不同的哈希值,从而导致集合中出现重复元素。 #### String、StringBuffer与StringBuilder的区别 - **String**:不可变字符串,每次修改...
然而,对于具有实际业务意义的类,我们通常会重写`equals()`方法,以比较对象的属性或状态是否相等。例如,`String`类就重写了`equals()`,比较的是字符串的内容而不是引用。 `hashCode()`方法返回对象的散列码,...
而`equals`方法默认也是比较对象的引用,但在很多类(如`String`)中被重写以比较对象的内容。对于基本数据类型的包装类,除了`Float`和`Double`,其他都实现了常量池,比如`Integer`在-128到127之间的值会复用对象...
- **equals与hashCode的关系**:当重写`equals`方法时,通常还需要重写`hashCode`方法以确保一致性。这是因为在Java中,如果两个对象根据`equals`方法定义的规则相等,则它们的`hashCode`也应该相同。 4. **Java...
toString()方法的源码中返回类的全限定名字和hashCode()方法返回的int值,可以暂时理解为对象的内存地址。Integer.toHexString()方法将int类型的值转成十六进制。因此调用对象的toString()方法将看到内存的地址值。 ...
4. **重写hashCode和equals方法的原因** 为了确保键的唯一性,需要重写这两个方法,使具有相同意义的对象能正确地映射到相同的哈希值,并且equals方法可以确认两个对象是否相等。 5. **hash函数的实现** JDK1.8中,...