根据年龄对学生对象集合排序
方法一:使用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的添加删除函数进行操作,只不过操作时会对相应的指针进行修改,如果进行了删除操作集合整体长度变小,指向下一个的指针也会相应减小,所以再次访问下一个时就不会发生错误了。