- 浏览: 369270 次
- 性别:
- 来自: 成都
文章分类
最新评论
-
tuspark:
关于javadoc这里讲解的更全面:《javadoc设置》。
Eclipse中生成javadoc【Z】 -
yuexiang1007:
帮我解决了问题,谢谢!!!
java.math.BigInteger使用心得总结 -
netwelfare:
个人感觉,文章对HashMap的遍历分析的有点浅,不如这里的介 ...
HashMap遍历的两种方式【Z】 -
memoryisking:
关于java.math.BigInteger讲解在这里可以看到 ...
java.math.BigInteger使用心得总结 -
巴尾的兔兔帅:
divide应该是除吧?不是减。dividepublic Bi ...
java.math.BigInteger使用心得总结
1.
何时需要重写
equals()
当一个类有自己特有的“逻辑相等”概念(不同于对象身份的概念)。
2.
设计
equals()
[1]
使用
instanceof
操作符检查“实参是否为正确的类型”。
[2]
对于类中的每一个“关键域”,检查实参中的域与当前对象中对应的域值。
[2.1]
对于非
float
和
double
类型的原语类型域,使用
==
比较;
[2.2]
对于对象引用域,递归调用
equals
方法;
[2.3]
对于
float
域,使用
Float.floatToIntBits
(
afloat
)
转换为
int
,再使用
==
比较;
[2.4]
对于
double
域,使用
Double.doubleToLongBits
(
adouble
)
转换为
int
,再使用
==
比较;
[2.5]
对于数组域,调用
Arrays.equals
方法。
3.
当改写
equals()
的时候,总是要改写
hashCode()
根据一个类的
equals
方法(改写后),两个截然不同的实例有可能在逻辑上是相等的,但是,根据
Object.hashCode
方法,它们仅仅是两个对象。因此,违反了“相等的对象必须具有相等的散列码”。
4.
设计
hashCode()
[1]
把某个非零常数值,例如
17
,保存在
int
变量
result
中;
[2]
对于对象中每一个关键域
f
(指
equals
方法中考虑的每一个域):
[2.1]boolean
型,计算
(f ? 0 : 1);
[2.2]byte,char,short
型,计算
(int);
[2.3]long
型,计算
(int) (f ^ (f>>>32));
[2.4]float
型,计算
Float.floatToIntBits
(
afloat
)
;
[2.5]double
型,计算
Double.doubleToLongBits
(
adouble
)
得到一个
long
,再执行
[2.3];
[2.6]
对象引用,递归调用它的
hashCode
方法
;
[2.7]
数组域,对其中每个元素调用它的
hashCode
方法。
[3]
将上面计算得到的散列码保存到
int
变量
c
,然后执行
result=37*result+c;
[4]
返回
result
。
5.
示例
下面的这个类遵循上面的设计原则,重写了类的
equals()
和
hashCode()
。
package
com.zj.unit;
import
java.util.Arrays;
public
class
Unit {
private
short
ashort
;
private
char
achar
;
private
byte
abyte
;
private
boolean
abool
;
private
long
along
;
private
float
afloat
;
private
double
adouble
;
private
Unit
aObject
;
private
int
[]
ints
;
private
Unit[]
units
;
public
boolean
equals(Object o) {
if
(!(o
instanceof
Unit))
return
false
;
Unit unit = (Unit) o;
return
unit.
ashort
==
ashort
&& unit.
achar
==
achar
&& unit.
abyte
==
abyte
&& unit.
abool
==
abool
&& unit.
along
==
along
&& Float.floatToIntBits
(unit.
afloat
) == Float
.floatToIntBits
(
afloat
)
&& Double.doubleToLongBits
(unit.
adouble
) == Double
.doubleToLongBits
(
adouble
)
&& unit.
aObject
.equals(
aObject
)
&& equalsInts(unit.
ints
)
&& equalsUnits(unit.
units
);
}
private
boolean
equalsInts(
int
[] aints) {
return
Arrays.equals
(
ints
, aints);
}
private
boolean
equalsUnits(Unit[] aUnits) {
return
Arrays.equals
(
units
, aUnits);
}
public
int
hashCode() {
int
result = 17;
result = 37 * result + (
int
)
ashort
;
result = 37 * result + (
int
)
achar
;
result = 37 * result + (
int
)
abyte
;
result = 37 * result + (
abool
? 0 : 1);
result = 37 * result + (
int
) (
along
^ (
along
>>>
32));
result = 37 * result + Float.floatToIntBits
(
afloat
);
long
tolong = Double.doubleToLongBits
(
adouble
);
result = 37 * result + (
int
) (tolong ^
(tolong >>> 32));
result = 37 * result +
aObject
.hashCode();
result = 37 * result + intsHashCode(
ints
);
result = 37 * result + unitsHashCode(
units
);
return
result;
}
private
int
intsHashCode(
int
[] aints) {
int
result = 17;
for
(
int
i = 0; i < aints.
length
; i++)
result = 37 * result + aints[i];
return
result;
}
private
int
unitsHashCode(Unit[] aUnits) {
int
result = 17;
for
(
int
i = 0; i < aUnits.
length
; i++)
result = 37 * result +
aUnits[i].hashCode();
return
result;
}
}
发表评论
-
JSTL中的<c:标签【Z】
2011-08-31 20:48 1146Taglib 伪指令 Java代码 ... -
java接口嵌套【Z】
2011-05-18 17:09 1342在Java语言中,接口可以嵌套在类或其它接口中。由于Jav ... -
JMF安装【Z】
2011-05-07 20:52 1094下载并安装JMF 在MyEclipse中选择 窗口/首选项/ ... -
javaMail【Z】
2011-04-18 16:12 1078commons-email-1.1.jar: 这是Apache ... -
java生成PDF文件【Z】
2011-01-14 15:03 1211如果应用程序需要动态 ... -
字符集编码【Z】
2010-12-29 18:54 893问题研究 --字符集 ... -
java常用第三方jar包【Z】
2010-12-26 22:39 3360commons-digester.jar Digeste ... -
不使用JNI获得系统信息【Z】
2010-12-22 13:28 589在Java中,可以获得总的物理内存、剩余的物理内存、已使用的物 ... -
java获得当前路径【Z】
2010-12-18 14:37 9421、利用System.getProperty()函数获取当前路 ... -
java容器类-1【Z】
2010-12-17 21:43 1013对象的集合 如果程序的对象数量有限 ... -
java UIManager的风格【Z】
2010-12-17 12:28 2671Java'中的几种Look and Feel 1、Met ... -
serialVersionUID的作用和意义【Z】
2010-12-15 10:38 1553在Java中,软件的兼容性是一个大问题,尤其在使用到对象串行性 ... -
HashMap遍历的两种方式【Z】
2010-12-07 18:42 968HashMap遍历的两种方式 ... -
23个经典JDK设计模式——系统JDK使用设计模式的例子【Z】
2010-12-05 21:33 1030酷壳 版主陈皓近日发表博文《JDK里的设计模式 》,文中他 ... -
String/StringBuffer/StringBuild【Z】
2010-11-12 14:10 1346[编辑] String,StringBuffer和String ... -
tomcat中web.xml详解【Z】
2010-10-18 14:47 9251 定义头和根元素 部 ... -
Java 理论与实践: 线程池与工作队列【Z】
2010-10-18 09:45 932线程池有助于实现最 ... -
单例模式完全剖析【Z】
2010-10-17 22:48 790Buildfile: build.xml ... -
在MyEclipse中直接查看class文件(在没有源码的情况下)【Z】
2010-10-17 22:04 1309想直接在myeclipse中查看class文件,就像查看普通的 ... -
HashMap实现及冲突【Z】
2010-10-12 21:41 962了解 HashMap 原理对于日后的缓存机制多少有 ...
相关推荐
在Java编程语言中,`equals()`方法和`hashCode()`方法是两个非常重要的概念,它们主要用于对象的比较和哈希表的高效运作。本解析将深入探讨这两个方法的用途、实现原理以及它们之间的关联。 首先,`equals()`方法是...
在 Java 中,每个对象都有一个 Hash Code,它可以通过 hashCode() 方法获取。Hash Code 是一个整数值,它可以用于比较对象的相等性。 那么,Hash Code重复的可能性是从何而来的? Hash Code 重复的可能性来自于 ...
在Java编程语言中,`equals()` 和 `hashCode()` 方法是对象的基本组成部分,它们在很多场景下都发挥着至关重要的作用。这两个方法与对象的相等性比较和哈希表(如HashMap、HashSet)的运作紧密相关。这篇博客将深入...
Java中的equals()和hashCode()方法详解 Java中的equals()和hashCode()方法是两个重要的方法,它们都是从Object类中继承过来的。equals()方法用于比较两个对象的值是否相等,而hashCode()方法用于计算对象的哈希码。...
在Java编程语言中,`hashCode()`方法是每个对象都继承自`Object`类的一个关键方法。这个方法的主要目的是为对象生成一个整数哈希码,通常用于存储和检索对象时提高性能,特别是在使用哈希表(如`HashMap`、`HashSet`...
在 Java 编程语言中,Object 类是所有类的父类,但是在实际开发中,我们往往需要重写 Object 中的 equals 和 hashCode 方法,以便正确地比较对象的逻辑内容,而不是内存地址。下面我们将详细地解释为什么需要重写这...
其中,equals和hashCode方法是Java容器集合中两个非常重要的方法,本文将详细介绍这两个方法,并结合ArrayList、Vector和LinkedList三个常见的容器集合。 一、equals方法 equals方法是Java中用于比较两个对象是否...
深入解析Java对象的equals()和hashCode()的使用 在Java语言中,equals()和hashCode()两个函数的使用是紧密配合的,你要是自己设计其中一个,就要设计另外一个。在多数情况下,这两个函数是不用考虑的,直接使用它们...
### Java中`hashCode()`与`equals()`方法详解 #### 前言 在Java编程语言中,`hashCode()`和`equals()`方法是非常重要的概念,它们主要用于处理对象的唯一标识和对象之间的相等性判断。正确地实现这两个方法对于确保...
`hashCode()`方法是每个Java对象的成员,继承自`Object`类。当对象被用作哈希表(如HashMap或HashSet)中的键时,哈希码用于定位对象在表中的位置。两个相等的对象(根据`equals()`方法定义)必须具有相同的哈希码,...
在Java编程语言中,`equals()` 和 `hashCode()` 方法是两个非常重要的概念,尤其是在对象比较和数据结构(如哈希表)中。`equals()` 方法用于判断两个对象是否相等,而 `hashCode()` 方法则与对象的哈希值有关,这...
在Java编程语言中,`equals()` 和 `hashCode()` 方法是两个非常重要的概念,尤其是在处理对象比较和哈希表(如 `HashMap` 和 `HashSet`)时。`equals()` 方法用于判断两个对象是否相等,而 `hashCode()` 方法则用于...
在深入探讨`hashCode`方法之前,我们需要了解Java集合框架的基本概念。Java集合框架主要包括两大类集合:`List`和`Set`。 - **List**:这是一个有序集合,允许元素重复。 - **Set**:这是一个不允许元素重复的无序...
在Java编程语言中,`equals()`和`hashCode()`方法是两个至关重要的概念,它们与对象的比较和哈希表操作紧密相关。理解这两个方法的工作原理及其契约是成为一名熟练的Java开发者所必需的。 首先,`equals()`方法是...
### Java中equals方法隐藏的陷阱 在Java编程中,正确实现`equals`方法至关重要,它不仅影响对象的比较逻辑,还直接关系到集合类(如`HashSet`、`HashMap`等)的行为。本文将深入探讨Java中`equals`方法的一些常见...
在Java编程语言中,`equals()` 和 `hashCode()` 方法是两个非常重要的成员,尤其是在处理对象比较和集合操作时。这两个方法通常与`Object`类中的默认实现相关联,但为了在实际开发中实现正确的对象比较和哈希表操作...
在Java编程语言中,`hashCode()` 和 `equals()` 方法是两个非常重要的概念,它们主要用于对象的比较和哈希表操作。这两个方法在处理自定义类时尤其重要,因为它们直接影响到对象的比较逻辑和存储效率。 `hashCode()...