HashSet去重问题深刻讨论

1、利用HashSet存储数据。是变量时,自动去重。如:

package com.zzxtit.java15;

import java.util.HashSet;
import java.util.Set;


public class SetDemo {

	
	public static void main(String[] args) {
		
		Set<String> set = new HashSet<String>();
		
		set.add("唐僧");  //去重
		set.add("孙悟空");
		set.add("八戒");
		set.add("沙僧");
		set.add("张三");
		set.add("张三");
		set.add("张三");
		
		
		
		Iterator<String> itor = set.iterator();
		
		while(itor.hasNext()){
			
			System.out.println("------------>" + itor.next());
		}
		System.out.println("************************************************");
		
		for(String str : set){
			System.out.println("============>" + str);
		}
			
}

2、存储对象时。不会自动去重。如:

import java.util.HashSet;
import java.util.Set;

/**
 * 
 * HashSet称为散列集,HashSet存储的元素不允许重复
 * 
 * 
 * 
 * 
 * @author Administrator
 *
 */
public class SetDemo {

	
	public static void main(String[] args) {
		
		Set<String> set = new HashSet<String>();
		
	
		addTest();
		
		
	}
	
	
	public static void addTest(){
		
		Set<Student> stuSet = new HashSet<Student>();
	
		stuSet.add(new Student("2017120501", "小W", 1));  //不重构equals方法不去重
		stuSet.add(new Student("2017120501", "小W", 1));  //因为这是两个对象,地址不同
		stuSet.add(new Student("2017120502", "张飞", 1));
		stuSet.add(new Student("2017120503", "关羽", 1));
		
		for(Student stu : stuSet){
			System.out.println("----------------->" + stu);
		}
			
	}	
}


public class Student{

	private String stuNo;
	
	private String stuName;
	
	private int gender;

	private int score;
	
	public Student() {
		super();
	}
	
	public Student(String stuNo, int score) {
		super();
		this.stuNo = stuNo;
		this.score = score;
	}



	public Student(String stuNo, String stuName, int gender) {
		this.stuNo = stuNo;
		this.stuName = stuName;
		this.gender = gender;
	}

	/**
	 * @return the stuNo
	 */
	public String getStuNo() {
		return stuNo;
	}

	/**
	 * @param stuNo the stuNo to set
	 */
	public void setStuNo(String stuNo) {
		this.stuNo = stuNo;
	}

	/**
	 * @return the stuName
	 */
	public String getStuName() {
		return stuName;
	}

	/**
	 * @param stuName the stuName to set
	 */
	public void setStuName(String stuName) {
		this.stuName = stuName;
	}

	/**
	 * @return the gender
	 */
	public int getGender() {
		return gender;
	}

	/**
	 * @param gender the gender to set
	 */
	public void setGender(int gender) {
		this.gender = gender;
	}

	
	public int hashCode(){
		return stuNo.hashCode();
	}
	
	
	
	/* (non-Javadoc)
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
	 return "Student [stuNo=" + stuNo + ", stuName=" + stuName + ", gender=" + gender ;
	}
	
}

输出结果:

--------------------->

--------------------->

--------------------->

--------------------->

----------------->Student [stuNo=2017120501, stuName=W, gender=1, score=0]

----------------->Student [stuNo=2017120501, stuName=W, gender=1, score=0]

----------------->Student [stuNo=2017120503, stuName=关羽, gender=1, score=0]

----------------->Student [stuNo=2017120502, stuName=张飞, gender=1, score=0]

 

HashSet的存储步骤:

①将元素进行Hash----->地址储存

②查看存储位置是否有相同元素,如果有元素,则需要与已存在的进行equals()比较是否相同。如果不相同,则第二个挂在上面。两个并存。

对象不是同一个对象(哪怕元素都相同),所以不相同

来看API中set类的add方法说明(HashSet直接将其继承,没有重写)

add

public boolean add(E e)

如果此 set 中尚未包含指定元素,则添加指定元素。更确切地讲,如果此 set 没有包含满足(e==null ? e2==null : e.equals(e2))的元素 e2,则向此 set 添加指定的元素 e。如果此 set 已包含该元素,则该调用不更改 set 并返回 false。

指定者:

接口 Collection<E>中的 add

指定者:

接口 Set<E>中的 add

覆盖:

AbstractCollection<E>中的 add

参数:

e - 将添加到此 set 中的元素

返回:

如果此 set 尚未包含指定元素,则返回 true

 

 

 

接着来看Object (Student.class的父类)类中的equals():

public boolean equals(Object obj) {
        return (this == obj);
    }

由于两个对象不是同一个对象,所以return false。

 

敲重点了。。。

所以改写Student里的equals()  (其实是重构)

public boolean equals(Object o){//重构equals方法
		if(o == null){//判断o是不是空不差
			return false;
		}else{
			if(this == o){
				return true;
			}else{
				//
				if(o instanceof Student){//判断o是不是student类型
					Student stu = (Student) o;//是学生后强转
					if(stu.getStuNo().equals(getStuNo())){//此时是学号相等时去重
						return true;
					}
				}
				return false;
			}
		}
	}

 

看输出:

--------------------->

--------------------->

--------------------->

--------------------->

----------------->Student [stuNo=2017120501, stuName=W, gender=1, score=0]

----------------->Student [stuNo=2017120503, stuName=关羽, gender=1, score=0]

----------------->Student [stuNo=2017120502, stuName=张飞, gender=1, score=0]

果然小W消失了。

大功告成。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值