【java】HashSet
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的更多相关文章
- 【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 ...
- 【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 ...
- 【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 ...
- 【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 ...
- 【Java】【集合】
[1. ]HashMap,LinkedHashMap,TreeMap对比 共同点: HashMap,LinkedHashMap,TreeMap都属于Map:Map 主要用于存储键(key)值(valu ...
- 【Java】NIO中Selector的创建源码分析
在使用Selector时首先需要通过静态方法open创建Selector对象 public static Selector open() throws IOException { return Sel ...
- 【Java】NIO中Selector的select方法源码分析
该篇博客的有些内容和在之前介绍过了,在这里再次涉及到的就不详细说了,如果有不理解请看[Java]NIO中Channel的注册源码分析, [Java]NIO中Selector的创建源码分析 Select ...
- 【Java】代处理?代理模式 - 静态代理,动态代理
>不用代理 有时候,我希望在一些方法前后都打印一些日志,于是有了如下代码. 这是一个处理float类型加法的方法,我想在调用它前打印一下参数,调用后打印下计算结果.(至于为什么不直接用+号运算, ...
- 【Java】推断文件的后缀名
这本来不是一个问题,利用框架本来有的方法.或者File类的getPath()方法,取出要推断文件路径.或者getName()方法取出文件路径,成为一个String字符串如果为fileName之后,再对 ...
随机推荐
- 使用JavaScript生成二维码教程-附qrcodejs中文文档
使用javascript生成二维码 依赖jquery 需要使用到的库 https://github.com/davidshimjs/qrcodejs DIV <div id="qrco ...
- jq获取浏览器的高度
// console.log("2-"+$(window).height()); //浏览器当前窗口可视区域高度 // console.log("3-"+$(d ...
- MySQL分类表设计--根据ID删除全部子类
在做数据库分类表的时候,通常会有这样的设计:一个字段是ID,另一个字段PID,PID指向自己的上级分类: 这样的设计带来的问题是:我要删除一个类,我希望它的子类全部一起删除: 在不知道分类有多少层级的 ...
- 弄明白python reduce 函数
作者:Panda Fang 出处:http://www.cnblogs.com/lonkiss/p/understanding-python-reduce-function.html 原创文章,转载请 ...
- [LeetCode] 74 Search a 2D Matrix(二分查找)
二分查找 1.二分查找的时间复杂度分析: 二分查找每次排除掉一半不合适的值,所以对于n个元素的情况来说: 一次二分剩下:n/2 两次:n/4 m次:n/(2^m) 最坏情况是排除到最后一个值之后得到结 ...
- Web Mining and Big Data 公开课学习笔记 ---lecture0
0.1 课程主要内容:Big data technologies , Machine Learning and AI 0.6 OUTLINE: predict the future using ...
- .NET作品集:linux下的博客程序
博客程序架构 本博客程序是博主11年的时候参考loachs小泥鳅博客内核开发的.net跨平台博客cms,距今已有6年多了,个人博客网站一直在用,虽然没有wordpress那么强大,但是当时在深究.ne ...
- 自己动手编写IOC框架(三)
刚写博客浏览量第一天就有1000多人次,给了我很大的鼓舞决定熬夜再写一篇.对于前两篇来说无非就是使用dtd验证xml,然后解析xml,和IOC的核心还是差的很远,相信很多小伙伴们都感觉看得不过瘾了,这 ...
- 超简单的php缓存类
<?php class Cache { private $dir = "data/cache/";//定义缓存目录 private $key='c_a_sss'; // 文件 ...
- 配置scrapy-splash+python爬取医院信息(利用了scrapy-splash)
北京艾丽斯妇科医院(http://fuke.fuke120.com/) 首先先说一下配置splash 1.利用pip安装scrapy-splash库 pip install scrapy-splash ...