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
指定者:
覆盖:
类 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消失了。
大功告成。