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

关于Set集合中hashCode和equals的含义

阅读更多

大家知道在Set中是不会有重复对象的。Set会用hashCode与equals来保证不会有重复。

 

hashCode会定位对象在数组中下标,该下标处会引用类拟链表的数据结构。如果有两个对象的hashCode一样,但equals不一样,在该位置会有两个对象。

 

当Set增加某个对象时,首先会取得该对象的hashCode来定位,查询该位置如果没有存储对像,将直接放入,不调用equals方法

 

如果发现该位置有对象,将调用equals方法,如果相等,将返回。如果不相等,该对象会放入这个对像的后面.

 

在调用set.contains(object)时,也首先调用hashCode,定位后再通过equals来最终确定,如果该位上有n个对象,会依次调用。

 

测试一个程序,该对象的hashCode值故意设为固定值,去看下Set如何增加对象调用hashCode和equals方法

 

package test;

import java.util.HashSet;
import java.util.Set;

public class Main {

	public static void main(String[] args) {
		Student s0 = new Student();
		Student s1 = new Student();
		Student s2 = new Student();
		
		Set<Student> set = new HashSet<Student>();
		
		s0.name = "aa";
		set.add(s0);
		System.out.println("--------------- set.add(s0); -----------");
		s1.name = "bb";
		set.add(s1);
		System.out.println("--------------- set.add(s1); -----------");
		s2.name = "cc";
		set.add(s2);
		System.out.println("--------------- set.add(s2); -----------");
		
		Student s3 = new Student();
		s3.name = "dd";
		System.out.println("--------------- set.contains(s3); -----------");
		
		System.out.println(set.contains(s3));
		
	}
}

class Student implements Comparable<Student>{
	String name;

	@Override
	public boolean equals(Object obj) {
		// TODO Auto-generated method stub
		System.out.println("--------------- equals -----------");
		Student stu= (Student)obj;
		return stu.name.equals(this.name);
		
		
	}

	@Override
	public int hashCode() {
		// TODO Auto-generated method stub
		System.out.println("--------------- hashcode -----------");
		return 5;
	}

	@Override
	public int compareTo(Student o) {
		// TODO Auto-generated method stub
		return 0;
	}
	
	
}

 

 

输出结果

 

--------------- hashcode -----------
--------------- set.add(s0); -----------
--------------- hashcode -----------
--------------- equals -----------
--------------- set.add(s1); -----------
--------------- hashcode -----------
--------------- equals -----------
--------------- equals -----------
--------------- set.add(s2); -----------
--------------- set.contains(s3); -----------
--------------- hashcode -----------
--------------- equals -----------
--------------- equals -----------
--------------- equals -----------
false

 

 

 

0
0
分享到:
评论

