src/java.base/share/classes/java/lang/String.java
Print this page
rev 13827 : 8151384: Examine sun.misc.ASCIICaseInsensitiveComparator
Reviewed-by: shade
*** 1220,1253 ****
private static final long serialVersionUID = 8575799808933029326L;
public int compare(String s1, String s2) {
byte v1[] = s1.value;
byte v2[] = s2.value;
! int n1 = s1.length();
! int n2 = s2.length();
! boolean s1IsLatin1 = s1.isLatin1();
! boolean s2IsLatin1 = s2.isLatin1();
! int min = Math.min(n1, n2);
! for (int i = 0; i < min; i++) {
! char c1 = s1IsLatin1 ? StringLatin1.getChar(v1, i)
! : StringUTF16.getChar(v1, i);
! char c2 = s2IsLatin1 ? StringLatin1.getChar(v2, i)
! : StringUTF16.getChar(v2, 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;
}
/** Replaces the de-serialized object. */
private Object readResolve() { return CASE_INSENSITIVE_ORDER; }
}
--- 1220,1235 ----
private static final long serialVersionUID = 8575799808933029326L;
public int compare(String s1, String s2) {
byte v1[] = s1.value;
byte v2[] = s2.value;
! if (s1.coder() == s2.coder()) {
! return s1.isLatin1() ? StringLatin1.compareToCI(v1, v2)
! : StringUTF16.compareToCI(v1, v2);
}
! return s1.isLatin1() ? StringLatin1.compareToCI_UTF16(v1, v2)
! : StringUTF16.compareToCI_Latin1(v1, v2);
}
/** Replaces the de-serialized object. */
private Object readResolve() { return CASE_INSENSITIVE_ORDER; }
}