- 浏览: 567855 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (267)
- 随笔 (4)
- Spring (13)
- Java (61)
- HTTP (3)
- Windows (1)
- CI(Continuous Integration) (3)
- Dozer (1)
- Apache (11)
- DB (7)
- Architecture (41)
- Design Patterns (11)
- Test (5)
- Agile (1)
- ORM (3)
- PMP (2)
- ESB (2)
- Maven (5)
- IDE (1)
- Camel (1)
- Webservice (3)
- MySQL (6)
- CentOS (14)
- Linux (19)
- BI (3)
- RPC (2)
- Cluster (9)
- NoSQL (7)
- Oracle (25)
- Loadbalance (7)
- Web (5)
- tomcat (1)
- freemarker (1)
- 制造 (0)
最新评论
-
panamera:
如果设置了连接需要密码,Dynamic Broker-Clus ...
ActiveMQ 集群配置 -
panamera:
请问你的最后一种模式Broker-C节点是不是应该也要修改持久 ...
ActiveMQ 集群配置 -
maosheng:
longshao_feng 写道楼主使用 文件共享 模式的ma ...
ActiveMQ 集群配置 -
longshao_feng:
楼主使用 文件共享 模式的master-slave,produ ...
ActiveMQ 集群配置 -
tanglanwen:
感触很深,必定谨记!
少走弯路的十条忠告
import java.util.Date;
class Dog{
private String name;
private Date birthday;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
}
public class Cat {
/**Cat类中含有name和birthday两私有成员变量,且重写了equals方法和hashCode方法
*
* @param name 和 birthday
*
*/
private String name;
private Date birthday;
public Cat(){}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
/*
* 重写equals必须注意:
* 1 自反性:对于任意的引用值x,x.equals(x)一定为true
* 2 对称性:对于任意的引用值x 和 y,当x.equals(y)返回true,y.equals(x)也一定返回true
* 3 传递性:对于任意的引用值x、y和z,如果x.equals(y)返回true,并且y.equals(z)也返回true,那么x.equals(z)也一定返 回 true
* 4 一致性:对于任意的引用值x 和 y,如果用于equals比较的对象信息没有被修改,多次调用x.equals(y)要么一致地返回true,要么一致地返回false
* 5 非空性:对于任意的非空引用值x,x.equals(null)一定返回false
*
* 请注意:
* 重写equals方法后最好重写hashCode方法,否则两个等价对象可能得到不同的hashCode,这在集合框架中使用可能产生严重后果
*/
/*
* 1.重写equals方法修饰符必须是public,因为是重写的Object的方法.
* 2.参数类型必须是Object.
*/
public boolean equals(Object other){ //重写equals方法,后面最好重写hashCode方法
if(this == other) //先检查是否其自反性,后比较other是否为空。这样效率高
return true;
if(other == null)
return false;
if( !(other instanceof Cat))
return false;
final Cat cat = (Cat)other;
if( !getName().equals(cat.getName()))
return false;
if( !getBirthday().equals(cat.getBirthday()))
return false;
return true;
}
public int hashCode(){ //hashCode主要是用来提高hash系统的查询效率。当hashCode中不进行任何操作时,可以直接让其返回 一常数,或者不进行重写。
int result = getName().hashCode();
result = 29 * result +getBirthday().hashCode();
return result;
//return 0;
}
public static void main(String[] args) {
Date dayA = new Date(4000000);
Cat a = new Cat();
a.setName("a");
a.setBirthday(dayA);
Date dayB = new Date(1000000);
Cat b = new Cat();
b.setName("a");
b.setBirthday(dayB);
Date dayC = dayA;
Cat c = new Cat();
c.setName("a");
c.setBirthday(dayC);
Date dayE = dayA;
Cat e = new Cat();
e.setName(a.getName());
e.setBirthday(a.getBirthday());
Date dayD = dayC;
Dog d = new Dog();
d.setName("a");
d.setBirthday(dayD);
System.out.println(a.equals(b)); //调用自己类中所定义的equals方法
System.out.println(a.equals(a));
System.out.println(a.equals(c));
System.out.println(d.equals(a));
System.out.println(a.equals(d)); //验证重写equals的对称性
System.out.println(a.equals(e));
System.out.println(e.equals(c)); //验证重写equals的传递性
System.out.println(d.getName().equals(a.getName())); //调用Object类中equals方法
System.out.println(d.getBirthday().equals(b.getBirthday()));
System.out.println("比较hanshCode的值");
/*
* * 比较hashCode方法中返回的值
* 如果equals返回为true,则hashCode一定返回true。
* 如果equals返回为false,hashCode返回值不一定不相同。
* 如果hashCode返回值不同,则equals返回值一定为false。
* 如果hashCode返回值不同,则equals返回值不一定为false。
*/
System.out.println(a.hashCode());
System.out.println(b.hashCode());
System.out.println(a.hashCode()== b.hashCode()); //如果equals返回false,则各hashCode不一定返回不同值
System.out.println(a.hashCode() == c.hashCode());
}
}
class Dog{
private String name;
private Date birthday;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
}
public class Cat {
/**Cat类中含有name和birthday两私有成员变量,且重写了equals方法和hashCode方法
*
* @param name 和 birthday
*
*/
private String name;
private Date birthday;
public Cat(){}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
/*
* 重写equals必须注意:
* 1 自反性:对于任意的引用值x,x.equals(x)一定为true
* 2 对称性:对于任意的引用值x 和 y,当x.equals(y)返回true,y.equals(x)也一定返回true
* 3 传递性:对于任意的引用值x、y和z,如果x.equals(y)返回true,并且y.equals(z)也返回true,那么x.equals(z)也一定返 回 true
* 4 一致性:对于任意的引用值x 和 y,如果用于equals比较的对象信息没有被修改,多次调用x.equals(y)要么一致地返回true,要么一致地返回false
* 5 非空性:对于任意的非空引用值x,x.equals(null)一定返回false
*
* 请注意:
* 重写equals方法后最好重写hashCode方法,否则两个等价对象可能得到不同的hashCode,这在集合框架中使用可能产生严重后果
*/
/*
* 1.重写equals方法修饰符必须是public,因为是重写的Object的方法.
* 2.参数类型必须是Object.
*/
public boolean equals(Object other){ //重写equals方法,后面最好重写hashCode方法
if(this == other) //先检查是否其自反性,后比较other是否为空。这样效率高
return true;
if(other == null)
return false;
if( !(other instanceof Cat))
return false;
final Cat cat = (Cat)other;
if( !getName().equals(cat.getName()))
return false;
if( !getBirthday().equals(cat.getBirthday()))
return false;
return true;
}
public int hashCode(){ //hashCode主要是用来提高hash系统的查询效率。当hashCode中不进行任何操作时,可以直接让其返回 一常数,或者不进行重写。
int result = getName().hashCode();
result = 29 * result +getBirthday().hashCode();
return result;
//return 0;
}
public static void main(String[] args) {
Date dayA = new Date(4000000);
Cat a = new Cat();
a.setName("a");
a.setBirthday(dayA);
Date dayB = new Date(1000000);
Cat b = new Cat();
b.setName("a");
b.setBirthday(dayB);
Date dayC = dayA;
Cat c = new Cat();
c.setName("a");
c.setBirthday(dayC);
Date dayE = dayA;
Cat e = new Cat();
e.setName(a.getName());
e.setBirthday(a.getBirthday());
Date dayD = dayC;
Dog d = new Dog();
d.setName("a");
d.setBirthday(dayD);
System.out.println(a.equals(b)); //调用自己类中所定义的equals方法
System.out.println(a.equals(a));
System.out.println(a.equals(c));
System.out.println(d.equals(a));
System.out.println(a.equals(d)); //验证重写equals的对称性
System.out.println(a.equals(e));
System.out.println(e.equals(c)); //验证重写equals的传递性
System.out.println(d.getName().equals(a.getName())); //调用Object类中equals方法
System.out.println(d.getBirthday().equals(b.getBirthday()));
System.out.println("比较hanshCode的值");
/*
* * 比较hashCode方法中返回的值
* 如果equals返回为true,则hashCode一定返回true。
* 如果equals返回为false,hashCode返回值不一定不相同。
* 如果hashCode返回值不同,则equals返回值一定为false。
* 如果hashCode返回值不同,则equals返回值不一定为false。
*/
System.out.println(a.hashCode());
System.out.println(b.hashCode());
System.out.println(a.hashCode()== b.hashCode()); //如果equals返回false,则各hashCode不一定返回不同值
System.out.println(a.hashCode() == c.hashCode());
}
}
发表评论
-
java 类的加载 以及 ClassLoader
2020-04-16 09:43 474Class Loader 类加载器: 类加载器负责加载 ... -
Stack 的实现原理深入剖析
2020-04-06 13:26 494Stack 介绍: Stack是栈。 ... -
Vector 的实现原理深入剖析
2020-04-06 13:17 370Vector介绍: Vector 是矢量队列,它是JDK1. ... -
JDK 分析工具
2020-04-05 17:30 387常用分析工具: jps:显示指定系统中所有的HotSpot虚 ... -
二叉树的深度优先遍历和广度优先遍历
2020-03-10 09:33 617概述: 1、深度优先遍历(Depth-First-Sear ... -
Hashtable 的实现原理深入剖析
2020-02-18 20:59 563一、Hashtable的基本方法: 1、定义: HashT ... -
jdk 1.8 新特性
2020-02-17 13:43 3831、default关键字 ... -
Java IO 架构
2019-11-11 16:39 354主要两类: 磁盘I/O 网络I/O 基于字节 ... -
Java 数据结构与算法
2019-04-03 10:25 526程序=数据结构+算法 ... -
Java语言异常(Exception)
2018-10-09 11:40 554异常,是Java中非常常用 ... -
Java并发问题--乐观锁与悲观锁以及乐观锁的一种实现方式-CAS
2018-08-17 09:47 1477首先介绍一些乐观锁与 ... -
Java 高性能编程注意事项
2016-11-17 09:55 6511. 尽量在合适的场合使用单例 使用单例可以减轻加载的负担, ... -
Netty 解析
2017-03-07 13:47 1227Linux网络IO模型: Linux ... -
2016年Java 面试题总结
2016-01-18 13:34 54798多线程、并发及线程的基础问题: 1)Java 中能创建 vo ... -
java 内存模型
2015-12-29 13:44 821JAVA内存模型: Java内存 ... -
JVM 深入剖析
2015-12-29 12:51 1100JVM是JAVA虚拟机(JAVA Virtual Machin ... -
Java 并发编程_Synchronized
2015-12-16 12:42 874硬件的效率和一致性: 由于计算机的运算速度和它的存储和通讯子 ... -
Java 并发编程_Volatile
2015-12-15 13:42 622术语定义: 共享变量:在多个线程之间能够被共享的变量被称为共 ... -
Java 并发编程_ConcurrentLinkedQueue
2015-12-15 13:32 912ConcurrentLinkedQueue 的分析和使用: ... -
Java 并发编程_ConcurrentHashMap
2015-11-10 11:30 835ConcurrentHashMap 的分析和 ...
相关推荐
Java重写equals同时需要重写hashCode的代码说明,以及如何重写hashCode方法,此代码演示按照effective java书籍说明的重写思路。代码中演示了使用集合存储对象,并且对象作为key,需重写equals和hashCode.
总的来说,理解并正确地重写 `equals()` 和 `hashCode()` 方法是Java编程中的基础技能,它有助于确保对象的比较和集合操作的正确性。在开发过程中,要时刻注意这两个方法的正确实现,以提高代码质量和可维护性。
在Java编程语言中,`equals()` 和 `hashCode()` 方法是对象的基本组成部分,它们在很多场景下都发挥着至关重要的作用。这两个方法与对象的相等性比较和哈希表(如HashMap、HashSet)的运作紧密相关。这篇博客将深入...
第二种情况:对于采用哈希算法的集合,集合中对象必须重写 hashCode 方法,同时也要重写 equals 方法。这是因为哈希算法需要使用 hashCode 方法来计算对象的哈希值,而 equals 方法用于判断两个对象是否相等。 如何...
"Java重写equals及hashcode方法流程解析" Java中的equals和hashCode方法是两个非常重要的方法,它们都是Object类中的方法。在实际开发中,正确地重写这两个方法对于确保程序的正确性和性能至关重要。下面,我们将...
在Java编程语言中,`equals()` 和 `hashCode()` 是两个非常重要的方法,它们主要用于比较对象的平等性以及在散列数据结构(如 `HashMap`、`HashSet` 等)中的对象定位。当我们创建自定义类时,有时需要根据业务需求...
在 Java 中,Object 类提供了两个重要的方法:equals 方法和 hashCode 方法。这两个方法都是用于比较两个对象是否相等的,但它们的实现机理和作用域却有所不同。 equals 方法是用于比较两个对象是否相同的。它的...
在 Java 中,重写 equals() 方法和 hashCode() 方法是非常重要的,它们可以确保对象的比较和标识正确。如果我们违反了这两个方法的规则,那么可能会产生理解的不一致。因此,在编写 Java 代码时,需要严格遵守这两个...
"Java中equals、hashcode和==的区别" Java 中 equals、hashcode 和==的区别是 Java 编程语言中一个经常遇到的问题。这三个概念都是用来比较对象的,但是它们之间存在着本质的区别。 首先,==号是Java中的一个...
在Java编程语言中,`equals()`和`hashCode()`方法是对象的基本组成部分,它们主要用于对象的比较和存储。这两个方法在`java.lang.Object`类中定义,因此所有的Java类都默认继承了这两个方法。然而,根据具体的应用...
在Java编程语言中,`equals()`方法和`hashCode()`方法是两个非常重要的概念,它们主要用于对象的比较和哈希表的高效运作。本解析将深入探讨这两个方法的用途、实现原理以及它们之间的关联。 首先,`equals()`方法是...
其中,equals和hashCode方法是Java容器集合中两个非常重要的方法,本文将详细介绍这两个方法,并结合ArrayList、Vector和LinkedList三个常见的容器集合。 一、equals方法 equals方法是Java中用于比较两个对象是否...
在Java编程中,`equals()` 和 `hashCode()` 方法是Object类中的两个重要方法,它们在处理对象相等性以及在哈希表(如HashSet、HashMap)中起到关键作用。当自定义类时,有时需要根据业务逻辑重写这两个方法以满足...
为什么重写equals方法,还必须要重写hashcode方法
在Java编程语言中,`equals()` 和 `hashCode()` 方法是对象身份验证和哈希表操作的关键组成部分。当我们在自定义类中重写 `equals()` 方法时,通常也需要重写 `hashCode()` 方法,这是为了遵循一些重要的原则和保证...
在Java编程语言中,`equals()`和`hashCode()`方法是两个至关重要的概念,它们与对象的比较和哈希表操作紧密相关。理解这两个方法的工作原理及其契约是成为一名熟练的Java开发者所必需的。 首先,`equals()`方法是...
在 TestEqualsHashCode.java 文件中,通常会包含一个示例,演示如何正确地重写 `equals()` 和 `hashCode()` 方法。这个文件可能包含一个自定义类,并展示如何根据类的属性定义这两个方法,以实现特定的比较逻辑。 ...
3. **兼容数据结构**:许多Java集合框架中的数据结构(如HashSet、HashMap)依赖于对象的`equals`和`hashCode`方法来判断元素的唯一性。如果未正确重写`equals`方法,这些数据结构可能会出现异常行为。 #### 三、...
Java中的equals()和hashCode()方法详解 Java中的equals()和hashCode()方法是两个重要的方法,它们都是从Object类中继承过来的。equals()方法用于比较两个对象的值是否相等,而hashCode()方法用于计算对象的哈希码。...
在Java编程语言中,`equals()` 和 `hashCode()` 方法对于对象的比较和处理至关重要,特别是在集合框架中。这两个方法有着紧密的联系,因为它们在决定对象是否相等以及如何存储和检索对象时起到关键作用。 首先,让...