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方法的更多相关文章

  1. java中equals方法和hashcode方法的区别和联系,以及为什么要重写这两个方法,不重写会怎样

    一.在Object类中的定义为:public native int hashCode();是一个本地方法,返回的对象的地址值.但是,同样的思路,在String等封装类中对此方法进行了重写.方法调用得到 ...

  2. Java基础系列-equals方法和hashCode方法

    原创文章,转载请标注出处:<Java基础系列-equals方法和hashCode方法> 概述         equals方法和hashCode方法都是有Object类定义的. publi ...

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

    前言 Java的基类Object提供了一些方法,其中equals()方法用于判断两个对象是否相等,hashCode()方法用于计算对象的哈希码.equals()和hashCode()都不是final方 ...

  4. Java 如何重写对象的 equals 方法和 hashCode 方法

    前言:Java 对象如果要比较是否相等,则需要重写 equals 方法,同时重写 hashCode 方法,而且 hashCode 方法里面使用质数 31.接下来看看各种为什么. 一.需求: 对比两个对 ...

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

    关于Object类的equals的特点,对于非空引用: 1.自反性:x.equals(x) return true : 2.对称性:x.equals(y)为true,那么y.equals(x)也为tr ...

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

    创建实体类时,最好重写超类(Object)的hashCode()和equals()方法 equals()方法: 通过该实现可以看出,Object类的实现采用了区分度最高的算法,即只要两个对象不是同一个 ...

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

    equals()方法和hashCode()方法详解 1. Object类中equals()方法源代码如下所示: /** * Object类中的equals()方法 */ public boolean ...

  8. Java equals()方法和hashCode()方法

    equals()方法 如果满足了以下任何一个条件,就不需要覆盖equals()方法: 1 类的每个实例本质上都是唯一的. 2 不关心类是否提供了“逻辑相等”的测试功能. 3 父类已经覆盖了equals ...

  9. HashSet中的元素必须重写equals方法和hashCode方法

    http://jingyan.baidu.com/article/d5a880eb8fb61d13f147cc99.html 1.为什么必须重写这两个方法. 2.什么事hashSet去重,符合什么样的 ...

随机推荐

  1. concurrent.futures模块(进程池&线程池)

    1.线程池的概念 由于python中的GIL导致每个进程一次只能运行一个线程,在I/O密集型的操作中可以开启多线程,但是在使用多线程处理任务时候,不是线程越多越好,因为在线程切换的时候,需要切换上下文 ...

  2. Stringsobits(模拟)

    描述 Consider an ordered set S of strings of N (1 <= N <= 31) bits. Bits, of course, are either ...

  3. BZOJ-3040 最短路

    最短路+堆优化. 普通的堆还不行,自己用的是配对堆(貌似斐波那契堆也行?毕竟理论复杂度) 然后发现自己的配对堆比云神的不知快了多少...我照着他的模版打的喂.. 然后发现前T条边不理都能A... 数据 ...

  4. iOS-文件断点续传

    * 移动客户端在和服务器交互的时候,上传和下载使用十分广泛. * 在我们下载文件的时候,我们在点击暂停的时候可以暂停下载,点击下载的时候可以继续下载,这个功能如何实现? * 下载进度条如何显示? 先大 ...

  5. 仔细瞄一下HashMap是怎么干活的

    以下分析基于jdk11.0.2 1. 创建HashMap时发生了什么? HashMap(),HashMap(int initialCapacity),HashMap(int initialCapaci ...

  6. 【前端学习笔记】2015-09-09~~~~nodejs中的require()和module.exports

    nodejs中一个js文件就可以看做是一个模块 在node环境中,可以直接var a=require('模块路径以及不带扩展名的模块名') exports---module.exports 其中nod ...

  7. es6总结(四)--对象

  8. POJ 2411Mondriaan's Dream

    题目: Squares and rectangles fascinated the famous Dutch painter Piet Mondriaan. One night, after prod ...

  9. postgresql-9.0.18-1-linux.run启动

    下载地址:http://www.enterprisedb.com/products-services-training/pgdownload选择合适版本 基本都是下一步就可以到设置密码时记住密码以后要 ...

  10. linux 中信号量

    ctrl-c 发送 SIGINT 信号给前台进程组中的所有进程.常用于终止正在运行的程序.ctrl-z 发送 SIGTSTP 信号给前台进程组中的所有进程,常用于挂起一个进程.ctrl-d 不是发送信 ...