集合相关知识总结:
集合【3】 — ArrayList和LinkedList区别与联系(面试题)
集合【4】— Set
1. Set集合
集合中的元素不能①重复,②无序(按照自己的方式进行排序,排序方式比较复杂,所以很多人认为它是无序的)
1.1 HashSet
HashSet实现了Set接口,使用哈希算法对集合进行排序
- 特征:集合中的元素不能重复, List集合可以重复
1.1.1 HashSet创建
Set set = new HashSet();
1.1.2 放入HashSet容器(集合)
集合内部元素不可以重复
HashSet元素与元素之间没有关联,所以不能进行get(). --》 直接用 System.out.println(set); ,可以输出所有元素但是是无序的,和存入的顺序一点关系都没有。
【示例】
场景:创建一个Student类型的对象有id和name属性,创建5个Student类型对象,将其放入HashSet中,观察会发生什么情况。
小结:HashSet判断元素是否相同的规则是:hashCode相同并且equals相等就是相同元素
1 新元素(对象)放入集合之前会检查新对象的HashCode在集合中是否存在(有相同的),如果有
2 在调用equals()方法,判断新元素是否和集合中存在的元素相等
3 如果新元素的hashCode在集合中存在,并且equals判断也相等,就是重复的元素不会加入到集合
Studeng类型由于没有覆盖Object的hashCode()方法和equals()方法,所以hashCode是不相同的,就会放入集合
如何解决?一旦定义实体类必须重写覆盖Object类型的toString()、hashCode()、equals()方法,因为你的实体类有可能放入HashSet集合。
HashSet判断元素是否相同的规则是:hashCode相同并且equals相等就是相同元素
重写覆盖Object类型的toString()、hashCode()、equals()方法
1.2 LinkedHashSet
HashSet前缀加了个Linked,变成了有序的,add()方法放入的顺序和取出的顺序是一样一样的。
2. 使用HashSet解决实际问题
2.1 对ArrayList去重
将ArrayList重复的元素去掉?
步骤:1 创建HashSet对象,然后将ArrayList的数据放入HashSet集合中
2 ArrayList数据清空 clear() 7—>0
3 将HashSet的元素放入(加入)ArrayList
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* 去掉ArrayList重复的元素,Tom重复
*/
public class TestHashSet {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("Tom");
list.add("Tomson");
list.add("Tomas");
list.add("Tom");
list.add("Jerry");
/*
* 重构:重新组织你的代码结构
1选中要提取的代码
2反键Refactor-->Exract Method(提取方法)
3为要提取的方法命名
*/
distinct(list);
System.out.println(list);
}
public static void distinct(List<String> list) {
Set<String> set = new HashSet<>();
set.addAll(list);
list.clear();
list.addAll(set);
}
}
2.2 白名单
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
/**
* 白名单是一个HashSet集合,里面存储了若干个手机号码
* 从控制台输入一个手机号码,判断是否在白名单中,如果不在,执行操
*/
public class TestHashSet3 {
/**
* 白名单集合只加载一次,所以使用final static
*/
private final static Set<String> MOBILE_SET = new HashSet<>();
static{
MOBILE_SET.add("15689678943");
MOBILE_SET.add("15689678948");
MOBILE_SET.add("15689678947");
MOBILE_SET.add("15689678946");
MOBILE_SET.add("15689678941");
}
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("请输入手机号码");
String mobile = input.next();
//条件成立:表示输入的手机号码不在白名单中,执行下面操作
if(!MOBILE_SET.contains(mobile)){
System.out.println("执行操作");
}
}
}