HashSet是Set接口较为常见的一个子类,该子类的最大特点是不允许保存重复元素,并且所有的内容都采用散列(无序)的方式进行存储。该类定义如下:
public class HashSet<E>
extends AbstracSet<E>
implements Set<E>, Cloneable, Serializable{}
1、使用HashSet保存数据的例子:
package com.mydemo;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Set;
public class HashSetDemo {
public static void main(String[] args) {
// 实例化集合接口
Set<String> all = new HashSet<>();
// 保存数据
all.add("火影");
all.add("火影"); // 保存重复的数据
all.add("水影");
all.add("风影");
all.add("土影");
all.add("雷影");
System.out.println(all);
System.out.println("-------------------------");
/**
* 为解决HashSet无序问题,
* 于是新增了LinkedHashSet子类,
* 实现基于链表的数据保存
*/
// 实例化集合接口
Set<String> all2 = new LinkedHashSet<>();
// 保存数据
all2.add("火影");
all2.add("火影"); // 保存重复的数据
all2.add("水影");
all2.add("风影");
all2.add("土影");
all2.add("雷影");
System.out.println(all2);
}
}
运行结果:
[水影, 风影, 土影, 雷影, 火影]
-------------------------
[火影, 水影, 风影, 土影, 雷影]
2、消除重复元素的例子:
package com.mydemo;
import java.util.HashSet;
import java.util.Set;
public class HashSetDemo {
public static void main(String[] args) {
/**
* 在HashSet集合中,对于重复元素的判断依靠的是Object类中提供的两个方法:
* hash码:public ini hashCode()。
* 对象比较:public boolean equals(Object obj)。
*
* 在进行对象比较的过程中,首先会使用equals()方法进行属性的依次判断,
* 如果全部相同,则为相同元素。
*/
// 实例化集合接口
Set<Member> allMember = new HashSet<>();
// 保存数据
allMember.add(new Member("张三", 15));
allMember.add(new Member("张三", 15)); // 保存重复的数据
allMember.add(new Member("李四", 16));
allMember.add(new Member("王五", 17));
allMember.add(new Member("赵六", 18));
allMember.forEach(System.out::println);
}
}
class Member {
private String name;
private int age;
public Member(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + (name == null ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
// if (!(obj instanceof Member)) {
// return false;
// }
if (getClass() != obj.getClass()) {
return false;
}
Member member = (Member) obj;
if (age != member.age) {
return false;
}
if (name == null) {
if (member.name != null) {
return false;
}
} else if (!name.equals(member.name)) {
return false;
}
return true;
}
@Override
public String toString() {
return "Member{" +
"姓名:'" + name + '\'' +
", 年龄:" + 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;
}
}
运行结果:
Member{姓名:'张三', 年龄:15}
Member{姓名:'李四', 年龄:16}
Member{姓名:'赵六', 年龄:18}
Member{姓名:'王五', 年龄:17}