HashSet中存方用户自定义数据类型数据,重写equals方法和hashCode方法

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

public class SetTest {
	public static void main(String[] args) {
		/*
		 *对于用户自定义类型的数据放在容器(Set)中
		 *务必重写equals和hashCode方法
		 *要不然stu1和stu2放在容器中,和认为是两个不同的元素
		 **/

		//set中存放的元素是无序的
		//set中存储的元素是不可以重复的(根据equals方法和hashCode方法判断)
		Set set = new HashSet();
		Student stu1 = new Student(1, "aaa");
		Student stu2 = new Student(1, "aaa");
		Student stu3 = new Student(2, "ccc");
		Student stu4 = new Student(8, "fff");

		set.add(stu1);
		set.add(stu2);
		set.add(stu3);
		set.add(stu4);

		System.out.println(set);
	}
}

class Student {
	private int id;
	private String name;

	public Student(int id, String name) {
		this.id = id;
		this.name = name;
	}

	@Override
	public String toString() {
		return this.id + " " + this.name;
	}

	@Override
	public boolean equals(Object obj) {
		Student stu = (Student) obj;

		return this.id == stu.id && this.name.equals(stu.name);
	}

	@Override
	public int hashCode() {
		return this.id*this.name.hashCode();
	}
}
输出结果:
[8 fff, 1 aaa, 2 ccc]

如果不重写hashCode和equals方法

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

public class SetTest {
	public static void main(String[] args) {
		/*
		 *对于用户自定义类型的数据放在容器(Set)中
		 *务必重写equals和hashCode方法
		 *要不然stu1和stu2放在容器中,和认为是两个不同的元素
		 **/

		//set中存放的元素是无序的
		//set中存储的元素是不可以重复的(根据equals方法和hashCode方法判断)
		Set set = new HashSet();
		Student stu1 = new Student(1, "aaa");
		Student stu2 = new Student(1, "aaa");
		Student stu3 = new Student(2, "ccc");
		Student stu4 = new Student(8, "fff");

		set.add(stu1);
		set.add(stu2);
		set.add(stu3);
		set.add(stu4);

		System.out.println(set);
	}
}

class Student {
	private int id;
	private String name;

	public Student(int id, String name) {
		this.id = id;
		this.name = name;
	}

	@Override
	public String toString() {
		return this.id + " " + this.name;
	}
}
输出结果:
[1 aaa, 1 aaa, 8 fff, 2 ccc]

HashSet中存方用户自定义数据类型数据,重写equals方法和hashCode方法

时间: 2024-11-10 12:50:42

HashSet中存方用户自定义数据类型数据,重写equals方法和hashCode方法的相关文章

详解equals()方法和hashCode()方法

前言 Java的基类Object提供了一些方法,其中equals()方法用于判断两个对象是否相等,hashCode()方法用于计算对象的哈希码.equals()和hashCode()都不是final方法,都可以被重写(overwrite). 本文介绍了2种方法在使用和重写时,一些需要注意的问题. 一.equal()方法 Object类中equals()方法实现如下: public boolean equals(Object obj) { return (this == obj); } 通过该实现

关于Object类的equals方法和hashCode方法

关于Object类的equals的特点,对于非空引用: 1.自反性:x.equals(x) return true : 2.对称性:x.equals(y)为true,那么y.equals(x)也为true: 3.传递性:x.equals(y)为true,y.equals(z)为true,那么x.equals(z)也为true: 4.一致性:x.equals(y)的第一次调用为true,那么x.equals(y)的第二次,第三次,...,第n次调用也为true,前提条件是在比较之间没有修改x,也没

正确重写equals方法和compareTo方法

一.概述 程序要对一堆数据元素排序,查找,增加删除.数据节点 class Node{ int type; int index; int score; } 规则: 1)对象相等:两个节点n1与n2,如果n1.type == n2.type && n1.index == n2.index则n1等于n2 2)排序:升序,比较score,score相同则比较type,type相同则比较index.最开始我使用TreeMap存储.实现Comparable接口,重写equals方法与hashCode方

重写equals()方法和 hashCode()方法

java中判断两个对象是否相等的规则:首先,判断两个对象的hashCode是否相等 如果不相等,认为两个对象也不相等 如果相等,则判断两个对象用equals运算是否相等 如果不相等,认为两个对象也不相等 如果相等,认为两个对象相等 我们在equals方法中需要向下转型,效率很低,所以先判断hashCode方法可以提高效率. equals()相等的两个对象,hashcode()一定相等: equals()不相等的两个对象,却并不能证明他们的hashcode()不相等. 1,所有Java类都继承自O

JAVA正确地自定义比较对象---如何重写equals方法和hashCode方法

在实际应用中经常会比较两个对象是否相等,比如下面的Address类,它有两个属性:String province 和 String city. public class Address { private String province; private String city; public String getProvince() { return province; } public void setProvince(String province) { this.province = p

Java重写equals方法和hashCode方法

package com.ddy; public class User {     private Integer id; private String name; private String address; private String phone; public Integer getId() {         return id;     } public void setId(Integer id) {         this.id = id;     } public Strin

浅谈Java中的hashCode方法

哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: public native int hashCode(); 根据这个方法的声明可知,该方法返回一个int类型的数值,并且是本地方法,因此在Object类中并没有给出具体的实现. 为何Object类需要这样一个方法?它有什么作用呢?今天我们就来具体探讨一下hashCode方法. 一.hashCode方法的作用 对于包含容器类型的程序设计语言来说,基本上都会涉及到has

浅谈Java中的hashcode方法 - 海 子

浅谈Java中的hashcode方法 哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: public native int hashCode(); 根据这个方法的声明可知,该方法返回一个int类型的数值,并且是本地方法,因此在Object类中并没有给出具体的实现. 为何Object类需要这样一个方法?它有什么作用呢?今天我们就来具体探讨一下hashCode方法. 一.hashCode方法的作用 对于包含容器类型的程

java中的hashCode()方法

电话面试问到了HashMap里的类要实现什么方法,只知道是按哈希值查找所以查找效率很快,其它的一问三不知,现在来研究研究. 想研究研究,但是却不知道从哪里下手.... 汗!!!首先来咬文嚼字吧 什么是哈希值?百度了一下:哈希算法将任意长度的二进制值映射为固定长度的较小二进制值,这个小的二进制值称为哈希值.哈希值是一段数据唯一且极其紧凑的数值表示形式... 还是看不出和java类有什么关系...以前学数据结构时哈希表(也叫做散列表)这章还是很重要的,关键是那个哈希映射的哈希函数,也就是哈希算法,根