package com.tn.hashSet;

 public class Person {
private int id;
private String name;
private String birthday;
public Person(int id, String name, String birthday) {
super();
this.id = id;
this.name = name;
this.birthday=birthday;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getBirthday() {
return birthday;
}
public void setBirthday(String birthday) {
this.birthday = birthday;
}
@Override
public String toString() {
return id +"-" + name;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + id;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Person other = (Person) obj;
if (id != other.id)
return false;
return true;
}
}

Person.java

 package com.tn.hashSet;

 import java.util.HashSet;
import java.util.Iterator; public class HashSetTest {
/*
* HashSet的底层是HashMap
* 注意:
* 1.必须根据实际情况确定唯一标识来重写hashCode和equals方法
* 2.对象一旦放入HashSet容器中,则唯一标识不能再修改,否则移除不了。
* 3.HashSet存放对象时对象位置和对象hashCode算法等到的值相关,查找移除都需要用到hashCode算法
* 值,如果唯一标识被修改则hashCode算法值会和以前不一样,对象位置就改变了,导致找不到对象,长此以往,
* 导致内存泄露。
*/
public static void main(String[] args){
HashSet<Person> persons=new HashSet<Person>();
Person p1=new Person(1001,"张三","1990-1-1");
Person p2=new Person(1002,"李四","1988-2-2");
Person p3=new Person(1003,"王五","1989-3-3");
persons.add(p1);
persons.add(p2);
persons.add(p3); System.out.println(persons);//即打印容器中每个对象toString的返回值 //foreach遍历
for(Person p:persons)
System.out.println(p); //迭代器遍历
Iterator<Person> iterator=persons.iterator();
while(iterator.hasNext())
System.out.println(iterator.next()); /*不能用for遍历,因为HaseSet无get方法。
for(int i=0;i<persons.size();i++){
System.out.println(persons.get(i));
}*/ //HashSet不能加重复对象
System.out.println(persons.size());
persons.add(p3);
System.out.println(persons.size()); /*
* 若不重写Person的hashCode和equals方法p4和p3会因地址不同被Object的equals方法判断为
* 两个不同的对象,若重写hashCode和equals,则被会认为同一个对象。
*/
Person p4=new Person(1003,"王五","1989-3-3"); persons.add(p4);
System.out.println(persons.size());//不重写hashCode和equals打印4,重写打印3 boolean b;
b=persons.remove(p1);
System.out.println(b);
System.out.println(persons.size());
p2.setId(1000);//HashSet容器中的对象唯一标识被改,导致hashCode和equals算法值和以前不一样
b=persons.remove(p2);//移除失败直接返回false,程序不会报错。
System.out.println(b);
System.out.println(persons.size());
}
}

HashSetTest.java

【java】HashSet的更多相关文章

  1. 【Java】-NO.16.EBook.4.Java.1.007-【疯狂Java讲义第3版 李刚】- Java基础类

    1.0.0 Summary Tittle:[Java]-NO.16.EBook.4.Java.1.007-[疯狂Java讲义第3版 李刚]-  Java基础类 Style:EBook Series:J ...

  2. 【Java】-NO.16.EBook.4.Java.1.008-【疯狂Java讲义第3版 李刚】- 集合/容器

    1.0.0 Summary Tittle:[Java]-NO.16.EBook.4.Java.1.008-[疯狂Java讲义第3版 李刚]- 集合 Style:EBook Series:Java Si ...

  3. 【Java】-NO.14.Java.4.Java.1.001-【Java JUnit 5 】-

    1.0.0 Summary Tittle:[Java]-NO.14.Java.4.Java.1.001-[Java JUnit 5 ]- Style:Java Series:JUnit Since:2 ...

  4. 【Java】-NO.12.Java.2.OCJP.1.001-【Java OCJP】-

    1.0.0 Summary Tittle:[Java]-NO.12.Java.2.OCJP.1.001-[Java OCJP]- Style:Java Series:OCJP Since:2017-0 ...

  5. 【Java】【集合】

    [1. ]HashMap,LinkedHashMap,TreeMap对比 共同点: HashMap,LinkedHashMap,TreeMap都属于Map:Map 主要用于存储键(key)值(valu ...

  6. 【Java】NIO中Selector的创建源码分析

    在使用Selector时首先需要通过静态方法open创建Selector对象 public static Selector open() throws IOException { return Sel ...

  7. 【Java】NIO中Selector的select方法源码分析

    该篇博客的有些内容和在之前介绍过了,在这里再次涉及到的就不详细说了,如果有不理解请看[Java]NIO中Channel的注册源码分析, [Java]NIO中Selector的创建源码分析 Select ...

  8. 【Java】代处理?代理模式 - 静态代理,动态代理

    >不用代理 有时候,我希望在一些方法前后都打印一些日志,于是有了如下代码. 这是一个处理float类型加法的方法,我想在调用它前打印一下参数,调用后打印下计算结果.(至于为什么不直接用+号运算, ...

  9. 【Java】推断文件的后缀名

    这本来不是一个问题,利用框架本来有的方法.或者File类的getPath()方法,取出要推断文件路径.或者getName()方法取出文件路径,成为一个String字符串如果为fileName之后,再对 ...

随机推荐

  1. laravel webpack填坑(陆续更)

    ie Promise支持需引入babel-polyfill, 在官方文档中js函数介绍有点少导致按babel-polyfill官方引入时找不到北 //webpack.mix.jsmix.js(['no ...

  2. 容易被忽视的后端服务 chunked 性能问题

    容易被忽视的后端服务 chunked 性能问题 标签(空格分隔): springboot springmvc chunked 背景 spring boot 创建的默认 spring mvc 项目 集成 ...

  3. JavaEE中的MVC(五)定制Struts——Action跳转JSP

    在JavaEE中的MVC(三)中,我在Servlet中引入了命令模式的使用,采用Xml配置的方式,实现了一个Servlet调用多个不同的Action类,但是还不能实现页面地跳转,这一篇博客从之前的代码 ...

  4. 虚拟机Ubuntu无法上网问题解决过程

    查看了网上大部分经验贴,都没有解决问题,只好自己思考琢磨,以下是思考解决过程 1.查看文件配置 2.查看虚拟机网络配置方式 3.查看硬件驱动是否存在 4.配置完文件ifcfg-eth0后重启,无效(虚 ...

  5. 使用JSCH框架通过跳转机访问其他节点

    之前搞了套远程访问ssh进行操作的代码,最近有需求,需要通过一台跳转机才能访问目标服务.在网上搜了半天,也没找到比较好的例子,就自己翻阅了下JSCH的API.但是看的云里雾里的.联想了下,端口转发的原 ...

  6. 预防onion比特币勒索病毒,如何快速关闭135,137,138,139,445端口

    预防onion比特币勒索病毒,如何快速关闭135,137,138,139,445等端口   如果这种网络端口关闭方法行不通,可以尝试一种新的关闭网络端口方法(比较繁琐)见106楼,补丁安装教程见126 ...

  7. 微信公众平台创建自定义菜单的PHP代码

    授人以鱼不如授人以渔.在方倍工作室上问了一下,创建自定义菜单的代码多少钱,一张口就一百,好吧,那我就给你们一人省一百块钱吧,你们说该如何谢谢我?事先说明一下啊,你的PHP版本要高于4.0.2才支持cU ...

  8. javaScript 验证码 倒计时60秒

    <input type="button" id="btn" value="免费获取验证码" /> <script type ...

  9. CDH集群搭建部署

    1. 硬件准备     使用了五台机器,其中两台8c16g,三台4c8g.一台4c8g用于搭建cmServer和NFS服务端,另外4台作为cloudera-manager agent部署CDH集群. ...

  10. 采用Opserver来监控你的ASP.NET项目系列(一、Opserver监控的简介与平台搭建)

    前言 之前有过2篇关于如何监控ASP.NET core项目的文章,有兴趣的也可以看看. 今天我们主要来讲讲如何监控我们的ASP.NET项目. 首先我们来介绍一下,什么是Opserver,它是Stack ...