【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之后,再对 ...
随机推荐
- 转载:Allegro实用技巧之模块复用
http://bbs.ednchina.com/BLOG_ARTICLE_3031842.HTM?click_from=8800032437,9950148743,2016-01-04,EDNCOL, ...
- Memcached 及 Redis 架构分析和区别比较
Memcached和Redis作为两种Inmemory的key-value数据库,在设计和思想方面有着很多共通的地方,功能和应用方面在很多场合下(作为分布式缓存服务器使用等) 也很相似,在这里把两者放 ...
- 企业级应用TOMCAT
第1章 Tomcat 1.1 Tomcat简介 Tomcat是一个免开放源代码的Web应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不多的场合下被普遍使用,是开发调试JSP程序的首选,另 ...
- c语言的数组
1. 数组的基本概念 一个int类型的变量能保存一个人的年龄,如果想保存整个班的年龄呢? 1. 什么是数组 数组,从字面上看,就是一组数据的意思,没错,数组就是用来存储一组数据的 2. 数组的特点 ● ...
- POJ3211--分类01背包
Washing Clothes Time Limit: 1000MS Memory Limit: 131072K Total Submissions: 9700 Accepted: 3110 Desc ...
- Go语言教程5 if switch select
首先您需要有php或是c的基础. 否则可能看不明白 方法如下 if 表达式{ //需要注意的是 没有括号. 没错. 没有括号 比如 if 1>2 {}else{} } else { } s ...
- php接入支付宝的流程
php接入支付宝的流程写在这里供像我一样的小白参考. 1.首先要有一个创建一个应用(选好自己想要的功能,关于支付的功能,貌似都需要签约) 2.下载SDK&Dome(网址https://doc. ...
- 构建Nginx均衡LAMP高性能服务器
LNAMP(Linux+Nginx+Apache+Mysql+PHP)架构受到很多IT企业的青睐,取代了原来认为很好的LNMP(Linux+Nginx+Mysql+PHP)架构,那我们说LNAMP到底 ...
- Netty4 学习笔记之四: Netty HTTP服务的实现
前言 目前主流的JAVA web 的HTTP服务主要是 springMVC和Struts2,更早的有JSP/servlet. 在学习Netty的时候,发现Netty 也可以作HTTP服务,于是便将此整 ...
- codeforge免费下载账号 积分账号 共享账号
codeforge网站下载代码很好,没有积分怎么办?那么多好的matlab代码,matlab程序,C,JAVA等等,都要充值啊!!! 请用下面共享的codeforge账号密码========> ...