1. Set集合概述
- 特点:无序、无下标、元素不可重复
- 方法:全部继承自Collection中的方法
2. Set接口使用
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class Test {
public static void main(String[] args) {
Set<String> set = new HashSet<>() {
};
set.add("ABC");
set.add("abc");
set.add("123");
System.out.println(set);
System.out.println(set.size());
set.remove("123");
System.out.println(set);
for (String str : set) {
System.out.println(str);
}
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
}
3. HashSet使用
- 基于HashCode计算元素存放位置
- 当存入元素的哈希码相同时,会调用equals进行确认,如结果为true,则拒绝后者存入
import java.util.HashSet;
import java.util.Iterator;
public class Test {
public static void main(String[] args) {
HashSet<String> hashSet = new HashSet<>();
hashSet.add("ABC");
hashSet.add("abc");
hashSet.add("123");
System.out.println(hashSet);
System.out.println(hashSet.size());
hashSet.remove("123");
System.out.println(hashSet);
for (String str : hashSet) {
System.out.println(str);
}
Iterator<String> iterator = hashSet.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
System.out.println(hashSet.contains("ABC"));
System.out.println(hashSet.isEmpty());
}
}
4. HashSet存储方式
- 根据HashCode,计算数组的保存位置,如果此位置为空,则直接保存,不为空则不保存
- 执行equals方法,如果equals返回为true,则认为是重复,否则形成链表
import java.util.HashSet;
import java.util.Objects;
public class Test {
public static void main(String[] args) {
HashSet<Student> hashSet = new HashSet<>();
Student student1 = new Student("A", 10);
Student student2 = new Student("B", 20);
Student student3 = new Student("C", 30);
hashSet.add(student1);
hashSet.add(student2);
hashSet.add(student3);
hashSet.add(new Student("C", 30));
System.out.println(hashSet);
}
}
class Student {
String name;
int age;
Student(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Student)) return false;
Student student = (Student) o;
return age == student.age && Objects.equals(name, student.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
5. TreeSet概述
- 基于排列顺序实现元素不重复
- 实现了SortedSet接口,对集合元素自动排序
- 元素对象的类型必须实现Comparable接口,指定排序规则
- 通过compareTo方法确定是否为重复元素
6. TreeSet使用
import java.util.Iterator;
import java.util.TreeSet;
public class Test {
public static void main(String[] args) {
TreeSet<String> treeSet1 = new TreeSet<>();
treeSet1.add("ABC");
treeSet1.add("abc");
treeSet1.add("123");
System.out.println(treeSet1);
System.out.println(treeSet1.size());
treeSet1.remove("123");
System.out.println(treeSet1);
for (String str : treeSet1) {
System.out.println(str);
}
Iterator<String> iterator1 = treeSet1.iterator();
while (iterator1.hasNext()) {
System.out.println(iterator1.next());
}
TreeSet<Student> treeSet2 = new TreeSet<>();
Student student1 = new Student("A", 10);
Student student2 = new Student("B", 20);
Student student3 = new Student("C", 30);
treeSet2.add(student1);
treeSet2.add(student2);
treeSet2.add(student3);
treeSet2.add(new Student("C", 25));
System.out.println(treeSet2);
System.out.println(treeSet2.size());
treeSet2.remove(new Student("C", 25));
System.out.println(treeSet2);
for (Student student : treeSet2) {
System.out.println(student);
}
Iterator<Student> iterator2 = treeSet2.iterator();
while (iterator2.hasNext()) {
System.out.println(iterator2.next());
}
}
}
class Student implements Comparable<Student> {
String name;
int age;
Student(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public int compareTo(Student o) {
int num1 = this.name.compareTo(o.name);
int num2 = this.age - o.age;
return num1 == 0 ? num2 : num1;
}
}
7. Comparator接口
import java.util.Comparator;
import java.util.TreeSet;
public class Test {
public static void main(String[] args) {
TreeSet<Student> treeSet = new TreeSet<>(new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
int num1 = o1.age - o2.age;
int num2 = o1.name.compareTo(o2.name);
return num1 == 0 ? num2 : num1;
}
});
Student student1 = new Student("A", 10);
Student student2 = new Student("B", 20);
Student student3 = new Student("C", 30);
treeSet.add(student1);
treeSet.add(student2);
treeSet.add(student3);
treeSet.add(new Student("C", 25));
System.out.println(treeSet);
}
}
class Student {
String name;
int age;
Student(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}