HashSet使用
1.HashSet 特点:
1.无序,不可重复
2.容量自动增长。
2.存储原理:
向Set中添加对象时,首先调用此对象所在类的hashCode()方法,计算次对象的哈希值,
此哈希值决定了此对象在Set中存放的位置;若此位置没有被存储对象则直接存储,
若已有对象则通过对象所在类的equals()比较两个对象是否相同,相同则不能被添加。
添加进Set集合中的元素所在的类一定要重写equals() 和 hashCode()。
要求重写equals() 和 hashCode()方法保持一致。
3.使用场景:
所有的技术都是为了转化为生产力,所以要知道如何取使用技术
如购物车对象转化为订单对象,获取购物车不重复的库存地址
4.hashSet没有get方法,所以遍历的时候,有两种方法,一种是通过迭代器,一种是通过增强for循环
例子
没有重写equals()和hashCode类添加相同元素,可以添加进去:
package test;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class TestSet {
public static void main(String[] args){
Set<Person> set = new HashSet<>();
set.add(new Person(1, 1));
set.add(new Person(1, 3));
set.add(new Person(1, 1));
// 1.迭代器
Iterator iterator = set.iterator();
while (iterator.hasNext()) {
Person person = (Person) iterator.next();
System.out.println("迭代器:"+person);
}
}
}
结果:
迭代器:Person [x=1, y=3]
迭代器:Person [x=1, y=1]
迭代器:Person [x=1, y=1]
重写了equals()方法和hashCode()后
package test;
public class Person {
private int x;
private int y;
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
@Override
public String toString() {
return "Person [x=" + x + ", y=" + y + "]";
}
public Person(int x, int y) {
super();
this.x = x;
this.y = y;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + x;
result = prime * result + y;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Person other = (Person) obj;
if (x != other.x)
return false;
if (y != other.y)
return false;
return true;
}
}
package test;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class TestSet {
public static void main(String[] args){
Set<Person> set = new HashSet<>();
set.add(new Person(1, 1));
set.add(new Person(1, 3));
set.add(new Person(1, 1));
// 1.迭代器
Iterator iterator = set.iterator();
while (iterator.hasNext()) {
Person person = (Person) iterator.next();
System.out.println("迭代器:"+person);
}
/* 2.增强for循环
* for(Person p:set){
System.out.println(p);
}*/
}
}
结果:
迭代器:Person [x=1, y=1]
迭代器:Person [x=1, y=3]
所以一定要重写equals()和hashCode()方法
Set接口有两个子类:HashSet和TreeSet 。
|- HashSet
|- 特点:在不存在重复元素的基础上,还可以进行高速的存取元素。
|- 要求:需要为您的类重写hashCode()和equals()方法。
|- TreeSet
|- 特点:在不存在重复元素的基础上,还可以将元素自动排序。
|- 要求:需要为您的类实现Comparable接口,并重写compareTo方法。
|- 重写compareTo() 可以同时完成两份工作 排序和消除重复。