对hashcode、equals的理解

1、首先hashcode和equals都是java每个对象都存在的方法,因为他们两是Object的方法。

2、hashcode方法默认返回的是该对象内存地址的哈希码,然而你会发现,Object类中没有此方法的实现,是一个native方法,由c++实现,java只负责调用。像String等都对hashcode实现了重写,同样也对equals进行了重写,已达到自己的需求。

3、equals方法默认返回的是 this==o,也就是判断两个对象的地址是否相同,如果相同则返回true,否则false;这样你就会发现当你比较String时,equals和==的结果不同的原因,因为String重写了equals,地址相同或者对象中的内容相同就会返回true,假如没有重写,那么equals和==就没有区别。一般其他的一些类都有重写。

4、一般当你重写了equals方法时需要重写hashcode方法,因为当重写后对象相等后,需要满足hashcode值也相等。不然当你将数据存储到hashset中时就会出现问题,hashset中的值是不能重复的,就是根据对象的hashcode的值判断的,如果只重写equals 不重写hashcode可能造成相同的对象有不同的hashcode值(不重写就是比较地址的哈希码,然而改变了就需要根据需求改变),就可能重复存储。

时间: 2024-12-16 13:03:44

对hashcode、equals的理解的相关文章

hashcode和equals的理解

属性值相等的两个对象,分别放进List和Set Set集合: 两个对象的equals和hashcode都相等,才认为是同一个对象: 如果equals为false,则不管hashcode什么结果,Set size为2: 如果equals为true,只有当hashcode也相等,size才为1 所以要使得两个对象相等,必须同时重写equals和hashcode. http://blog.csdn.net/afgasdg/article/details/6889383 总结: 1.equals方法用于

【代码优化】equals深入理解

覆盖equals时,遵守通用约定 对equal方法的覆盖看起来很简单,但是有许多情况是容易导致错误,最好的避免这些错误的办法 就是不覆盖equals方法. 必须遵循的原则: 自反性--对于任何非空的引用 x,有x.equals(x) 为true: 对称性--对于任何非空的引用x,y,如果x.equals(y) 为true,则必有y.equals(x) 为true: 传递性--对于任何非空的引用x,y,z,如果x.equals(y) 为true且y.equals(z) 为true, 则必有x.eq

对hashmap与hashcode()、equals()的理解

1.equals方法没被重写的时候   比较的只是对象的地址  重写之后 比较的才是对象里的内容 2.重写equals的时候 务必需要重写hashcode 不然在用到容器的时候 会出现问题 因为容器会去判断新加入的对象的hashcode 在集合中是否存在 再去判断对象的内容 3.hashmap的理解 hashmap其实就是数组+链表   这里所谓的链表 无非就是 在hashmap里定义了一个静态Node类 这个类有Node next这个引用 可以指向当前下一个在当前索引下标下的Node节点 进行

爱问面试题:==和equals()和Hashcode()三者的理解

重写前: * ==表示两个对象的内存地址 * equals()也表示对象内存地址 * hashCode()表示该对象在JVM中的32位内存地址 重写后: ==仍表示两个对象的内存地址 equals()表示连个对象的值是否相等,相等就视为同一个对象 如果equals()方法重写,那么hashCode()方法也要重写,因为要保证同一个对象的hashCode值相等这样的规定. 根据javaAPI文档上的介绍: (1).同一个对象的hashCode值一定相同,无论是否重写过equals()方法,也就是说

Java hashCode(), equals()

转自:http://blog.csdn.net/fenglibing/article/details/8905007冯立彬的博客 以下是关于HashCode的官方文档定义: hashcode方法返回该对象的哈希码值.支持该方法是为哈希表提供一些优点,例如,java.util.Hashtable 提供的哈希表. hashCode 的常规协定是: 在 Java 应用程序执行期间,在同一对象上多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是对象上 equals 比较中所用的信息没有

HashSet——add remove contains方法底层代码分析(hashCode equals 方法的重写)

引言:我们都知道HashSet这个类有add   remove   contains方法,但是我们要深刻理解到底是怎么判断它是否重复加入了,什么时候才移除,什么时候才算是包括????????? add()方法 首先我们看下这个代码 1 package com.xt.set; 2 3 import java.util.HashSet; 4 import java.util.Iterator; 5 import java.util.Set; 6 7 public class AddTest { 8

String类型中ToString hashCode equals compareTo等方法的经典实现

private final char value[]; private int hash; // Default to 0 public String(String original) { this.value = original.value; this.hash = original.hash; } public String(char value[]) { this.value = Arrays.copyOf(value, value.length); } String: |--Compa

3.Java hashCode() equals总结

1.hashCode存在的意义在于查找的快捷性,如Hashtable,HashMap等.hashCode是用来在散列存储结构中确定对象的存储地址的. 2.两个对象如果相同,那么两个对象的hash'Code一定要相同. 3.如果对象的equals方法被重写,那么对象的hashCode也重写,并且产生hashCode使用的对象,一定要和equals方法中使用的一致. 4.两个对象的hashCode相同,并不一定表示两个对象就相同,只能够说明这两个对象在散列存储结构中,如Hashtable,他们存放在

C# == equals 本质理解

using System; using System.Diagnostics; using System.Text; using System.Collections; using System.Collections.Generic; class Test { static void print(object obj) { Console.WriteLine(obj); } class CDefOveride //C# 的所有类都默认继承于object,这里不用写继承,也可以写,有点诡异 {