關於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<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元素的唯一性,當姓名和年齡都相等的時候,就不會讓該元素添加進來。

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM