
Set 相较于之前的Collection并没有新增方法,因此要研究的是它的实现类
Set的特点 无序 唯一
HashSet (无序唯一) LinkedHashSet (按添加顺序) TreeSet(自然顺序)

HashSet
HashSet
无序:数据展示 并不是添加顺序 (hash表内的顺序)
唯一:数据不重复
注意:
如果存储自定义类型数据 必须重写 hashCode() equals()
如果两个对象的属性值完全一样 会产生相同的hash码 存到hash表内相同的位置
后续存储的数据 如果存到相同的位置 会调用 equals()进行比较 即将存入的数据 与已经存在的数据是否属性值完全一样
如果一样 不存入 不一样在存入
哈希表

HashSet较之父接口Collection和Set也并没有相应的增加方法

HashSet的遍历方式 (两种)
增强for 和 迭代器
@Test
public void test02() {
HashSet<String> set = new HashSet<>();
set.add("张三");
set.add("李四");
set.add("王五");
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()){
String ele = iterator.next();
System.out.println("迭代器 = " + ele);
}
}
@Test
public void test01(){
HashSet<String> set = new HashSet<>();
set.add("张三");
set.add("李四");
set.add("王五");
for (String s : set) {
System.out.println("增强for = " + s);
}
}
LinkedHashSet
有序 添加的顺序
在底层 有 before 记录当前元素 前一个元素
有 after 记录当前元素的后一个元素
唯一 数据不能重复
注意:
如果存储自定义类型数据 必须重写 hashCode() equals() 因为它存储的方式是哈希表
树结构要有比较器,因为元素唯一,哈希表结构要重写hashCode() equals()因为唯一
public class LinkedHashSetTest {
@Test
public void test03(){
Set<Student> set = new LinkedHashSet<>();
Student s1 = new Student("张三", 20);
Student s2 = new Student("李四", 20);
Student s3 = new Student("王五", 20);
Student s4 = new Student("王五", 20);
set.add(s3);
set.add(s2);
set.add(s1);
set.add(s4);
System.out.println("set.size() = " + set.size());
System.out.println("set = " + set);
}
@Test
public void test02(){
LinkedHashSet<Integer> set = new LinkedHashSet<>();
set.add(30);
set.add(20);
set.add(10);
set.add(30);
set.forEach(System.out::println);
}
@Test
public void test01(){
LinkedHashSet<String> linkedHashSet = new LinkedHashSet<>();
linkedHashSet.add("张三");
linkedHashSet.add("李四");
linkedHashSet.add("王五");
linkedHashSet.add("李四");
System.out.println(linkedHashSet);
Iterator<String> iterator = linkedHashSet.iterator();
while (iterator.hasNext()){
String next = iterator.next();
System.out.println("next = " + next);
}
}
}
TreeSet

有序: 排序顺序 默认从小到大
唯一: 数据不能重复
比较条件的值相同 就会去重 ****
注意:
1. 添加自定义类型数据 需要定义比较规则
内部比较器
外部比较器
2.TreeSet 底层是红黑树 二叉树
public class TreeSetTest {
@Test
public void test05(){
//1.创建集合对象
//创建比较规则对象
//多态
Comparator comparator = new Comparator() {
@Override
public int compare(Object o1, Object o2) {
Student s = (Student) o1;
Student s1 = (Student) o2;
return -(s.age - s1.age);
}
};
TreeSet<Student> treeSet = new TreeSet(comparator);
//2.创建学生对象
Student s1 = new Student("张三", 20);
Student s2 = new Student("李四", 18);
Student s3 = new Student("王五", 19);
Student s4 = new Student("赵六", 31);
//3.添加数据
treeSet.add(s4);
treeSet.add(s2);
treeSet.add(s1);
treeSet.add(s3);
//4.遍历展示
for (Student s : treeSet) {
System.out.println(s);
}
}
@Test
public void test04(){
//1.创建集合对象
//创建比较规则对象
SortByAgeOfStudent sortByAgeOfStudent = new SortByAgeOfStudent();
TreeSet<Student> treeSet = new TreeSet(sortByAgeOfStudent);
//2.创建学生对象
Student s1 = new Student("张三", 20);
Student s2 = new Student("李四", 18);
Student s3 = new Student("王五", 19);
Student s4 = new Student("赵六", 31);
//3.添加数据
treeSet.add(s4);
treeSet.add(s2);
treeSet.add(s1);
treeSet.add(s3);
//4.遍历展示
for (Student s : treeSet) {
System.out.println(s);
}
}
@Test
public void test03(){
//1.创建集合对象
TreeSet<Dog> set = new TreeSet<>();
//2.创建小狗对象
Dog dog1 = new Dog("旺财", 2);
Dog dog2 = new Dog("大黄", 3);
Dog dog3 = new Dog("小黑", 5);
Dog dog4 = new Dog("小花", 7);
Dog dog5 = new Dog("小花", 9);
//3.将数据添加到集合
set.add(dog4);
set.add(dog3);
set.add(dog2);
set.add(dog1);
set.add(dog5);
System.out.println("set.size() = " + set.size());
//4.输出集合
for (Dog dog : set) {
System.out.println("dog = " + dog);
}
}
@Test
public void test02(){
TreeSet<String> set = new TreeSet<>();
set.add("A");
set.add("Z");
set.add("a");
set.add("C");
set.add("C");
System.out.println(set);
}
@Test
public void test01(){
//创建TreeSet集合对象
Set<Integer> set = new TreeSet<>();
set.add(9);
set.add(19);
set.add(29);
set.add(29);
set.add(6);
set.add(3);
System.out.println("set.size() = " + set.size());
System.out.println(set);
}
}