Java 为什么将同一个字符的大小写分别改为大写和小写进行两次比较?

Java 为什么将同一个字符的大小写分别改为大写和小写进行两次比较?,java,string,unicode,comparator,Java,String,Unicode,Comparator,下面的代码是java中的类字符串。我不明白为什么两个不同字符串中的字符会比较两次。 首先,用大写字母表示,如果用小写字母表示失败 我的问题是,这是必须的吗?若有,原因为何 public static final Comparator<String> CASE_INSENSITIVE_ORDER = new CaseInsensitiveComparator(); privat

下面的代码是java中的类字符串。我不明白为什么两个不同字符串中的字符会比较两次。 首先,用大写字母表示,如果用小写字母表示失败

我的问题是,这是必须的吗?若有,原因为何

  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传递它们会导致相同的字符值。