Java 为什么将同一个字符的大小写分别改为大写和小写进行两次比较?
下面的代码是java中的类字符串。我不明白为什么两个不同字符串中的字符会比较两次。 首先,用大写字母表示,如果用小写字母表示失败 我的问题是,这是必须的吗?若有,原因为何Java 为什么将同一个字符的大小写分别改为大写和小写进行两次比较?,java,string,unicode,comparator,Java,String,Unicode,Comparator,下面的代码是java中的类字符串。我不明白为什么两个不同字符串中的字符会比较两次。 首先,用大写字母表示,如果用小写字母表示失败 我的问题是,这是必须的吗?若有,原因为何 public static final Comparator<String> CASE_INSENSITIVE_ORDER = new CaseInsensitiveComparator(); privat
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;
}
}
公共静态最终比较器大小写不敏感\u顺序
=新的不区分大小写比较器();
私有静态类不区分大小写比较程序
实现Comparator,java.io.Serializable{
//使用JDK 1.2.2中的serialVersionUID实现互操作性
私有静态最终长serialVersionUID=85757998089333029326L;
公共整数比较(字符串s1、字符串s2){
int n1=s1.length();
int n2=s2.length();
int min=数学最小值(n1,n2);
对于(int i=0;i
问题可能更复杂
有一些字符,其中同一个大写代码点有多个小写代码点,反之亦然。因此,要检查不区分大小写的匹配,如果其中一个匹配,则需要比较大写和小写版本
一个例子是
希腊大写字母“∑”有两种不同的小写形式:“ς”在单词的最后位置,而“σ”在其他位置
资料来源:
对于大写字母不相等但小写字母非常多的情况,提供了以下极好的示例:
更好的例子是“\u0130”(İ)和“I”。通过toUpperCase传递它们会使它们保持不变(因此不同),但通过toLowerCase传递它们会导致相同的字符值
你能举个例子吗?字符串和字符不处理字符集;字符集仅用于将这些字符编码为字节。维基百科上写道:“希腊大写字母“∑”有两种不同的小写形式:“ς”在单词的最后位置,而“σ”在其他位置。”但这与字符集有什么关系呢?@Jan也许你可以这么说“有些字母的同一大写字符有多个小写字符”或更准确地说“有些字母的同一大写代码点有多个小写代码点”更好的例子是
“\u0130”
(İ)和'I'
。通过toUpperCase传递它们会使它们保持不变(因此不同),但通过toLowerCase传递它们会导致相同的字符值。