Java集合方面的面试题:TreeSet、HashSet和LinkedHashSet的各自特点(1)

24 }

在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 }

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
ava开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!**

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 16
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值