Collections.sort(list)和list.sort(Comparator)的区别

62
我该为什么偏好使用Collections.sort(list)方法,而不是直接调用list.sort()呢?毕竟,Collections.sort内部只是简单地调用List类的sort方法。但是奇怪的是,几乎每个人都告诉我要使用Collections.sort。这是为什么呢?

3
在Java 8之前,需要在接口上使用默认方法后,才能引入list.sort()方法。 - Thorbjørn Ravn Andersen
我不明白为什么不能在没有默认方法的情况下引入list.sort。 - emory
5
在默认方法支持被添加之前,向接口中引入新方法将会破坏该接口的所有现有实现。 - Pieter Müller
1
我不想挑剔,但是你不能使用list.sort(),因为它需要一个参数。所以如果你想使用List的sort方法,你需要写成list.sort(null)。然后每个阅读你代码的人都会想知道null代表什么 -> 自然排序。出于简单和可读性的原因,如果你使用自然排序,我建议坚持使用Collections.sort(list)。在我看来,这样更好。 - math
3个回答

57
你所提到的方法 List.sort(comparator) 是在Java 8中引入的,而实用程序方法Collections.sort自Java 1.2以来一直存在。
因此,你会发现互联网上有很多提到实用程序方法的参考资料,但这只是因为它已经在JDK中存在了很长时间。
需要注意的是,Collections.sort 的实现变化是在8u20中进行的

12

这只是API的一次更改。对于像Java这样广泛使用的语言,通常情况下,在一段时间内,旧方法是首选的,以保持遗留支持。

在这段时间后,旧的API将被弃用(或者可能不会,两者都可以无限期地存在)。在此期间,可能会对新API进行改进,使其功能与原始实现略有不同,鼓励开发人员采用它。新API的要求/结果可能会稍微分歧,并且实现可能会发生巨大变化。

然后,最终,新API接管,旧API不再需要并被删除。在像Java这样广泛使用的语言中,这可能需要数年甚至几十年的时间。开发人员可以计划删除一个API,但必须由社区强制执行。


7
Sun公司以保持向后兼容而著称。这使得20年前的代码可以在现代JVM上不经修改地运行。 - Thorbjørn Ravn Andersen

10
简单来说,Collections.sort 委托 List.sort 进行排序。由于一个调用委托给另一个,它们等效。然而,最好使用 List.sort 以避免额外的方法调用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接