HashSet:
1. HashSet:不能存储相同的元素。不能保证元素的排列顺序,不是线程安全的,集合元素可以使 null。
2.Set 接口的最典型实现,通常使用 Set 集合时都使用这个实现类。
3.按 Hash 算法来存储集合中的元素,因此具有很好的存取和查找性能。
4.当向 HashSet 集合中存入一个元素时,HashSet会调用该对象的 hashCode() 方法来得到该对象的hashCode 值,然后根据 hashCode 值决定该对象在 HashSet 中的存储位置,这就是不能保证元素排列顺序的原因。
5.如果两个对象的 equals() 方法返回 true,一般的他们的hashCode()值也相等。但我们可以通过重写equals方法让两个不同对象equals方法返回true,同时重写hashcode方法返回不同的值。所以,尽管两个对象” 表面”相同,还是能添加到HashSet集合中的,且他们会插入不同的位置。如下面代码所示:
[java] view plaincopy
import java.util.HashSet;
import java.util.Set;
public class testHashSet {
public static void main(String[] args) {
Student stu1 = new Student("AA", 12);
Student stu2 = new Student("AA", 12);
Set set = new HashSet();
System.out.println(stu1.equals(stu2));//true ,表明stu1和stu2为相同的元素
set.add(stu1);
set.add(stu2);
System.out.println(set.size());//2,表明成功添加了"相同"的元素
}
}
class Student {
private String name;
private int age;
public Student() {
}
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 Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
// 重写hashcode方法,让其每执行一次返回的值都加1
private static int initHashCode = 1;
@Override
public int hashCode() {
return initHashCode++;
}
// 重写equals,让其只要判定对象内容相等就返回true.
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (!(obj instanceof Student))
return false;
Student other = (Student) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
这是我博客上的,我直接截取了一段过来,你可以看看,希望能帮到你
|