网站首页 > java教程 正文
废话不多说,先来看一下List<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的比较如果字符串长度不够大,相似性不高的话性能还是非常高的。
好了,如果觉得有收获记得关注哦。
猜你喜欢
- 2024-10-01 Java中String类字符串拼接谁的效率最低
- 2024-10-01 100个Java工具类之2:字符串之多种个性化格式处理
- 2024-10-01 每天积累一点点(Java基础——》String类学习——one day)
- 2024-10-01 Java动态加载Jar实例解析(java动态加载类框架)
- 2024-10-01 Java中如何使用正则技术提取html中的任意内容
- 2024-10-01 Java String 常用方法,涵盖全部(java string的用法)
- 2024-10-01 在Java中将String转换为char(java string转换char)
- 2024-10-01 「JavaWeb基础」文件上传和下载(修订版)
- 2024-10-01 浅谈Java中字符串的初始化及字符串操作类
- 2024-10-01 MySql字符串拆分实现split功能(字段分割转列、转行)
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)