84669 Lernen von Personen
152542 Lernen von Personen
20005 Lernen von Personen
5487 Lernen von Personen
7821 Lernen von Personen
359900 Lernen von Personen
3350 Lernen von Personen
180660 Lernen von Personen
48569 Lernen von Personen
18603 Lernen von Personen
40936 Lernen von Personen
1549 Lernen von Personen
1183 Lernen von Personen
32909 Lernen von Personen
拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...
截图红字的理解基本没错但不完全,正如 @jokester 说的,你没把代码贴全,注意第561行 else 前面的部分。实际上,TreeMap<T>或TreeSet<T>,排序依据有两种情况:
创建时带了Comparator<? super T>,那么排序依据这个Comparator;
创建时不带Comparator<? super T>,那么要求T必须实现Comparable。
所以看TreeSet<Person>的情况,如果创建时带了Comparator<Person>,那么Person完全可以不实现Comparable。
另外,Integer本身实现了Comparable类型,所有基本类型的封装对象(还有Long、Double、Boolean等),以及String都,都实现了Comparable,所以当然可以强转。
最后留一个问题给大家,TreeMap创建时带Comparator的话,为什么要指定类型Comparator<? super K>,而不是Comparator<K>或Comparator<? extends K>?参阅TreeMap的一个构造函数:
Comparator<? super K>
Comparator<K>
Comparator<? extends K>
public TreeMap(Comparator<? super K> comparator);
正確
因爲 class Integer implements Comparable<Integer>
class Integer implements Comparable<Integer>
截图红字的理解基本没错但不完全,正如 @jokester 说的,你没把代码贴全,注意第561行 else 前面的部分。实际上,TreeMap<T>或TreeSet<T>,排序依据有两种情况:
创建时带了Comparator<? super T>,那么排序依据这个Comparator;
创建时不带Comparator<? super T>,那么要求T必须实现Comparable。
所以看TreeSet<Person>的情况,如果创建时带了Comparator<Person>,那么Person完全可以不实现Comparable。
另外,Integer本身实现了Comparable类型,所有基本类型的封装对象(还有Long、Double、Boolean等),以及String都,都实现了Comparable,所以当然可以强转。
最后留一个问题给大家,TreeMap创建时带Comparator的话,为什么要指定类型
Comparator<? super K>
,而不是Comparator<K>
或Comparator<? extends K>
?参阅TreeMap的一个构造函数:public TreeMap(Comparator<? super K> comparator);
正確
因爲
class Integer implements Comparable<Integer>