`

关于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
 
分享到:
评论

相关推荐

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

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

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

    set集合是无序的相较于list集合是没有下标的,hashset底层去重,与hashCode、equals方法相关,排序的元素不是String,而是对象Person

    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方法详解1

    如果一个类的hashCode()方法没有遵循上述要求,那么,当这个类的两个实例对象用equals()方法比较的结果相等时,他们本来应该无法被同时存储进set集合

    java集合知识-map、set等

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

    Set及比较器的使用

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

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

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

    实验05 Java集合.doc

    注意:因为Person类是自定义类,需要重写hashCode()方法和equals()方法,并规定只有姓名和身份证号都相等,则对象相等。 其中计算哈希码的算法:(31 + ((name == null) ? 0 : name.hashCode()))*31 + id (注:...

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

    总的来说,Java中的集合(Collection)有两类,一类是List,再有一类是Set。前者集合内的元素是有序的,元素可以重复;后者元素无序,但元素不可重复

    新版java教程 全套javase零基础到高级视频教程小白自学编程下载地址

    ·玩转集合框架迭代器和HashCode和Equals重新排序 实战 ·实战teratori迭代器和自定义Comparable:排序接口 ·玩转ava操作文件File类常用操作 ·案例实战IO流Input、Output Stream流 ·详细常见Object、Math、String...

    java8集合源码分析-CollectionDemo:自己复习集合框架时候的例子

    java8 集合源码分析 ...保证唯一性:元素hashCode和equals方法。hashCode方法相同,判断equals方法 ---LinkedHashSet: 有序,是HashSet的子类 2.TreeSet: 底层是二叉树,可对元素进行排序,默认是自然顺序

    JAVA面试常见问题整理

    接着,文章详细解释了equals和hashCode的用法及区别,以及String、StringBuffer、StringBuilder的区别和适用场景。 此外,文章还涵盖了Java中的一些基本概念,如final、interface、abstract类、重载和重写等。同时...

    廖雪峰 Java 教程.doc

    编写equals和hashCode 使用EnumMap 使用TreeMap 使用Properties 使用Set 使用Queue 使用PriorityQueue 使用Deque 使用Stack 使用Iterator 使用Collections IO File对象 InputStream OutputStream ...

    jdk 的集合框架的主体结构

    jdk 的集合框架的主体结构: Set 成员不能重复 HashSet 外部无序地遍历成员。 成员可为任意Object子类的对象,但如果覆盖了equals方法,同时注意修改hashCode方法。

    Java面试题.docx

    1、java中==和equals和hashCode的区别 2、int与integer的区别 3、String、StringBuffer、StringBuilder区别 4、什么是内部类?内部类的作用 5、进程和线程的区别 6、final,finally,finalize的区别 7、...

    Hibernate中文API大全

    它必须重新实现equals()和hashCode()方法, 始终和组合关键字在数据库中的概念保持一致 注意:在Hibernate3中,第二个要求并非是Hibernate强制必须的。但最好这样做。 你不能使用一个IdentifierGenerator产生组合...

    Java服务器端开发面试.doc

    Java服务器端开发面试题 Java服务器端开发面试题篇1 Hashcode()和equals(), 明白背后的原理,包括hashcode()的用法,各自的区别,如何,何时覆盖,为何覆盖 区别new String()和 申明的字符串的区别,String不变量,堆...

    Java期末复习-类集框架

    Java类集框架 最大单值操作父接口Collection及其子接口、子类: List接口、ArrayList类、Vector类、栈操作类Stack、链表操作类LinkList、队列操作接口Queue、Set接口、...Comparable接口、equals()方法、hashCode()方法

    java8stream源码-Java8:Java8中的一些例子

    hashCode、Equals、toString 实现的最佳实践 流与循环 流旨在处理潜在的无限大数据集,而数组、集合和几乎每个实现 Iterable 的 Java SE 类都完全在内存中。 Stream 的一个缺点是过滤器、映射等不能抛出已检查的异常...

    HashTable和HashMap的区别_动力节点Java学院整理

    HashSet实现了Set接口,它不允许集合中有重复的值,当我们提到HashSet时,第一件事情就是在将对象存储在HashSet之前,要先确保对象重写equals()和hashCode()方法,这样才能比较对象的值是否相等,以确保set中没有...

Global site tag (gtag.js) - Google Analytics