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

23 }

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);

总结

蚂蚁面试比较重视基础,所以Java那些基本功一定要扎实。蚂蚁的工作环境还是挺赞的,因为我面的是稳定性保障部门,还有许多单独的小组,什么三年1班,很有青春的感觉。面试官基本水平都比较高,基本都P7以上,除了基础还问了不少架构设计方面的问题,收获还是挺大的。


经历这次面试我还通过一些渠道发现了需要大厂真实面试主要有:蚂蚁金服、拼多多、阿里云、百度、唯品会、携程、丰巢科技、乐信、软通动力、OPPO、银盛支付、中国平安等初,中级,高级Java面试题集合,附带超详细答案,希望能帮助到大家。

蚂蚁金服5面,总结了49个面试题,遇到的面试官都是P7级别以上

加入社区:https://bbs.csdn.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0
拼多多、阿里云、百度、唯品会、携程、丰巢科技、乐信、软通动力、OPPO、银盛支付、中国平安等初,中级,高级Java面试题集合,附带超详细答案,希望能帮助到大家。

[外链图片转存中…(img-O3NbKF8s-1725680249281)]

加入社区:https://bbs.csdn.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值