【发布时间】:2016-08-22 16:03:01
【问题描述】:
String类的compareToIgnoreCase方法是使用下面sn-p中的方法实现的(jdk1.8.0_45)。
我。为什么Character.toUpperCase(char) 和Character.toLowerCase(char) 都用于比较?它们中的任何一个都不足以达到比较的目的吗?
二。为什么s1.toLowerCase().compare(s2.toLowerCase()) 不用于实现compareToIgnoreCase? - 我理解相同的逻辑可以以不同的方式实现。但是,我仍然想知道是否有特定的理由选择其中一个。
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;
}
【问题讨论】:
-
s1.toLowerCase().compare(s2.toLowerCase())需要创建两个新的String对象。实际的实现不会创建额外的对象。 -
我猜那里有一些特别奇怪的 Unicode 角落案例。
-
stackoverflow.com/a/16083264/3788176 建议“在土耳其语言环境中有两个不同的大写“i”字母”。
-
@AndyTurner 不过也有对应的小写“i”s。
-
我认为这是链接问题的副本,和/或链接问题是 (stackoverflow.com/questions/15518731/…) 的副本。无论如何,关键点已经在别处进行了总结。
标签: java