`
编程足球
  • 浏览: 257723 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

java 基础之(equals hashcode)

    博客分类:
  • java
 
阅读更多
1.equals 的等价关系


2. 重新equals 的具体方法





3. 对应修改hashcode方法








具体的例子
/**
 * 
 */
package com.study.effective;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
/**   
 * 
 * @className :EqualsTest  
 * @package : com.study.effective 
 * @Description :effective Java 中关于equals的介绍  
 * @author:lgf   
 * @date :2012 一月 18  11:27:04          
 * @version : 1.0
 */
public class EqualsTest {
	private int hashCode;
	private String strValue;
	private boolean booleanValue;
	private long longValue;
	private int intValue;
	private double doubleValue;
	private float floatValue;
	private String [] arr;
	private EqualsTest objField;
	
	public EqualsTest(){
		
	}
	
	public EqualsTest(String strValue,int intValue){
		this.strValue = strValue;
		this.intValue = intValue;
	}
	/**
	 * 重写equals方法
	 * 对称,传递,一致
	 */
	@Override
	public boolean equals(Object obj) {
		//1. 判断是否是本身对象的引用
		if (this == obj) {
			return true;
		}
		//2. 判断是否就是本身对象的类型
		if(!(obj instanceof EqualsTest)){
			return false;
		}
		
		//3. 把参数转换成正确的类型,前面已经进行判断过了,所以肯定可以判断成功
		EqualsTest temp = (EqualsTest)obj;
		
		//4. 根据每个关键参数进行判断是否相等
		//   就是你自己的判断依据
		
		// return 	(this.strValue == temp.strValue)&&
		//			(this.booleanValue == temp.booleanValue)&&
		//			(this.intValue == temp.intValue) && 
		//			(Double.compare(this.doubleValue, temp.doubleValue) == 0)&&
		//			(Float.compare(this.floatValue, temp.floatValue) == 0) &&
		//			(Arrays.equals(this.arr, temp.arr))&&
		//			((this.objField == temp.objField) || (this.objField != null && this.objField.equals(temp.objField)))
		
		//4-1 基本数据类型(除了 double 和 float) 直接用 == 进行判断
		if (this.strValue != temp.strValue) { 
			return false;
		}
		
		if (this.booleanValue != temp.booleanValue) { 
			return false;
		}
		
		if (this.longValue != temp.longValue) { 
			return false;
		}
		
		if (this.intValue != temp.intValue) {
			return false;
		}
		
		//4-2double 类型数据可以通过Double.compare 进行判断  相等就== 0
		if (Double.compare(this.doubleValue, temp.doubleValue) != 0) {
			return false;
		}
		
		//4-3float 类型数据可以通过Float.compare 进行判断  相等就== 0
		if (Float.compare(this.floatValue, temp.floatValue) != 0) {
			return false;
		}
		
		//4-4 数组可以通过这个进行判断
		if (!Arrays.equals(this.arr, temp.arr)) {
			return false;
		}
		
		//4-5 如果是对象则可以通过这个进行判断
		if(!((this.objField == temp.objField) || (this.objField != null && this.objField.equals(temp.objField)))){
			return false;
		}
		return true;
	}
	
	
	/**
	 * 重写equals方法同时也要重写hashCode
	 * 每个对象的散列码
	 */
	@Override
	public int hashCode() {
		int result = hashCode;
		if (result == 0) {
			result = 1;
			result = 31 * result + this.intValue;  // byte,char, short, int  计算 (int)value
			result = 31 * result + (this.booleanValue ? 1 : 0); // boolean 计算 (value ? 1 : 0)
			result = 31 * result + (int)(this.longValue^(this.longValue>>>32));// long 计算 (value ^ (value>>>32))
			result = 31 * result + Float.floatToIntBits(this.floatValue); // float 计算 (value ? 1 : 0)
			result = 31 * result + (int)(Double.doubleToLongBits(this.doubleValue)^(Double.doubleToLongBits(this.doubleValue)>>>32));// 先转换成long 在转成int
			result = 31 * result + Arrays.hashCode(this.arr); // 数组hashcode获得
			result = 31 * result + (this.objField == null ? 0 : this.objField.hashCode());// 对象的hashcode获得
			hashCode = result;
		}
		return hashCode;
	}



	public static void main(String[] args) {
		EqualsTest e3 = new EqualsTest("e",0);
		EqualsTest e4 = new EqualsTest("e",0);
		//Map 把每个项相关的散列码缓存起来,如果散列码不匹配,就不必检查对象的相同性
		Map<EqualsTest, String> map = new HashMap<EqualsTest, String>();
		map.put(e3, "e3"); // 保存数据的时候就计算hashCode了
		System.out.println(map.get(e4));
		
	}
	
}

  • 大小: 66.8 KB
  • 大小: 257.1 KB
  • 大小: 123.7 KB
  • 大小: 101.6 KB
  • 大小: 276.3 KB
  • 大小: 178.8 KB
分享到:
评论

相关推荐

    Java重写equals同时需要重写hashCode的代码说明

    Java重写equals同时需要重写hashCode的代码说明,以及如何重写hashCode方法,此代码演示按照effective java书籍说明的重写思路。代码中演示了使用集合存储对象,并且对象作为key,需重写equals和hashCode.

    java 举例分析 equals hashcode 基本类型与基本对象的比较 shot与Short int与Integer long与Long

    举例分析 equals 和 hashcode 方法,hashcode应该怎么样生成 8个基本类型与基本对象的比较:byte与Byte shot与Short int与Integer long与Long float与Float double与Double char与Character

    Java中equals,hashcode和==的区别

    "Java中equals、hashcode和==的区别" Java 中 equals、hashcode 和==的区别是 Java 编程语言中一个经常遇到的问题。这三个概念都是用来比较对象的,但是它们之间存在着本质的区别。 首先,==号是Java中的一个...

    Java_重写equals()和hashCode()

    在Java编程语言中,`equals()` 和 `hashCode()` 方法是对象的基本组成部分,它们在很多场景下都发挥着至关重要的作用。这两个方法与对象的相等性比较和哈希表(如HashMap、HashSet)的运作紧密相关。这篇博客将深入...

    Java重写equals及hashcode方法流程解析

    "Java重写equals及hashcode方法流程解析" Java中的equals和hashCode方法是两个非常重要的方法,它们都是Object类中的方法。在实际开发中,正确地重写这两个方法对于确保程序的正确性和性能至关重要。下面,我们将...

    重写equals和hashcode方法_equals_重写equals和hashcode方法_

    总的来说,理解并正确地重写 `equals()` 和 `hashCode()` 方法是Java编程中的基础技能,它有助于确保对象的比较和集合操作的正确性。在开发过程中,要时刻注意这两个方法的正确实现,以提高代码质量和可维护性。

    解析Java对象的equals()和hashCode()的使用

    深入解析Java对象的equals()和hashCode()的使用 在Java语言中,equals()和hashCode()两个函数的使用是紧密配合的,你要是自己设计其中一个,就要设计另外一个。在多数情况下,这两个函数是不用考虑的,直接使用它们...

    Java中的equals和hashCode方法详解1

    在Java编程语言中,`equals()`和`hashCode()`方法是对象的基本组成部分,它们主要用于对象的比较和存储。这两个方法在`java.lang.Object`类中定义,因此所有的Java类都默认继承了这两个方法。然而,根据具体的应用...

    Java理论与实践:hashCode()和equals()方法

    本文介绍了Java语言不直接支持关联数组,可以使用任何对象作为一个索引的数组,但在根Object类中使用 hashCode()方法明确表示期望广泛使用HashMap。理想情况下基于散列的容器提供有效插入和有效检索;直接在对象模式...

    Java容器集合(equals 和 hashCode+基础数据结构+ArrayList+Vector和LinkedList)

    Java容器集合(equals和hashCode+基础数据结构+ArrayList+Vector和LinkedList) Java容器集合是Java中的一种基础数据结构,用于存储和管理数据。其中,equals和hashCode方法是Java容器集合中两个非常重要的方法,...

    关于hashCode()和equals()的本质区别和联系

    Java 中的每个对象都有 hashCode() 和 equals() 方法,这两个方法的正确实现对于 Java 开发人员来说是非常重要的。本文将详细介绍 hashCode() 和 equals() 的本质区别和联系,并探讨在创建 Java 类时如何定义这些...

    java中hashcode和equals的详解.pdf

    Java 中的 hashCode 和 equals 方法详解 本文详细介绍了 Java 中的 hashCode 和 equals 方法,探讨了这两个方法的作用、实现机制和使用场景。通过对 hashCode 和 equals 方法的深入分析,我们可以更好地理解 Java ...

    Java equals 方法与hashcode 方法的深入解析.rar

    在Java编程语言中,`equals()`方法和`hashCode()`方法是两个非常重要的概念,它们主要用于对象的比较和哈希表的高效运作。本解析将深入探讨这两个方法的用途、实现原理以及它们之间的关联。 首先,`equals()`方法是...

    java中hashcode()和equals()的详解

    在Java编程语言中,`hashCode()`和`equals()`方法是对象身份验证的关键组成部分,它们主要用于对象的比较和哈希表(如HashMap、HashSet等)的操作。理解这两个方法的工作原理对于编写高效和可靠的代码至关重要。 ...

    equals,hashcode,toString

    在Java编程语言中,`equals()`, `hashCode()` 和 `toString()` 是三个非常重要的方法,它们主要用于对象的比较、哈希存储以及打印对象信息。这三个方法是Java对象的基础特性,对于理解和开发高质量的Java程序至关...

    Java中的equals()和hashCode()契约Ja

    在Java编程语言中,`equals()`和`hashCode()`方法是两个至关重要的概念,它们与对象的比较和哈希表操作紧密相关。理解这两个方法的工作原理及其契约是成为一名熟练的Java开发者所必需的。 首先,`equals()`方法是...

    探索Java中的equals()和hashCode()方法_动力节点Java学院整理

    之所以有hashCode方法,是因为在批量的对象比较中,hashCode要比equals来得快,很多集合都用到了hashCode。 为什么选择hashCode方法的原因是由于JVM的机制。当JVM创建对象时,它会将对象丢到一个Hash表中去,这样的...

    java中hashcode()和equals()方法详解

    在Java编程语言中,`hashCode()`和`equals()`方法是非常重要的概念,它们不仅对于深入理解Java内存管理至关重要,也是实现自定义类的关键部分之一。本文将详细介绍这两个方法的工作原理、使用场景以及它们之间的关系...

Global site tag (gtag.js) - Google Analytics