java set去重复元素_关于java中HashSet集合去除重复值的问题

一、HashSet中去除重复值的原理

在像HashSet集合中添加一个元素的时候,会先用其hashcode进行比较,如果hashcode相等,那么在调用equals方法

来判断这两个元素是否是同一个元素,如果是同一个元素的话,就不允许添加进来,这就是HashSet中元素的单一性。

二、实现HashSet保存自定义对象Person,Person类字段为String name,int age;要求:去除集合中姓名,年龄相同的Person对象

1、先编写一个Person类,其中字段包括String name,int age ;

public class Person {

private String name;

private int age;

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 Person(String name,int age){

super();

this.age=age;

this.name=name;

}

2、创建一个HashSet集合并在其中放入几个元素,添加两个相同的元素。

import java.util.HashSet;

import java.util.Iterator;

import java.util.Set;

public class Test3 {

public static void main(String[] args) {

Set se = new HashSet<>();

se.add(new Person("小花",12));

se.add(new Person("小草",12));

se.add(new Person("小树林",12));

se.add(new Person("小花",12));

Iterator it= se.iterator();

//利用集合中的迭代器,将集合中的每个元素都输出。

while(it.hasNext()){

System.out.println(it.next());

}

}

}

3、在Person类中重写HashCode方法

public class Person {

private String name;

private int age;

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 Person(String name,int age){

super();

this.age=age;

this.name=name;

}

@Override

//重写hashCode方法,因为包括了年龄和姓名,其中姓名是字符串,所以有其对应的哈希值,将其乘五的意思是,降低发生碰撞的几率。

public int hashCode() {

return name.hashCode()*5+age;

}

4、在Person中重写equals方法

public class Person {

private String name;

private int age;

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 Person(String name,int age){

super();

this.age=age;

this.name=name;

}

public boolean equals( Object o) {

if(o==null){

throw new RuntimeException("不能为空值");

}

//先判断该值是否为null,若是的话,就抛出一个异常

if(!(o instanceof Person)){

throw new RuntimeException("这不是person的对象");

}

//在判断其是不是Person类的对象,如果不是的话,就抛出一个异常

Person p = (Person) o;

return (p.getAge()==this.age)&&(this.name.equals(p.getName()));

//最后判断姓名和年龄是不是相等的

}

5、记得重写一下tostring方法,因为默认的每个字符串都会继承Object的toString方法,因为要将其中的元素显示出来,所以要重写一下toString方法。

public class Person {

private String name;

private int age;

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 Person(String name,int age){

super();

this.age=age;

this.name=name;

}

@Override

public String toString() {

// TODO Auto-generated method stub

return "["+"姓名"+":"+name+" "+"年龄"+":"+age+"]";

}

三、运行结果

ac1d88e6ac8b02fbd63519dc52a7e7df.png

从运行结果中,不难看出,HashSet元素的唯一性,当姓名和年龄都相等的时候,就不会让该元素添加进来。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值