关于java中HashSet集合去除重复值的问题

时间:2024-03-12 12:12:26

一、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<Person> se = new HashSet<>();
		se.add(new Person("小花",12));
		se.add(new Person("小草",12));
		se.add(new Person("小树林",12));
		se.add(new Person("小花",12));
		Iterator<Person> 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+"]";
	}

三、运行结果

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

 

  

相关文章