集合相关场景

根据年龄对学生对象集合排序 

方法一:使用TreeSet集合 

        TreeSet:是一种可以按照元素大小自动排序的集合,元素不可重复且值不能为null。具有唯一性,但不保证有序性,想要对自定义类型排序需要实现comparable接口或者自定义比较器。其底层是平衡二叉树,采用的是中序遍历。

        具体步骤:构建学生类,使该类实现comparable接口并重写compareTo方法:计算本次输入的年龄与上次的年龄差,若年龄差为0则表示年龄相同需要根据姓名首字母判断;若年龄差为正数则从小到大排序。

方法二:使用数组工具类Arrays.sort()方法

        (可以排序但是不能去重)

        Arrays.sort()底层实现:在Java 7及之前版本中,Arrays.sort()使用了归并排序(Merge Sort)算法,而在Java 8及之后版本中,则使用了TimSort算法。

归并排序:将数组分成两半,然后递归地对这两半进行排序,最后将这两个有序的部分合并成一个有序序列。时间复杂度为O(n log n),是一种稳定的排序算法。

TimSort算法:一种结合了插入排序和归并排序的混合排序算法。排序时会扫描出数组中较小的有序区间,使用插入排序对这些区间进行排序,之后再使用归并排序的策略对区间进行合并。

根据学号和年龄对学生集合去重

具体步骤和原理:

        定义学生类时需要重写hasdCode()和equals()方法,在方法里规定去重的依据。之后将学生类中的每个元素添加到list列表中,再将列表转换为一个hashSet,返回时再转换回列表。

        hashSet插入元素时先计算该元素的hashcode值和集合内已有的元素比较,如果有相同的就调用equals方法比较两个元素,如果返回true就说明重复了,该元素就不会被加进来。

HashSet的遍历顺序和插入顺序一样吗

        HashSet 是一个无序集合,不保证元素的插入顺序或遍历顺序。无序性能提供快速查找操作(平均时间复杂度为 O(1))。

从底层看HashMap和HashSet的区别

        hashMap底层是数组+链表和红黑树。用一维数组存放散列地址,以便更快速的遍历;用链表存放地址值,以便更快的插入和删除,在链表长度大于8时会转换会红黑树。

HashSet底层其实是HashMap实现的,所有放入 HashSet 中的集合元素实际上由 HashMap 的 key 来保存, value 则存储一个静态的 Object 对象。

hashset添加一个null会怎么样,存放在哪里

  hashCode()方法会为null返回0作为哈希码,然后被定位在数组的第一个位置。

为什么要用迭代器操作集合元素而不是for循环?

for循环操作集合元素会有什么问题?

        普通for循环遍历集合过程中如果进行大量删除会报异常,如果少量删除可以成功删除,但是循环的次数会减少,造成结果不准确;增强for循环遍历过程中进行删除会报并发修改异常。

为什么迭代器对集合的增删操作不会出错?

        迭代器内部还是利用ArrayList的添加删除函数进行操作,只不过操作时会对相应的指针进行修改,如果进行了删除操作集合整体长度变小,指向下一个的指针也会相应减小,所以再次访问下一个时就不会发生错误了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值