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

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的大小来判断谁大谁小。

在38到41里,虽然我们用乱序的方式放入了4个学生对象,但TreeSet会自动地对它们进行排序,这点可以从第46行的输出结果里得到验证。

关于集合类的面试文章汇总:

言尽于此,完结

无论是一个初级的 coder,高级的程序员,还是顶级的系统架构师,应该都有深刻的领会到设计模式的重要性。

  • 第一,设计模式能让专业人之间交流方便,如下:

程序员A:这里我用了XXX设计模式

程序员B:那我大致了解你程序的设计思路了

  • 第二,易维护

项目经理:今天客户有这样一个需求…

程序员:明白了,这里我使用了XXX设计模式,所以改起来很快

  • 第三,设计模式是编程经验的总结

程序员A:B,你怎么想到要这样去构建你的代码

程序员B:在我学习了XXX设计模式之后,好像自然而然就感觉这样写能避免一些问题

  • 第四,学习设计模式并不是必须的

程序员A:B,你这段代码使用的是XXX设计模式对吗?

程序员B:不好意思,我没有学习过设计模式,但是我的经验告诉我是这样写的

image

从设计思想解读开源框架,一步一步到Spring、Spring5、SpringMVC、MyBatis等源码解读,我都已收集整理全套,篇幅有限,这块只是详细的解说了23种设计模式,整理的文件如下图一览无余!

image

搜集费时费力,能看到此处的都是真爱!

写的

[外链图片转存中…(img-TPFBF7e7-1714395611995)]

从设计思想解读开源框架,一步一步到Spring、Spring5、SpringMVC、MyBatis等源码解读,我都已收集整理全套,篇幅有限,这块只是详细的解说了23种设计模式,整理的文件如下图一览无余!

[外链图片转存中…(img-WVGoslV0-1714395611995)]

搜集费时费力,能看到此处的都是真爱!

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

  • 8
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值