HashSet特点

1.无序,不允许重复(无序指元素顺序与添加顺序不一致,每次遍历出来的位置不是恒久不变的)

2.HashSet通过调用hashCode()和equals方法来剔除重复

3.HashSet底层使用的数据结构是哈希表

4.HashSet有初始容量16,加载因子0.75.这两个参数都可以设置

剔除重复原理

  • 当向集合中添加数据时,自动帮助调用hascode方法 获取hashcode,结果不相同 则认为是不同对象 添加到集合中 * 如果hashcode中相同 ,再去调用equals方法,再比较一下 来确保一定是同一个对象, 如果内容也相等(即Equals返回true) * 则认为两个对象完全相同,不添加到集合

剔除规则:

1.未重写时,HashSet默认是根据内存地址来去除重复的

2.重写后,根据重写【hashCode()】和【equals()】方法来剔除重复

练习:

HashSet集合中放多个人类对象 Person 姓名 年龄 性别 ,要求 姓名和年龄相同 则是同一个对象,不允许放进集合

person类

package HashSet;
//HashSet集合中放多个人类对象 Person 姓名 年龄 性别 ,要求 姓名和年龄相同 则是同一个对象,不允许放进集合
public class Person {
private String name;
private int age;
private String sex;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", sex=" + sex + "]";
}
public Person(String name, int age, String sex) {
super();
this.name = name;
this.age = age;
this.sex = sex;
}
public Person() {
super();
} //要求 姓名和年龄相同 则是同一个对象,不允许放进集合
@Override
public int hashCode() {
return this.name.hashCode()+this.age*31;
}
@Override
public boolean equals(Object obj) {
if(obj==null){
return false;
}
if(obj==this){
return true;
}
if(obj instanceof Person){
Person person=(Person)obj;
if(person.name.equals(person.name)&&this.age==person.age){
return true;
}
}
return false;
}
}

测试类

package HashSet;

import java.util.HashSet;

public class Test {
public static void main(String[] args) {
HashSet set=new HashSet<>();
set.add(new Person("李白",30,"male"));
set.add(new Person("李白",30,"female"));
set.add(new Person("王勃",30,"male"));
System.out.println(set);
//遍历输出
for (Object object : set) {
System.out.println(object);
}
}
}

输出结果

最新文章

  1. XML实体引用
  2. C++ std命名空间
  3. 集合类 Contains 方法 深入详解 与接口的实例
  4. aspose.cell制作excel常见写法
  5. JAVA_SE复习(OOP2)
  6. IAAS云计算产品畅想-云主机产品内涵
  7. flex——dictionary跟Object的区别与遍历
  8. 从汇编来看i++与++i
  9. C语言 模2除法
  10. Redis 小白指南(二)- 聊聊五大类型:字符串、散列、列表、集合和有序集合
  11. puppet(2)-资源介绍
  12. 大数据新手之路二:安装Flume
  13. [bzoj1571][Usaco2009 Open]滑雪课Ski
  14. JIRA Rest JAVA Client API实现问题管理及自定义字段(原创)
  15. windows 7 64 bit 注册dll
  16. SQLAlchemy如何给列和表添加注释comment?
  17. st试用笔记
  18. MySQL---存储过程 及 条件语句、循环语句
  19. purfer序列题表
  20. tomcat优化总结【持续更新】

热门文章

  1. Android sdk配置 常见问题及处理方法
  2. 安装node-saas包报错问题
  3. NodeJS 阻塞/非阻塞
  4. 【算法系列学习】巧妙建图,暴搜去重 Counting Cliques
  5. ssh公钥认证原理及设置root外的其他用户登录ssh
  6. poj2100还是尺取
  7. AOJ/树二叉搜索树习题集
  8. 阿里云主机试用之自建站点和ftp上传所遇的2个问题
  9. 解析HTML
  10. Java IO详解(一)------File 类