`
huhu_long
  • 浏览: 71772 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

About equals & hashCode

阅读更多
很多童鞋可能都会有这样的问题, 为什要重写equals和hashCode方法呢? 什么情况下我们会需要重写这些方法呢?

好, 简单的讲, 当我们在使用集合框架, 如: HashSet, HashTable, HashMap的时候, 才有可能用到这些。

为什么说“有可能”呢? 因为并不是所有情况都需要, 废话!
想想我们一般在什么情况下需要用到这些集合框架呢?答案肯定是用来存取数据嘛。
没错, 那我们用什么来取数据呢? 当然一般用key来取啦。
很好, 那我们的key可以是什么类型的呢? - Object
既然是Object, 那么基本类型对应的包装类型和String也应该在这个范畴之内吧。
为什么要把这些包装类和String单独提出来呢? 因为用他们做key的时候就不需要重写equals和hashCode方法。

换言之, 其他的引用类型就都必须实现equals和hashCode方法啦

好啦, 那我们来看个简单的例子:
先往一个HashMap里加入一组Key-Value
然后再去取, 是不是很简单?

public class HashMaps {
	public static void main(String[] args) {
		Map<Object, Object> testMap = new HashMap<Object, Object>();

		Key key1 = new Key("key_name", "key_value");
		Key key2 = new Key("key_name", "key_value");

		System.out.println("key1 equals key2 ? " + key1.equals(key2));

		testMap.put(key1, new Value("value_name", "value_value"));

		if (testMap.containsKey(key2)) {
			System.out.println(testMap.get(key2));
		}
	}

	static class Key {
		private String name;
		private String value;

		public Key(String name, String value) {
			this.name = name;
			this.value = value;
		}

		public String getName() {
			return name;
		}

		public void setName(String name) {
			this.name = name;
		}

		public String getValue() {
			return value;
		}

		public void setValue(String value) {
			this.value = value;
		}
	}

	static class Value {
		private String name;
		private String value;

		public Value(String name, String value) {
			this.name = name;
			this.value = value;
		}

		@Override
		public String toString() {
			return "Name: " + this.name + " Value: " + this.value;
		}
	}
}


那么这和我们期望的结果会有什么样的差别呢? 看看执行结果:
引用
key1 equals key2 ? false


好了, 既然这两个对象不“相等”, 那我们就得先让他们相等, 不然怎么可能从HashMap中取出来呢
@Override
public boolean equals(Object obj) {
	if (!(obj instanceof Key))
		return false;
	Key key = (Key) obj;
	return key.name.equals(this.name) && key.value.equals(this.value);
}


这样一来, 他们应该就相等了吧。 好再来看看结果:
引用
key1 equals key2 ? true


额~~~ 是相等了, 但是为什还是从HashMap中取不出来呢?

好, 那我们来看看这些所谓的集合框架是如何存取数据的。。。
这样理解好啦:
1. 当我们用put方法把一个对象放到HashMap中的时候, 会根据当前对象的散列码(hashCode)来给它分配一个散列桶(hash bucket)
2. 然后当我们用get方法通过一个对象(key)去取数据的时候, 就会根据你这个key的散列码去查找对应的散列桶, 找到了就返回桶里的值, 找不到则返回null

哦, 原来是两个key的hashCode值不一样啊。。。

那现在该怎样做自然就很明了啦, 重写hashCode方法 (怎样重写?去看看Effective Java吧)
@Override
public int hashCode() {
	int result = 17;
	result = 31 * result + this.name.hashCode();
	result = 31 * result + this.value.hashCode();
	return result;
}


看看结果怎样:
引用
key1 equals key2 ? true
Name: value_name Value: value_value


小样, 终于被我取到了吧。。。

水平有限, 就这样啦。。。想砸的砸, 想拍的拍哈。。。欢迎任何意见, 拒绝人身攻击。。。哈哈
分享到:
评论
1 楼 zhang_he 2011-08-18  
so good

相关推荐

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

    在Java编程语言中,`equals()` 和 `hashCode()` 方法是Object类中的两个核心方法,所有类都默认继承自Object类。这两个方法在处理对象比较和集合操作时起着至关重要的作用。当我们创建自定义类并需要对对象进行精确...

    equals,hashcode,toString

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

    equals与hashCode在实际开发中的重写写法

    在Java编程语言中,`equals()` 和 `hashCode()` 方法是两个非常重要的成员,尤其是在处理对象比较和集合操作时。这两个方法通常与`Object`类中的默认实现相关联,但为了在实际开发中实现正确的对象比较和哈希表操作...

    equals与hashCode方法讲解

    equals 与 hashCode 方法讲解 equals 方法和 hashCode 方法是 Java 语言中两个重要的方法,它们都是在 Object 类中定义的。equals 方法用于比较两个对象是否相等,而 hashCode 方法用于返回对象的哈希码。 在 Java...

    Java中equals,hashcode和==的区别

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

    equals-hashcode-processor-1.0.0.zip

    "retry.zip"中的开源项目"equals-hashcode-processor-1.0.0"为我们提供了一个优雅的解决方案,通过这个库,我们可以轻松地为Scala Futures实现自动重试逻辑。 首先,我们需要理解Scala Futures的基础。Futures是...

    关于重写equals,hashcode以及compareTo方法!

    关于重写equals、hashcode以及compareTo方法! equals()方法是Object类中的一个方法,它用于比较两个对象是否相等。然而,它的默认实现是比较对象的引用(地址),而不是比较对象的实际内容。因此,在某些情况下,...

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

    本文还介绍了定义对象的相等性、实施equals()和hashCode()的需求、编写自己的equals()和hashCode()方法。通过统一定义equals()和hashCode(),可以提升类作为基于散列的集合中的关键字的使用性。

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

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

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

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

    Java中的equals和hashCode方法详解1

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

    equals 和 hashCode两者效果分析详解.docx

    在Java编程语言中,`equals()`和`hashCode()`方法是两个非常重要的概念,尤其是在处理对象比较和容器(如HashMap和HashSet)操作时。这两个方法在Java的类库中有着核心地位,尤其是对于类实例的比较和存储。接下来,...

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

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

    hashcode和equals方法

    equals()和hashcode()这两个方法都是从object类中继承过来的。当String 、Math、还有Integer、Double。。。。等这些封装类在使用equals()方法时,已经覆盖了object类的equals()方法.

    JAVA集合的使用(List、Map、Set、Queue,Collections、Comparable与Comparator,排序、搜索,内部类、equals、hashCode)

    要注意的是List,Set,Queue继承了Collection接口,...这里想用一个简单的例子展示一下他们的使用,内容包括:List、Map、Set、Queue,Collections、Comparable与Comparator,排序、搜索,内部类,泛型、重写equals、hashCode

    关于Object中equals方法和hashCode方法判断的分析

    "关于Object中equals方法和hashCode方法判断的分析" 在 Java 中,Object 类提供了两个重要的方法:equals 方法和 hashCode 方法。这两个方法都是用于比较两个对象是否相等的,但它们的实现机理和作用域却有所不同。...

    深入理解equals和hashCode方法

    深入理解equals和hashCode方法 equals和hashCode方法是Java中Object类提供的两个重要方法,对以后的学习有很大的帮助。本文将深入剖析这两个方法,帮助读者更好地理解和使用它们。 equals方法 equals方法是用于...

    HashCode相同equals不同的2位字符集合算法

    在Java编程语言中,`hashCode()` 和 `equals()` 是两个非常重要的方法,它们主要用于对象的比较和哈希表(如HashMap)的操作。标题提到的"HashCode相同equals不同的2位字符集合算法"涉及到的是一个特定场景:两个...

    Java_重写equals()和hashCode()

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

    ordinary-zhang#java#equals和hashcode方法详解1

    1.概述 2.为什么重写equels方法要重写hashcode方法 3.例子

Global site tag (gtag.js) - Google Analytics