相关推荐

    set接口经常用的hashCode和equals方法详解

    ### set接口中hashCode和equals方法详解 #### 一、引言 在Java编程语言中,`Set`接口作为集合框架的重要组成部分,在实现无重复元素的数据结构方面扮演着关键角色。为了确保元素的唯一性,`Set`接口依赖于对象的`...

    hashcode和equals的分析

    ### hashCode和equals方法详解 ...通过以上分析,我们可以看到`hashCode`和`equals`方法在Java中扮演着非常重要的角色,尤其是在集合框架中。正确地实现这两个方法可以大大提高程序的性能和可维护性。

    java中hashCode、equals的使用方法教程

    在Java编程语言中,`hashCode()` 和 `equals()` 方法对于对象的比较和处理至关重要,尤其在集合类(如Set和Map)中。这两个方法都源自`java.lang.Object`类,因此所有的Java类都默认继承了它们。理解并正确地重写这...

    JavaSE专题-Set集合.doc

    在使用Set集合时,需要掌握的一些小技巧,例如如何自动生成hashcode和equals方法,如何使用TreeSet的排序功能,如何使用LinkedHashSet的有序功能等。 总结 Set集合是JavaSE中的一种重要数据结构,包括HashSet、...

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

    有许多人学了很长时间的Java,但一直不明白hashCode方法的作用以及equals()和==的区别,我来解释一下吧。首先,想要明白hashCode的作用,你必须要先知道Java中的集合。总的来说,Java中的集合(Collection)有两类,...

    java集合——Java中的equals和hashCode方法详解

    在Java编程语言中,`equals()` 和 `...总的来说,`equals()` 和 `hashCode()` 方法在Java集合框架中扮演着核心角色,它们共同确保了对象的比较和查找效率。理解和正确使用这两个方法是编写高效、健壮的Java代码的关键。

    set集合的基本特点,set集合底层去重原理,集合怎么进行排序

    Set集合在Java编程语言中是一种基础且重要的数据结构,它主要特点是存储不重复的元素,且没有特定的插入顺序。接下来我们将深入探讨Set集合的基本特点、底层去重原理以及如何进行排序。 首先,让我们理解Set集合的...

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

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

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

    在实际应用中,hashCode方法常用于集合中,如Set和List等。例如,在Set中,使用hashCode方法来判断元素是否已经存在,如果元素已经存在,那么就不再添加,这样可以避免重复元素的存在。在List中,使用hashCode方法来...

    java集合知识-map、set等

    记住:如果元素要存储到HashSet集合中,必须覆盖hashCode方法和equals方法。 一般情况下,如果自定义的类会产生很多对象,比如人,学生,书,通常都需要覆盖equals,hashCode方法。 建立对象判断是否相同的依据。...

    Set及比较器的使用

    要求:将5个学生姓名写入一个Set集合中,学生具有学号,姓名以及成绩列表等属性。学生以学号区分。(注意hashcode与equals的定义,排序依据学号进行)。构造函数中随机生成学生成绩(10个成绩)。定义不同的...

    equals-hashcode-processor-1.0.0.zip

    在Scala中,正确实现`equals`和`hashCode`方法对于集合操作至关重要,因为它们影响了对象在Set和Map中的存储和查找。这个处理器可能提供了一种自动化的方式来生成这些方法,避免了手动实现时可能出现的错误和不一致...

    Java中的Set集合简单汇总解析

    Java中的Set集合简单汇总解析 Set接口简介: Set接口是Java集合框架中的一个重要接口,它继承自Collection接口,并没有对Collection接口进行功能上的扩充。Set接口的主要特点是元素无序,并且都会以某种规则保证...

    java中hashCode方法与equals方法的用法总结

    当你创建一个新的类并打算将其实例存储在集合(如 `Set`)中时,应该同时重写 `equals()` 和 `hashCode()`。这是因为如果不这样做,可能会导致以下问题: 1. **重复元素**:即使两个对象通过 `equals()` 比较是相等...

    hashCode的作用

    在这个例子中,`Demo1`类重写了`equals`方法和`hashCode`方法。通过`equals`方法确保只有`value`相等时才认为两个对象相等;而`hashCode`方法则返回`id`的值。这样设计可以确保即使`id`不同但`value`相同的对象被视...

    java中重写equals()方法的同时要重写hashcode()方法(详解)

    在 Java 中,equals() 方法和 hashCode() 方法是两个紧密相关的方法,它们都是用于比较和标识对象的方法。equals() 方法用于比较两个对象的值是否相等,而 hashCode() 方法用于生成对象的哈希码,以便在散列集合中...

    HashCode作用_动力节点Java学院整理

    Java集合中有两类,一类是List,一类是Set他们之间的区别就在于List集合中的元素师有序的,且可以重复,而Set集合中元素是无序不可重复的。对于List好处理,但是对于Set而言我们要如何来保证元素不重复呢?通过迭代...

    浅析Java中的set集合类型及其接口的用法

    Java中的Set集合是一种特殊的集合类型,它遵循了不存储重复元素的基本原则。Set接口是Collection接口的子接口,它的设计目标是确保集合中每个元素的唯一性。在Java中,Set接口有两个常用的实现类:HashSet和TreeSet...

    集合概述set、List、Map

    因此,通常需要覆写`hashCode()`和`equals()`方法以确保正确的键值匹配。 #### 五、Set **Set**接口是一个不允许重复元素的集合,它继承自Collection接口。 ##### 5.1 常用方法 Set接口提供了与Collection相同的...

    集合底层原理总结

    当自定义类作为集合元素时,为了正确实现元素的唯一性和比较,通常需要重写equals()和hashcode()方法。例如,Name类未重写这两个方法时,两个Name实例即使内容相同,也可能被视为不同对象,导致HashSet无法正确识别...

Global site tag (gtag.js) - Google Analytics