hashset
hashset存储依据
- (1)根据hashcode计算保存的位置,如果此位置为空,则直接保存,如果不为空执行第二步。
- (2)再执行equals方法,如果equals方法为true,则认为是重复,否则,形成链表
new关键字会新增元素,可以重写equals方法和hashcode方法后可以避免
使用
package Collection.Set.Demo03;
import java.util.HashSet;
/**
* hashset 的使用
* 存储结构:哈希表(数组+单向链表+红黑树)
* (1)根据hashcode计算保存的位置,如果此位置为空,则直接保存,如果不为空执行第二步。
* (2)再执行equals方法,如果equals方法为true,则认为是重复,否则,形成链表
* @author liu
*/
public class Demo01 {
public static void main(String[] args) {
//创建集合
HashSet persons = new HashSet();
//1,添加元素
Person s1 = new Person("刘", 20);
Person s2 = new Person("关", 30);
Person s3 = new Person("张", 40);
persons.add(s1);
persons.add(s2);
persons.add(s3);
//new关键字会新增,重写equals方法和hashcode方法后可以避免
persons.add(new Person("刘",20));
System.out.println(persons);
System.out.println(persons.size());
}
}
person
package Collection.Set.Demo03;
public class Person {
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = 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;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public int hashCode() {
int n1 = this.name.hashCode();
int n2 = age;
return n1 + n2;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (obj instanceof Person) {
Person p = (Person) obj;
if (this.name.equals(p.getName()) && this.age == p.getAge()) {
return true;
}
}
return false;
}
}