【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之后,再对 ...
随机推荐
- JAVA面试之集合框架(三)
21.ArrayList和Vector的区别 这两个类都实现了List接口(List接口继承了Collection接口),他们都是有序集合,即存储在这两个集合中的元素的位置都是有顺序的,相当于一种动态 ...
- Entity Framework——常见报错总结
1 实体属性配置为IsRequired()对更新的影响 抛出异常类型DbEntityValidationException 表结构: 实体: public class User { public in ...
- 如何用while循环输出十行十列变色★☆
输出十行十列星星 k = 0 #设置一个终止变量 while k < 10: i = 0 #设置一个满十换行变量 while i < 10: print('★',end='') i += ...
- [最短路]P1119 灾后重建
题目背景 B地区在地震过后,所有村庄都造成了一定的损毁,而这场地震却没对公路造成什么影响.但是在村庄重建好之前,所有与未重建完成的村庄的公路均无法通车.换句话说,只有连接着两个重建完成的村庄的公路才能 ...
- ConstraintLayout
ConstraintLayout使用笔记 具体使用参考:http://blog.csdn.net/guolin_blog/article/details/53122387 ConstraintLayo ...
- 安卓自定义控件(五)触控基础MotionEvent
之前去面试,人家说,我这个事件拦截机制写得太少了,还有一个MotionEvent没写,这个确实也很重要,后来我考虑了一下,决定将这篇文章放到自己定义控件里. 先简单再提一下事件分发,事件分发和拦截主要 ...
- 一个简单的迷你jQuery实现
//仅提供与学习使用(function () { var _$ = window.$; var _jQuery = window.jQuery; //暴露外部使用的一个接口 var jQuery = ...
- Tarjan算法:求解图的割点与桥(割边)
简介: 割边和割点的定义仅限于无向图中.我们可以通过定义以蛮力方式求解出无向图的所有割点和割边,但这样的求解方式效率低.Tarjan提出了一种快速求解的方式,通过一次DFS就求解出图中所有的割点和割边 ...
- (四):C++分布式框架——状态中心模块
(四):C++分布式框架--状态中心模块 上篇:(三):C++分布式实时应用框架--系统管理模块 技术交流合作QQ群:436466587 欢迎讨论交流 版权声明:本文版权及所用技术归属smartguy ...
- 两天快速开发一个自己的微信小程序
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Songti SC" } p.p2 { margin: 0.0px 0. ...