Java——Set
⼀、介绍
Set集合也是Collection集合的⼦类型,没有特有⽅法。Set⽐Collection定义更严谨,Set集合有如下要求
1. 元素是不能重复的(不能存储两个对象,其equals⽅法⽐较返回true,只能存其中⼀个)
2. 元素不能保证插⼊和取出顺序(⽆序)
3. 元素是没有索引的
⼆、常⽤⼦类
常⽤⼦类有,HashSet、TreeSet、LinkedHashSet。
1. HashSet:底层由HashMap,底层结构哈希表结构。去重、⽆索引、⽆序。哈希表结构的集合,操作效率会⾮常⾼。
2. LinkedHashSet:底层结构链表加哈希表结构,具有哈希表结构的特点,也具有链表的特点。
3. TreeSet:底层是由TreeMap,底层数据结构红⿊树。去重,让存⼊的元素具有排序(升序排序)。
三、Has hSe t
3.1、概述
java.util.HashSet是Set接⼝的实现类,没有特有⽅法。底层是哈希表结构,具有去重特点。
例⼦
Set<Integer> set = new HashSet<>(); set.add(100); set.add(300); set.add(100); set.add(200); System.out.println(set); // [100, 200, 300]
3.2、去重原理分析
HashSet底层结构是哈希表结构,去重的实现借助了 两个⽅法:equals和hashCode⽅法。equals⽅法⽤来⽐较两个对象是否相等,hashCode⽅法⽤来⽣成哈希值的。
3.3、去重原理
⼀个元素存⼊到HashSet中,会先去⽐较是否有哈希值相同的元素(称为哈希冲突)。
如果哈希值不冲突,可以断定两个对象是肯定不⼀样的。
如果哈希值冲突了,进⼀步使⽤equals⽅法进⾏⽐较两个元素是否相同,若不相同可以存⼊。
3.4、去重注意点
HashSet集合,存储⾃定义类型元素时,要保证元素的唯⼀性时,需要在⾃定义类中重写toString()和equals()⽅法。
四、L inke d Has hSe t
LinkedHashSet的特点就是保障存取元素的顺序⼀致。
如果要考虑存取顺序⼀致的情况下,可以考虑使⽤LinkedHashSet。如果存取顺序⼀致不⼀致⽆所谓的情况下,就可以考虑使⽤HashSet。
例⼦
Set<Integer> set = new HashSet<>(); set.add(300); set.add(100); set.add(200); System.out.println(set); // [100, 200, 300] Set<Integer> set2 = new LinkedHashSet<>(); set2.add(300); set2.add(100); set2.add(200); System.ou
五、T r e e Se t
5.1、介绍
java.util.TreeSet集合是Set接⼝的⼀个实现类,底层依赖于TreeMap,是⼀种基于红⿊树结构的实现,具有以下特点
1. 元素去重
2. 元素没有索引
3. 元素有排序
TreeSet元素的排序规则,使⽤元素的⾃然排序规则,或者创建TreeSet时提供的Comparator⽐较器进⾏排序。
5.2、构造⽅法
// 根据其元素的⾃然排序进⾏排序 public TreeSet() // 根据指定的⽐较器进⾏排序 public TreeSet(Comparator<E> comparatro)
5.3、TreeSet⾃然排序
⼀个类只要实现了接⼝Comparable就具备⾃然排序能⼒。⽐如如下类
1. Short
2. Double
3. Integer
4. String
例⼦
equals()方法Set<Integer> set = new TreeSet<>(); set.add(300); set.add(200); set.add(100); System.out.println(set); // [100, 200, 300] Set<String> set2 = new TreeSet<>(); set2.add("abc"); set2.add("aaa"); set2.add("ccc"); set2.add("aba")如果是⾃定义类型,可以在⾃定义类中实现类Comparable接⼝,重写compareTo⽅法更改⾃然排序的规则,如下
Student.java public class Student implements Comparable{ private String name; private int age; // 满参、空参构造⽅法、get、set @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + 
5.4、TreeSet⾃定义排序
TreeSet可以实现⾃定义⽐较器排序,需要使⽤⾃定义⽐较器的构造⽅法,可以⽤来存储不具备⾃然排序能⼒的数据,也可以⽤来覆盖⾃然排序规则。
// 根据指定的⽐较器进⾏排序 public TreeSet(Comparator<E> comparator)
Comparator<E>是⼀个接⼝,我们需要去实现⼀个抽象⽅法compare,我们可以直接定义匿名内部类去实现该⽅法
public int compare(E o1, E o2){ return o1 - o2; // 升序 // 获取 return o2 - o1; // 降序 }
例⼦
// Student.java public class Student { private String name; private int age; // 空参、满参构造⽅法、get、set、 @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + '}'; } } // TreeSetTes
由于上述代码中Student类型没有实现Comparable接⼝,不具备⾃然排序的能⼒,所以就报错了,我们可以在Student中实现Comparable接⼝并重写compareTo⽅法⾃定义排序规则,解决此问
题,如下
这样就不会有问题了,集合中顺序是以年龄的升序排序的,如果年龄⼀致的话,再次⽐较姓名进⾏排序。
也可以在不动Student类的情况下改进,在实例化TreeSet对象的时候,添加参数匿名Comparator对象,如下
public class TreeSetTest { public static void main(String[] args) { Set<Student> set = new TreeSet<>(new Comparator<Student>() { @Override public int compare(Student o1, Student o2) { Age() == o2.getAge()){ 六、注意点
当存储的元素具备⾃然排序,⼜在TreeSet集合中指定了⽐较器排序,优先使⽤⽐较器排序。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。