`
schy_hqh
  • 浏览: 555744 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

(基础)java中的equals与hashcode

 
阅读更多

hashCode()用于计算该对象的哈希值,当以哈希表为底层数据结构存储数据时,就需要用到哈希值,如HashSet,HashMap等集合容器。

 

hashCode() 与 equals() 为什么要一起重写呢?

通常,是基于这样的考虑:

如果该对象使用哈希表的进行存储,那么需要通过hashCode()计算哈希码,得到对象的地址,当地址相同时,就需要进一步调用该对象的equals()来比较内容是否相同。

因此,才推荐将2个方法一起重写,在使用hash结构的集合存储时,才不会出现问题。

 

自定义哈希值的计算方式---复写hashCode()

 

自定义对象是否相同的比较规则---复写equals()

 

 

 

对象之间的比较,可以比较地址,也可以自定义比较规则

 

==  比较的是对象在内存中的地址是否相同,地址相同,则对象一定相同

 

equals 比较的内容,由equals方法内部指定,可以比较地址(Object基类中的默认实现),也可以自定义比较规则,因此,equals方法提供了对象之间比较的扩展功能。

 

比如,String类复写了Object基类中的equals()

public boolean equals(Object anObject) {
        if (this == anObject) { //先比较地址,如果地址相同,则对象相同
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String) anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])//否则,逐一比较字符串中的字符是否相同
                            return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

 

 字符串比较时,使用==与equals()进行比较的区别

public class Test {
	public static void main(String[] args) {
		String str1 = "abc";
		String str2 = "abc";
		String objStr = new String("abc");
		
		//字符串常量之间的比较,字符串常量在内存中只有一份,因此地址相同,所以都为true
		System.out.println(str1==str2);//true
		System.out.println(str1.equals(str2));//true
		
		//字符串常量与堆内存中字符串的比较
		System.out.println(str1==objStr);//地址不同,false
		System.out.println(str1.equals(objStr));//虽然地址不同,但String类对equals方法进行了扩展,会继续比较字符串中的字符,所以true
	}
	
}

 

 通过复写equals(),自定义对象是否相同的比较规则

public class Person {
	
	private String name;

	public Person() {
		super();
	}

	public Person(String name) {
		super();
		this.name = name;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}


	/**
	 * 自定义Person是否相同的比较规则
	 */
	@Override
	public boolean equals(Object obj) {
		//1.对方是null,直接false
		if(obj == null)
			return false;
		
		//2.类型不同,抛异常
		if(!(obj instanceof Person))
			throw new ClassCastException("类型不同,无法比较");
		
		//3.地址相同,直接true
		if(this == obj)
			return true;
		
		//4.最后,按自定义规则比较。(额外一步:将比较的对象向下转型为同一类型)
		Person anotherPerson = (Person)obj;
		
		//这里又利用了String类中定义的equals(),比较字符串是否相同
		return this.name.equals(anotherPerson.name);
	}
	
	
}

 

 

public class Test {
	public static void main(String[] args) {
		Person p1 = new Person("zs");
		Person p2 = p1;
		Person p3 = new Person("ls");
		Person p4 = new Person("zs");
		
		//对方为null:false
		System.out.println(p1.equals(null));
		
		//地址相同:true
		System.out.println(p1.equals(p2));
		
		//地址不同,内容不同:false
		System.out.println(p1.equals(p3));
		
		//虽然地址不同,但是内容相同:true
		System.out.println(p1.equals(p4));
	}
	
}

 

分享到:
评论

相关推荐

    Java中equals,hashcode和==的区别

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

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

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

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

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

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

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

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

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

    equals与hashCode方法讲解

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

    equals,hashcode,toString

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

    Java中的equals和hashCode方法详解1

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

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

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

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

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

    java 基础之(equals hashcode)

    总的来说,理解和正确使用 `equals()` 和 `hashCode()` 是Java开发者必备的基础知识,这对于编写健壮、高效的代码至关重要。在进行对象比较和使用哈希表时,这两个方法的合理实现可以极大地提高程序的性能和正确性。

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

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

    Java_重写equals()和hashCode()

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

    Java中equals()与hashCode()的原理与设计

    1、何时需要重写equals()  当一个类有自己特有的“逻辑相等”概念(不同于对象身份的概念)。  2、为什么改写equals()的时候,总是要改写hashCode() ...  3、什么是equals()与如何设计equals()

    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

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

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

    java中hashcode和equals的详解.pdf

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

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

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

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

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

Global site tag (gtag.js) - Google Analytics