专业的JAVA编程教程与资源

网站首页 > java教程 正文

你真的了解java中String的排序规则吗

temp10 2024-10-01 22:29:51 java教程 10 ℃ 0 评论

废话不多说,先来看一下List<String>的排序效果:

你真的了解java中String的排序规则吗

String排序效果图

备注:如果觉得该图不够清晰可前往github下载源码并搜索testStringListCompare方法。

源码地址:https://github.com/stathry/jdkdeep/blob/master/src/org/stathry/jdkdeep/lang/StringTest.java

对于这个排序结果惊不惊喜,意不意外?

如果你并不意外,那恭喜你,说明你是真的了解String的排序规则。

下面解释下上面代码的执行结果为什么是这样子的。

首先Collections.shuffle可以打乱List中元素的顺序这个不多说,

其次Collections.sort会调用List中元素的compareTo方法的来比较两个元素的大小,从而决定元素在List中的先手顺序。这个过程不同的jdk版本略有差异,但排序算法都是类似的,小数组使用快速排序。关于这点此处不再赘述,感兴趣的同学可以去读源码。

然后就到了本文的关键,String类的排序规则,Linus大神说过「Talk is cheap. Show me the code」

直接上源码:

String排序规则图

备注:该图截取自JAVA8 String源码

简单分析下这个比较规则:

首先取两个String的value即char数组的最小长度作为lim, 然后从索引0开始到lim结束,逐个比较两个char的ASCII码值,如果不相等则直接返回ASCII码值的int差值。如果两个char数组从索引0到索引lim的char全相等,则返回两个String长度的差值。顺便说一下这里是升序排序,因为返回比较逻辑是"c1-c2",如果是"c2-c1"那就是降序了。

再回头看开头的排序效果图,你是否有所领悟?

简单点说String的比较规则就是以两个String的最短长度为基准,逐个比较里面的char的ASCII码值,一旦不相同则返回ASCII的差值。如果基准范围内的char的ASCII全相等则返回String长度的差值。

举几个例子:

"com" 与 "COM"比较,字符'C'的ASCII值小于'c',所以"COM"会排在"com"前面;

"COM" 与 "18"比较,基准长度取长度较小的"18"的长度2,字符'C'的ASCII值大于'0',所以"COM"会排在"18"后面;

"aopalliance"与"c3p0"比较,字符'a'的ASCII值小于于'c',所以"aopalliance"会排在"c3p0"前面;

可以发现,只要首字母不一样,比较结果立马就出来了,所以说String的比较如果字符串长度不够大,相似性不高的话性能还是非常高的。

好了,如果觉得有收获记得关注哦。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表