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面试题集合,附带超详细答案,希望能帮助到大家。
加入社区:https://bbs.csdn.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0
拼多多、阿里云、百度、唯品会、携程、丰巢科技、乐信、软通动力、OPPO、银盛支付、中国平安等初,中级,高级Java面试题集合,附带超详细答案,希望能帮助到大家。
[外链图片转存中…(img-O3NbKF8s-1725680249281)]
加入社区:https://bbs.csdn.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0