String CaseInsensitiveComparator设计思想

寸辰
博客专家认证
2016-07-10 08:56:50
这段时间在看JDK源码,看到String compareToIgnoreCase方法时,看到其使用了静态内部类,并扩展了Comparator<String>, java.io.Serializable这两接口,不理解设计思路


public int compareToIgnoreCase(String str) {
return CASE_INSENSITIVE_ORDER.compare(this, str);
}

public static final Comparator<String> CASE_INSENSITIVE_ORDER
= new CaseInsensitiveComparator();
private static class CaseInsensitiveComparator
implements Comparator<String>, java.io.Serializable {
// use serialVersionUID from JDK 1.2.2 for interoperability
private static final long serialVersionUID = 8575799808933029326L;

public int compare(String s1, String s2) {
int n1 = s1.length();
int n2 = s2.length();
int min = Math.min(n1, n2);
for (int i = 0; i < min; i++) {
char c1 = s1.charAt(i);
char c2 = s2.charAt(i);
if (c1 != c2) {
c1 = Character.toUpperCase(c1);
c2 = Character.toUpperCase(c2);
if (c1 != c2) {
c1 = Character.toLowerCase(c1);
c2 = Character.toLowerCase(c2);
if (c1 != c2) {
// No overflow because of numeric promotion
return c1 - c2;
}
}
}
}
return n1 - n2;
}
}
...全文
247 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
dzq584462393 2016-07-20
  • 打赏
  • 举报
回复
引用 4 楼 wang135139 的回复:
[quote=引用 3 楼 dzq584462393 的回复:] 这个排序的方案只是jdk已经写好提供给的而已,如果实现排序就要实现Comparator接口,既然你已经看String的api,你可以参考Colleactions中的public static <T> void sort(List<T> list, Comparator<? super T> c)方法,序列化因为String能序列化,所以这个也要能序列化
引用 2 楼 jiaotuwoaini 的回复:
Comparator接口有一个compare(T, T)接口,用于在排序的集合中,Serializable 接口是Java的序列化接口。
主要问题在于为何使用私有静态内部类,静态内部类使用接口[/quote] 这个类是String独有,不需要别人在用,而且是单例的,用的时候只需要用类的CASE_INSENSITIVE_ORDER属性即可!
「已注销」 2016-07-20
  • 打赏
  • 举报
回复
主要的思路在于代码复用吧 首先,不区分大小写比较字符串是一个比较常见的需求 简单对比的话,只需要调用String. compareToIgnoreCase(another) 如果用于不区分大小写排序,则需要一个不区分大小写比较的Comparator<String>实例 不管是比较,还是排序,本质上都是比较,就涉及到比较算法的代码复用 1.在compareToIgnoreCase方法里实现比较,在CASE_INSENSITIVE_ORDER的静态实例里调用compareToIgnoreCase() 2.在CASE_INSENSITIVE_ORDER里实现比较,在compareToIgnoreCase里调用CASE_INSENSITIVE_ORDER 无论如何,比较算法代码只能写一份,要么方案1要么方案2 至于私有静态内部类,是因为这个实例不需要实例化多个,可以认为是单态模式的一个变种写法吧
adfldk 2016-07-19
  • 打赏
  • 举报
回复
安全性 。。。
寸辰 2016-07-19
  • 打赏
  • 举报
回复
引用 3 楼 dzq584462393 的回复:
这个排序的方案只是jdk已经写好提供给的而已,如果实现排序就要实现Comparator接口,既然你已经看String的api,你可以参考Colleactions中的public static <T> void sort(List<T> list, Comparator<? super T> c)方法,序列化因为String能序列化,所以这个也要能序列化
引用 2 楼 jiaotuwoaini 的回复:
Comparator接口有一个compare(T, T)接口,用于在排序的集合中,Serializable 接口是Java的序列化接口。
主要问题在于为何使用私有静态内部类,静态内部类使用接口
键圣 2016-07-16
  • 打赏
  • 举报
回复
Comparator接口有一个compare(T, T)接口,用于在排序的集合中,Serializable 接口是Java的序列化接口。
dzq584462393 2016-07-16
  • 打赏
  • 举报
回复
这个排序的方案只是jdk已经写好提供给的而已,如果实现排序就要实现Comparator接口,既然你已经看String的api,你可以参考Colleactions中的public static <T> void sort(List<T> list, Comparator<? super T> c)方法,序列化因为String能序列化,所以这个也要能序列化
寸辰 2016-07-11
  • 打赏
  • 举报
回复
请求各位版主支援

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