在main函数的第11到第14行里,我们通过for循环向两种集合里依次放入了1到10这10个String类型的对象,随后我们通过迭代器,在第18和22行通过2个while循环分别按顺序输出它们的值,结果如下:
1 3 2 1 0 7 6 5 4 9 8
2 0 1 2 3 4 5 6 7 8 9
第1行是针对HashSet的输出,从中能看到它的遍历结果和插入的次序不一致;而第二行是针对LinkedHashSet,输出次序和插入的一致。
而TreeSet是SortedSet接口的唯一实现类,它是用二叉树存储数据的方式来保证存储的元素处于有序状态,我们来看如下的TreeSetDemo.java这个例子:
1 //省略import Set集合的代码
2 public class TreeSetDemo {
3 public static void main(String[] args) {
4 Set treeSet = new TreeSet();
5 //以无序的方式向treeSet里插入了若干对象
6 treeSet.add(“4”);
7 treeSet.add(“3”);
8 treeSet.add(“1”);
9 treeSet.add(“2”);
10 //treeSet.add(null); //会有运行期异常
11 //通过迭代器来遍历
12 Iterator setStringIt = treeSet.iterator();
13 while(setStringIt.hasNext()) {
14 System.out.print(setStringIt.next() + " ");
15 }
16 }
17 }
在第4行,我们以泛型的方式创建了一个TreeSet,并从第6到第9行,以无序的方式插入了4个String对象。特别注意,TreeSet不允许插入null值,所以运行第10行的代码时会有异常。
当我们在第14行通过迭代器遍历这个treeSet对象时,会发现输出的次序和插入次序不一致,而且数据已经被排序,结果如下。
1 2 3 4
如果TreeSet里存储的不是上例中的基本数据类型,而是自定义的class,那么这个类必须实现Comparable接口里的compareTo方法,TreeSet会根据compareTo里的定义来区分谁大谁小,最终确定TreeSet里的次序。
我们可以在compareTo方法里定义排序依据。在上文3.2.3部分的compareTo方法里,我们是拿学生的id来作为判断依据,如果两个学生的id相等,那么这个方法的返回值是0,说明这两个学生是相等的(是同一个学生)。此外,该方法还可以返回1或-1,其中1表示大于,-1表示小于。
我们来通过SortedStudent.java这个例子来看TreeSet是如何对自定义类进行排序的。
1 //省略import迭代器和集合类支持包的代码
2 class SortedStudent implements Comparable{
3 private int id;
4 public SortedStudent(int id)
5 {this.id = id;}
6 public int getId()
7 {return id;}
8 //重写equals方法
9 public boolean equals(SortedStudent stu)
10 {
11 if( stu.getId() == this.id )
12 { return true; }
13 else{ return false; }
14 }
15 //根据id的大小来作为排序依据
16 public int compareTo(Object obj) {
17 // 判断是否是学生类型
18 if (obj instanceof SortedStudent) {
19 SortedStudent s = (SortedStudent) obj;
20 // 如果是学生类型,如果学号相等,则不加入Set
21 if (s.getId() == this.getId())
22 { return 0; }
23 else {
24 return s.getId()>this.getId()?1:-1;
25 }
26 // 不是学生类型对象的话就不要加入它
27 } else { return 0; }
28 }
29 }
30 public class SortStudentByID {
31 public static void main(String[] args) {
32 SortedStudent s1 = new SortedStudent(1);
33 SortedStudent s2 = new SortedStudent(2);
34 SortedStudent s3 = new SortedStudent(3);
35 SortedStudent s4 = new SortedStudent(4);
36 Set stuSet = new TreeSet();
37 //这里故意用不排序的方式放入TreeSet
38 stuSet.add(s2);
39 stuSet.add(s4);
40 stuSet.add(s1);
41 stuSet.add(s3);
42 //通过迭代器来遍历这个TreeSet对象
43 Iterator itStu = stuSet.iterator();
44 while(itStu.hasNext()){
45 //能看到有序输出,输出结果是4,3,2,1
46 System.out.println(itStu.next().getId());
47 }
48
49 }
50 }
在第2行的定义SortedStudent类的代码里,我们实现了Compareable接口。在第16行里,我们重写了compareTo方法,在这个方法里,如果两个学生对象的id相等,则认为它们相等,否则将用id的大小来判断谁大谁小。
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!**
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!