- 浏览: 1525694 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (525)
- SEO (16)
- JAVA-EE-Hibernate (6)
- JAVA-EE-Struts (29)
- JAVA-EE-Spring (15)
- Linux (37)
- JAVA-SE (29)
- NetWork (1)
- CMS (14)
- Semantic Research (3)
- RIA-Flex (0)
- Ajax-Extjs (4)
- Ajax-Jquery (1)
- www.godaddy.com (0)
- SSH (34)
- JavaScript (6)
- SoftwareEngineer (9)
- CMMI (0)
- IDE-Myeclipse (3)
- PHP (1)
- Algorithm (3)
- C/C++ (18)
- Concept&Items (2)
- Useful WebSite (1)
- ApacheServer (2)
- CodeReading (1)
- Socket (2)
- UML (10)
- PowerDesigner (1)
- Repository (19)
- MySQL (3)
- SqlServer (0)
- Society (1)
- Tomcat (7)
- WebService (5)
- JBoss (1)
- FCKeditor (1)
- PS/DW/CD/FW (0)
- DesignPattern (11)
- WebSite_Security (1)
- WordPress (5)
- WebConstruction (3)
- XML|XSD (7)
- Android (0)
- Project-In-Action (9)
- DatabaseDesign (3)
- taglib (7)
- DIV+CSS (10)
- Silverlight (52)
- JSON (7)
- VC++ (8)
- C# (8)
- LINQ (1)
- WCF&SOA (5)
- .NET (20)
- SOA (1)
- Mashup (2)
- RegEx (6)
- Psychology (5)
- Stock (1)
- Google (2)
- Interview (4)
- HTML5 (1)
- Marketing (4)
- Vaadin (2)
- Agile (2)
- Apache-common (6)
- ANTLR (0)
- REST (1)
- HtmlAnalysis (18)
- csv-export (3)
- Nucth (3)
- Xpath (1)
- Velocity (6)
- ASP.NET (9)
- Product (2)
- CSS (1)
最新评论
-
lt26w:
理解成门面模式应该比较容易明白吧
FacadePattern-Java代码实例讲解 -
lt26w:
看下面的例子比较明白.
FacadePattern-Java代码实例讲解 -
javaloverkehui:
这也叫文档,别逗我行吗,也就自己看看。
HtmlCleaner API -
SE_XiaoFeng:
至少也应该写个注释吧。
HtmlCleaner API -
jfzshandong:
...
org.springframework.web.filter.CharacterEncodingFilter 配置
在 Java 语言中, equals() 和 hashCode() 两个函数的使用是紧密配合的,你要是自己设计其中一个,就要设计另外一个。在多数情况下,这两个函数是不用考虑的,直接使用它们的默认设计就可以了。但是在一些情况下,这两个函数最好是自己设计,才能确保整个程序的正常运行。最常见的是当一个对象被加入集合对象( collection object )时,这两个函数必须自己设计。更 细化的定义是:如果你想将一个对象 A 放入另一个 Collection Object B 里,或者使用这个对象 A 为查找一个元对象在 Collection Object B 里位置的 key ,并支持是否容纳,删除 Collection Object B 里的元对象这样的操作,那么, equals() 和 hashCode() 函数必须开发者自己定义。其他情 况下,这两个函数是不需要定义的。
equals():
它是用于进行两个对象的比较的,是对象内容的 比较,当然也能用于进行对象参阅值的比较。什么是对象参阅值的比较?就 是两个参阅变量的值得比较,我们 都知道参阅变量的值其实就是一个数字,这个数字可以看成是鉴别不同对象的代号。两个对象参阅值的比较,就是两个数字的比较,两个代号的比较。这种比较是默 认的对象比较方式,在 Object 这个对象中,这种方式就已经设计好了。所以你也不用自己来重写,浪费不必要的时间。
对象内容的比较才是设计 equals() 的真正目的, Java 语言对 equals() 的要求如下,这些要求是必须遵循的。否则,你就不该浪费时间:
对称性:如果 x.equals(y) 返回是 “true” ,那么 y.equals(x) 也应该返回是 “true” 。
反射性: x.equals(x) 必须返回是 “true” 。
类推性:如果 x.equals(y) 返回是 “true” ,而且 y.equals(z) 返回是 “true” ,那么 z.equals(x) 也应该返回是 “true” 。
还有一致性:如果 x.equals(y) 返回是 “true” ,只要 x 和 y 内容一直不变,不管你重复 x.equals(y) 多少次,返回都是 “true” 。
任何情况下, x.equals(null) ,永远返回是 “false” ; x.equals( 和 x 不同类型的对象 ) 永远返回是 “false” 。
hashCode():
这个函数返回的就是一个用来进行
hash
操作的整型代号,请不要把这个代号和前面所说的参阅变量所代表的代号弄混了。后者不仅仅是个代号还具有在内存中才查找对
象的位置的功能。
hashCode()
所返回的值是用来分类对象在一些特定的
Collection
对象中的位置。这些对象是
HashMap, Hashtable, HashSet
,等等。这个函数和上面的
equals()
函数必须自己设计,用来协助
HashMap, Hashtable, HashSet
,等等对自己所收集的大量对象进行搜寻和定位。
这些
Collection
对象究竟如何工作的,想象每个元对象
hashCode
是一个箱子的
编码,按照编码,每个元对象就是根据
hashCode()
提供的代号归入相应的箱子里。所有的箱子加起来就是一个
HashSet
,
HashMap
,或
Hashtable
对象,我们需要寻找一个元对象时,先看它的代码,就是
hashCode()
返回的整型值,这样我们找到它所在的箱子,然后在箱子里,每
个元对象都拿出来一个个和我们要找的对象进行对比,如果两个对象的内容相等,我们的搜寻也就结束。这种操作需要两个重要的信息,一是对象的
hashCode()
,还有一个是对象内容对比的结果。
hashCode()
的返回值和
equals()
的关系如下:
如果 x.equals(y) 返回 “true” ,那么 x 和 y 的 hashCode() 必须相等。
如果 x.equals(y) 返回 “false” ,那么 x 和 y 的 hashCode() 有可能相等,也有可能不等。
为什么这两个规则是这样的,原因其实很简单,拿
HashSet
来说吧,
HashSet
可以拥有一个或更多的箱子,在同一个箱子中可以有一个
或更多的独特元对象(
HashSet
所容纳的必须是独特的元对象)。这个例子说明一个元对象可以和其他不同的元对象拥有相同的
hashCode
。但是一个
元对象只能和拥有同样内容的元对象相等。所以这两个规则必须成立。
(
在实际的某个集合对象如
HashSet set.contains(object o);
时,是先通过
hashcode()
找到
“
箱子
”
,在根据
equals
判断对象内容
是否相等,从而判断集合对象是否包含某个元对象)
设计这两个函数所要注意到的:
如果你设计的对象类型并不使用于
Collection
对象,那么没有必要自己再设计这两个函数的处理方式。这是正确的面向对象设计方法,任何用户一时用不到的功能,就先不要设计,以免给日后功能扩展带来麻烦。
如果你在设计时想别出心裁,不遵守以上的两套规则,那么劝你还是不要做这样想入非非的事。我还没有遇到过哪一个开发者和我说设计这两个函数要违背前面说的两个规则,我碰到这些违反规则的情况时,都是作为设计错误处理。
当一个对象类型作为 Collection 对象的元对象时,这个对象应该拥有自己处理 equals() ,和 / 或处理 hashCode() 的设计,而且要遵守前面所说 的两种原则。 equals() 先要查 null 和是否是同一类型。查同一类型是为了避免出现 ClassCastException 这样的异常给丢出来。查 null 是为了避免出现 NullPointerException 这样的异常给丢出来。
如果你的对象里面容纳的数据过多,那么这两个函数
equals()
和
hashCode()
将会变得效率低。如果对象中拥有无法
serialized
的数据,
equals()
有可能在操作中出现错误。想象
一个对象
x
,它的一个整型数据是
transient
型(不能被
serialize
成二进制数据流)。然而
equals()
和
hashCode()
都有依靠
这个整型数据,那么,这个对象在
serialization
之前和之后,是否一样?答案是不一样。因为
serialization
之前的整型数据是有效的
数据,在
serialization
之后,这个整型数据的值并没有存储下来,再重新由二进制数据流转换成对象后,两者(对象在
serialization
之前和之后)的状态已经不同了。这也是要注意的。
知道以上这些能够帮助你:
1.
进行更好的设计和开发。
2.
进行更好的测试案例开发。
3.
在面试过程中让面试者对你的学识渊博感到满意。
在 Hibernate 中, POJO 类要重写 hashcode() 方法和 equals() 方法。为什么呢?
1 ,重点是 equals ,重写 hashCode 只是技术要求(为了提高效率)
2 ,为什么要重写 equals 呢,因为在 java 的集合框架中,是通过 equals 来判断两个对象是否相等的
3 ,在 hibernate 中,经常使用 set 集合来保存相关对象,而 set 集合是不允许重复的,但是下面的程序,判断一下运行结果:
Set user = new HashSet();
user.add(new Address("http://hi.baidu.com/yangwen_yw"));
user.add(new Address("http://hi.baidu.com/yangwen_yw"));
System.out.println(user.size());
上面程序的运行结果取决于 Address 类是否重写了 equals 方法。
如果没有重写,默认 equals 是比较地址,那么这两个 address 对象不一样,输出 2 ,意味着 hibernate 会认为这是两个对象,再接下来的持久化过程中可能会出错。
如果重写了 equals ,比如按照主键( address 空间地址)比较,那么这两个对象是一样的,输出 1 。
发表评论
-
关于java.util.concurrent必须知道的5件事(一)
2010-08-10 18:34 1434本文原作者:Ted Neward ... -
Java盲点:双重检查锁定及单例模式
2010-06-17 11:11 3658Peter Haggar , 高级软件工程师, IBM 20 ... -
有关可读性
2010-05-13 15:31 1285Long operatorId = ( Long.val ... -
zzJAVA中用于处理字符串的“三兄弟”
2010-04-18 15:42 1124JAVA 中用于处理 字符 ... -
Java中可以使用 break/continue label 语句来控制多重嵌套循环的跳转
2010-04-16 16:40 3641在Java中可以使用 break/conti ... -
JAVA网络编程Socket常见问题 【长连接专题】
2010-03-18 16:30 11119一. 网络程序运行过程中的常见异常及处理 ... -
利用 Eclipse Visual Editor 项目构建 GUI
2010-02-05 13:51 1421一个用于构建图形接口的图形化工具 ... -
学JAVA必须知道:抽象类与接口的区别
2010-01-26 22:08 840abstract class和interface是Java语言 ... -
利 用xml,解析yahoo天气代码(java)
2010-01-06 15:46 5128利 用xml ... -
scanner
2009-12-30 02:32 1191import java.util.Scanner; publ ... -
java从键盘输入一些字符串,并将字符串保存到一个文件中
2009-12-30 02:23 5189import java.io.*; public class ... -
文件的操作。。。行数据封装
2009-12-30 00:43 1157140100171101 太原市公安局特警支队行政处 ... -
java获取当前目录:java中获取当前类所在的目录
2009-12-30 00:19 19060在学习工作中遇到路 ... -
JAVA中MAP的用法
2009-12-29 23:54 11494Map简介 将键映射到值的对象。一个映射不能包含 ... -
演示java中Map容器的常用功能:
2009-12-29 23:53 1884mport java.util.*; ... -
Map的用途
2009-12-29 23:52 1056Map以按键/数值对的形式存储数据,和数组非常相似,在数组中存 ... -
学生信息管理系统V0.2(使用文件存储数据)【MVC模式、DAO模式、Factory模式】
2009-12-07 10:02 21440.2版更新内容: 1.使用文件存储数据; 2.使用Has ... -
接口VS抽象类
2009-12-06 21:19 1180<!-- <rdf:RDF xmlns: ... -
应用java与flex轻松构建cs程序
2009-12-06 13:59 2618今天发现SmartInvoke这一好东西,拿过来与大家分享分享 ... -
获得系统时间 转换成字符串
2009-11-28 14:27 2873关键字: java 有时候经常用到JAVA 时间转换 如 ...
相关推荐
"Java中equals、hashcode和==的区别" Java 中 equals、hashcode 和==的区别是 Java 编程语言中一个经常遇到的问题。这三个概念都是用来比较对象的,但是它们之间存在着本质的区别。 首先,==号是Java中的一个...
在Java编程语言中,`equals()` 和 `hashCode()` 方法是Object类中的两个核心方法,所有类都默认继承自Object类。这两个方法在处理对象比较和集合操作时起着至关重要的作用。当我们创建自定义类并需要对对象进行精确...
在Java编程语言中,`equals()`和`hashCode()`方法是对象的基本组成部分,它们主要用于对象的比较和存储。这两个方法在`java.lang.Object`类中定义,因此所有的Java类都默认继承了这两个方法。然而,根据具体的应用...
Java中的equals和hashCode方法是两个非常重要的方法,它们都是Object类中的方法。在实际开发中,正确地重写这两个方法对于确保程序的正确性和性能至关重要。下面,我们将详细地介绍Java重写equals及hashCode方法的...
Java重写equals同时需要重写hashCode的代码说明,以及如何重写hashCode方法,此代码演示按照effective java书籍说明的重写思路。代码中演示了使用集合存储对象,并且对象作为key,需重写equals和hashCode.
本文介绍了Java语言不直接支持关联数组,可以使用任何对象作为一个索引的数组,但在根Object类中使用 hashCode()方法明确表示期望广泛使用HashMap。理想情况下基于散列的容器提供有效插入和有效检索;直接在对象模式...
1.概述 2.为什么重写equels方法要重写hashcode方法 3.例子
equals 方法和 hashCode 方法是 Java 语言中两个重要的方法,它们都是在 Object 类中定义的。equals 方法用于比较两个对象是否相等,而 hashCode 方法用于返回对象的哈希码。 在 Java 的 Object 类中,equals 方法...
在 Java 中,Object 类提供了两个重要的方法:equals 方法和 hashCode 方法。这两个方法都是用于比较两个对象是否相等的,但它们的实现机理和作用域却有所不同。 equals 方法是用于比较两个对象是否相同的。它的...
其中,equals和hashCode方法是Java容器集合中两个非常重要的方法,本文将详细介绍这两个方法,并结合ArrayList、Vector和LinkedList三个常见的容器集合。 一、equals方法 equals方法是Java中用于比较两个对象是否...
在Java编程语言中,`hashCode()`和`equals()`方法是非常重要的概念,它们不仅对于深入理解Java内存管理至关重要,也是实现自定义类的关键部分之一。本文将详细介绍这两个方法的工作原理、使用场景以及它们之间的关系...
在Java编程语言中,`equals()`方法和`hashCode()`方法是两个非常重要的概念,它们主要用于对象的比较和哈希表的高效运作。本解析将深入探讨这两个方法的用途、实现原理以及它们之间的关联。 首先,`equals()`方法是...
在Java编程语言中,`equals()` 和 `hashCode()` 方法是两个非常重要的成员,尤其是在处理对象比较和集合操作时。这两个方法通常与`Object`类中的默认实现相关联,但为了在实际开发中实现正确的对象比较和哈希表操作...
Java 中的 hashCode 和 equals 方法详解 本文详细介绍了 Java 中的 hashCode 和 equals 方法,探讨了这两个方法的作用、实现机制和使用场景。通过对 hashCode 和 equals 方法的深入分析,我们可以更好地理解 Java ...
在Java编程语言中,`equals()`, `hashCode()` 和 `toString()` 是三个非常重要的方法,它们主要用于对象的比较、哈希存储以及打印对象信息。这三个方法是Java对象的基础特性,对于理解和开发高质量的Java程序至关...
在Java编程语言中,`equals()` 和 `hashCode()` 方法是对象的基本组成部分,它们在很多场景下都发挥着至关重要的作用。这两个方法与对象的相等性比较和哈希表(如HashMap、HashSet)的运作紧密相关。这篇博客将深入...
Java中的equals()和hashCode()方法详解 Java中的equals()和hashCode()方法是两个重要的方法,它们都是从Object类中继承过来的。equals()方法用于比较两个对象的值是否相等,而hashCode()方法用于计算对象的哈希码。...
Java 中的每个对象都有 hashCode() 和 equals() 方法,这两个方法的正确实现对于 Java 开发人员来说是非常重要的。本文将详细介绍 hashCode() 和 equals() 的本质区别和联系,并探讨在创建 Java 类时如何定义这些...
在Java编程语言中,`equals()` 和 `hashCode()` 方法是Object类中定义的基本方法,所有类都默认继承自Object类,因此每个Java对象都有这两个方法。这两个方法在处理集合类,尤其是Set接口的实现(如HashSet)时起着...