一、set接口
1、概述
一个不包含重复元素的collection。
Set集合:元素是唯一的,并且元素的顺序是无序的集合
利用子类Hashset去实现set接口
Set<String> set1 = new HashSet<>();
//向集合中添加元素
set1.add("hello");
set1.add("world");
set1.add("java");
set1.add("bigdata");
set1.add("hello");
//遍历,结果是无序的去重的。
for(String s : set1){
System.out.println(s);
}
2、Hsahset
1、概述:底层数据结构式哈希表(元素是链表的数组),
2、集合中会不会去重取决于元素类有没有重写hashCode()方法和equals()方法
3、LinkedHashSet
1、概述:继承HashSet,实现了Set接口
(1)底层数据结构是哈希表和链表
(2)哈希表保证元素的唯一
(3)链表保证了元素的有序(存储和取出的顺序一致)
(4)线程不安全,效率高
LinkedHashSet<String> set1 = new LinkedHashSet<>();
//添加元素到集合
set1.add("hello");
set1.add("world");
set1.add("java");
set1.add("bigdata");
set1.add("hello");
//遍历
for(String s : set1){
System.out.println(s);
}
结果
hello
world
java
bigdata
4、TreeSet接口
1、特点:元素唯一,元素可以按照某种规则进行排序
自然排序:无参构造,自定义类实在Comparable接口,重写Comparato方法,在Comparato方法中自定义规则。
比较器排序:有参构造,可以使用匿名内部类实现Comparator接口,里面重写Compare方法自定义规则。
2、使用元素的自然顺序对元素进行排序 或者(比较器排序)根据创建 set 时提供的 Comparator 进行排序 具体取决于使用的构造方法,定义的TreeSet是无参构造则是自然排序,若定义的是有参构造则是比较器排序。
3、自然排序:用其他类定义集合元素,在定义类中要实现Comparable接口,重写Comparato方法,不然会进行自然排序,报错,重写Comparato方法可以自定义规则实现去重和排序。
public class Student4 implements Comparable<Student4> {//实现Comparable接口。
private String name;
private int age;
public Student4() {
}
public Student4(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Student4{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public int compareTo(Student4 o) {//自定义规则
//主要条件:姓名的长度排序
int i = this.name.length() - o.name.length();
//长度一样,姓名内容不一定一样
int i2 = i == 0 ? this.name.compareTo(o.name) : i;
//姓名内容一样,年龄的大小不一定一样
int i3 = i2 == 0 ? this.age - o.age : i2;
return i3;
}
}
public class TreeSetDemo3 {
public static void main(String[] args) {
//创建TreeSet集合对象
TreeSet<Student4> set = new TreeSet<>();
//创建学生对象
Student4 s1 = new Student4("mingwang", 18);
Student4 s2 = new Student4("wangyu", 19);
Student4 s3 = new Student4("zhoujiaxiang", 17);
Student4 s4 = new Student4("zhangbaogui", 18);
Student4 s5 = new Student4("liuzhicheng", 18);
Student4 s6 = new Student4("wangyu", 20);
//将学生对象添加到集合中
set.add(s1);
set.add(s2);
set.add(s3);
set.add(s4);
set.add(s5);
set.add(s6);
for(Student4 student4 : set){
System.out.println(student4);
}
}
}
Student4{name='wangyu', age=19}
Student4{name='wangyu', age=20}
Student4{name='mingwang', age=18}
Student4{name='liuzhicheng', age=18}
Student4{name='zhangbaogui', age=18}
Student4{name='zhoujiaxiang', age=17}
4、比较器排序:利用TreeSet创建对象时的带参数的构造方法来进行比较器排序 TreeSet(Comparator<? super E> comparator)
public class TreeSetDemo4 {
public static void main(String[] args) {
//匿名内部类实现Comparator接口
TreeSet<Student5> set = new TreeSet<>(new Comparator<Student5>() {
@Override
public int compare(Student5 o1, Student5 o2) {
// return 0;
//主要条件:姓名的长度排序
int i = o1.getName().length() - o2.getName().length();
// return i;
//长度一样,姓名内容不一定一样
int i2 = i == 0 ? o1.getName().compareTo(o2.getName()) : i;
//姓名内容一样,年龄的大小不一定一样
int i3 = i2 == 0 ? o1.getAge() - o2.getAge() : i2;
return i3;
}
});
//创建学生对象
Student5 s1 = new Student5("mingwang", 18);
Student5 s2 = new Student5("wangyu", 19);
Student5 s3 = new Student5("zhoujiaxiang", 17);
//将学生对象添加到集合中
set.add(s1);
set.add(s2);
set.add(s3);
for(Student5 Student5 : set){
System.out.println(Student5);
}
}
}