文章目录
- 1.概述
- 2.Set集合的特点
- 3.常用方法
- 4.HashSet
- 4.1 概述
- 4.2 练习: Set相关测试一
- 4.3 练习: Set相关测试二
1.概述
- Set是一个不包含重复数据的Collection
- Set集合中的数据是无序的(因为Set集合没有下标)
- Set集合中的元素不可以重复 – 常用来给数据去重
2.Set集合的特点
- 数据无序且数据不允许重复
- HashSet : 底层是哈希表,包装了HashMap,相当于向HashSet中存入数据时,会把数据作为K,存入内部的HashMap中。当然K仍然不许重复。
- TreeSet : 底层是TreeMap,也是红黑树的形式,便于查找数据
3.常用方法
学习Collection接口中的方法即可
4.HashSet
4.1 概述
底层是哈希表,包装了HashMap,相当于向HashSet中存入数据时,会把数据作为K存入内部的HashMap中,其中K不允许重复,允许使用null.
4.2 练习: Set相关测试一
package partThree;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
/*本类用于测试Set*/
public class TestSet {
public static void main(String[] args) {
//1.创建对应的集合对象
Set<String> set = new HashSet<>();
//2.存入数据
set.add("紫霞仙子");
set.add("至尊宝");
set.add("蜘蛛精");
set.add("紫霞仙子");
set.add(null);
/*1.set集合中的元素都是没有顺序的
* 2.set集合中的元素不能重复
* 3.set集合可以存null值,但是最多只有一个*/
System.out.println(set);//[蜘蛛精, null, 至尊宝, 紫霞仙子]
//3.常用方法测试
System.out.println(set.contains("唐僧"));//false,判断是否包含指定元素
System.out.println(set.isEmpty());//false,判断是否为空
System.out.println(set.remove(null));//true,移除指定的元素
System.out.println(set);//[蜘蛛精, 至尊宝, 紫霞仙子]
System.out.println(set.size());//3,获取集合中元素的个数
System.out.println(Arrays.toString(set.toArray()));//[蜘蛛精, 至尊宝, 紫霞仙子],将集合转为数组
//4.1创建set2集合,并向集合中存入数据
Set<String> set2 = new HashSet<>();
set2.add("小兔纸");
set2.add("小脑斧");
set2.add("小海疼");
set2.add("小牛犊");
System.out.println(set2);//[小兔纸, 小海疼, 小牛犊, 小脑斧]
System.out.println(set.addAll(set2));//将set2集合的所有元素添加到set集合中
System.out.println(set);//[蜘蛛精, 小兔纸, 小海疼, 至尊宝, 小牛犊, 小脑斧, 紫霞仙子]
System.out.println(set.containsAll(set2));//判断set2集合的所有元素是否都在set集合中
System.out.println(set.removeAll(set2));//删除set集合中属于set2集合的所有元素
System.out.println(set);//[蜘蛛精, 至尊宝, 紫霞仙子]
System.out.println(set.retainAll(set2));//只保留set集合中属于set和set2集合的公共元素
System.out.println(set);//[]
//5.集合的迭代
Iterator<String> it = set2.iterator();//5.1获取集合的迭代器
while(it.hasNext()) {//5.2判断集合是否有下个元素
String s = it.next();//5.3如果有,进循环获取当前遍历到的元素
System.out.println(s);
}
}
}
4.3 练习: Set相关测试二
- 创建自定一引用类型student3
package partThree;
import java.util.Objects;
//1.创建自定义引用类型Student3
public class Student3 {
//2.创建属性
String name;//姓名
int id;//学号
//3.提供本类的全参构造
public Student3(String name, int id) {
this.name = name;
this.id = id;
}
//3.2提供学生类的toString()
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", id=" + id +
'}';
}
//3.3添加学生类重写的equals()与hashCode()
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student3 student = (Student3) o;
return id == student.id && Objects.equals(name, student.name);
}
@Override
public int hashCode() {
return Objects.hash(name, id);
}
}
- 创建类: TestSet2.java
package partThree;
import java.util.HashSet;
import java.util.Set;
/*本类用于进一步测试set*/
public class TestSet2 {
public static void main(String[] args) {
//4.创建集合对象set
Set<Student3> set = new HashSet<>();
//5.创建自定义类Student的对象
Student3 s1 = new Student3("张三",3);
Student3 s2 = new Student3("李四",4);
Student3 s3 = new Student3("李四",4);
//6.将创建好的学生对象存入set集合中
set.add(s1);
set.add(s2);
set.add(s3);
/*如果set中存放的是我们自定义的类型
* 需要给自定义类中添加重写的equals()与hashCode(),才会去重
* 不然会认为s2和s3的地址值不同,是两个不同的对象,不会去重*/
System.out.println(set);
}
}