描述似乎有误+不理解LegacyMergeSort.userRequested返回True。

来源:5-4 探究Comparator的升序与降序

只能卷了

2022-11-15 23:45:12

问题描述:

这里说是ArrayList的sort方法

https://img.mukewang.com/climg/6373ad16094e84aa06740417.jpg

但我查看源码的时候发现这个是List中的sort

https://img.mukewang.com/climg/6373ad4009e6146806920721.jpg

这里是不是描述有误?

这个是ArrayList的sort

https://img.mukewang.com/climg/6373ae9b09685e4f06680281.jpg


还有一个问题就是在调用Arrays.sort去给List排序时,先判断了传入的Comparator是否为null,不为null再判断一个叫

LegacyMergeSort.userRequested

的东西。userRequested貌似通过匿名内部类的方式去赋值。

https://img.mukewang.com/climg/6373b1b9098ef47e08350178.jpg

但是方法的文档说

> Old merge sort implementation can be selected (for compatibility with broken comparators) using a system property

也就是要使用一个系统属性。这是什么系统属性?为什么课程中直接就说调用legacyMergeSort?

而不是调用优化后的TimSort.Sort?

https://img.mukewang.com/climg/6373b330095fb94605960579.jpg

那个doPrivileged也是个native的方法。最后调用的booleanValue时Boolean类中的方法,那可不可以理解为doPrivileged返回的是个布尔包装类对象?那为什么返回的这个对象的值就是True呢?就像上面课程里的笔记,是True才调用LegacyMergeSort。


(谢谢)


写回答

1回答

好帮手慕小蓝

2022-11-16

同学你好~

1.同学截图中的源码有误,当代码运行时,会根据多态的特性执行ArrayList中的sort方法,而不是List接口中的。

2.系统属性是指虚拟机设置参数,即JVM参数。课程中主要是解释比较器在sort中的应用,如果展开讲解虚拟机参数,会导致重点不明。并且虚拟机参数涉及大量底层知识,不利于同学们的理解。

3.doPrivileged方法返回的是基本数据类型的布尔值,即boolean类型,而不是包装类型Boolean。

https://img.mukewang.com/climg/63744f5109ce973704910089.jpg

4.修改虚拟机参数之后,可以强制采用经典算法,即LegacyMergeSort。

5.由于现在的版本可能更多的是在使用Tim Peter为Python设计的排序算法,即TimSort。

感谢同学的反馈,后续老师会根据最新的算法对本章节进行优化。

祝学习愉快~

1

0 学习 · 9886 问题

查看课程