HashSet是一个不保证元素的顺序且没有重复元素的集合,是线程不安全的。HashSet允许有null元素。
无序:
在HashSet中底层是使用HashMap存储元素的。HashMap底层使用的是数组于链表实现元素的存储。元素在数组中存放时,并不是有序存放的也不是随机存放的,而是对元素的哈希值进行运算决定元素在数组中的位置。
不重复:
当两个元素的哈希值进行运算后得到相同的在数组中的位置时,会调用元素的equals()方法判断两个元素是否相同。如果元素相同则不会添加该元素,如果不相同则会使用单向链表保存该元素。
通过HashSet存储自定义对象:
创建Users对象
public class Users {
private String username;
private int userage;
public Users(String username,int userage){
this.username = username;
this.userage = userage;
}
public Users(){
}
@Override
public boolean equals(Object o){
if(this == o) return true;
if(o == null || getClass() != o.getClass()) return false;
Users users = (Users) o;
if(userage != users.userage) return false;
return username != null ? username.equals(users.username) : users.username == null;
}
@Override
public int hashCode() {
int result = username != null ? username.hashCode() : 0;
result = 31 * result + userage;
return result;
}
public String getUsername(){
return username;
}
public void setUsername(String username){
this.username = username;
}
public int getUserage(){
return userage;
}
public void setUserage(){
this.userage = userage;
}
@Override
public String toString(){
return "Users{" +
"username='" + username + '\'' +
",userage=" + userage + '}';
}
}
在HashSet中存储Users对象
public class HashSetTest2 {
public static void main(String[] args){
//实例化HashSet
Set<Users> set = new HashSet<>();
User u = new Users("小明",18);
User u1 = new Users("小红",18);
set.add(u);
set.add(u1);
System.out.println(u.hashCode());
System.out.println(u1.hashCode());
for(Users users : set){
System.out.println(users);
}
}
}