/** *morestringtests
*/ publicclass Main { publicstaticvoid main(String args[]) {
String test = "0123456789";
String test1 = new String("0123456789"); // different object
String test2 = new String("0123456780"); // different value
String offset = new String("xxx0123456789yyy");
String sub = offset.substring(3, 13);
Object blah = new Object();
/* compare string with a nonzero offset, in left/right side */ Assert.assertEquals(test.compareTo(sub), 0); Assert.assertEquals(sub.compareTo(test), 0); Assert.assertTrue(test.equals(sub)); Assert.assertTrue(sub.equals(test)); /* same base, one is a substring */ Assert.assertFalse(offset.equals(sub)); Assert.assertFalse(sub.equals(offset)); /* wrong class */ Assert.assertFalse(test.equals(blah));
// Regression tests for String.setCharAt() breaking string compression invariants.
Locale en_US = new Locale("en", "US"); Assert.assertEquals("I", /* Small latin dotless i */ "\u0131".toUpperCase()); Assert.assertEquals("abc", "a\u0131c".replace('\u0131', 'b')); Assert.assertEquals("a\u0131c", "abc".replace('b', '\u0131'));
// Regression test for scratch register exhaustion in String.equals() intrinsic on arm64. Assert.assertFalse(result.equals("Very long constant string, so that the known constant count field cannot be embedded in a CMP immediate instruction on arm64. Since it can hold 12-bit values, optionally shifted left by 12, let's go somewhere over 2^12, i.e. 4096. That should trigger the bug with or without string compression. 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/"));
}
publicstaticvoid testCompareToAndEquals() {
String[] strings = { // Special: empty string. "", // Category 0, ASCII strings: // "0123456789abcdef".substring(0, index + 1) "0", "01", "012", "0123", "01234", "012345", "0123456", "01234567", "012345678", "0123456789", "0123456789a", "0123456789ab", "0123456789abc", "0123456789abcd", "0123456789abcde", "0123456789abcdef", // Category 1, ASCII strings: // "0123456789abcdef".substring(0, index) + "x" "x", "0x", "01x", "012x", "0123x", "01234x", "012345x", "0123456x", "01234567x", "012345678x", "0123456789x", "0123456789ax", "0123456789abx", "0123456789abcx", "0123456789abcdx", "0123456789abcdex", // Category 2, ASCII strings, // "0123456789abcdef".substring(0, index) + "x" + // "0123456789abcdef".substring(index + 1) "x123456789abcdef", "0x23456789abcdef", "01x3456789abcdef", "012x456789abcdef", "0123x56789abcdef", "01234x6789abcdef", "012345x789abcdef", "0123456x89abcdef", "01234567x9abcdef", "012345678xabcdef", "0123456789xbcdef", "0123456789axcdef", "0123456789abxdef", "0123456789abcxef", "0123456789abcdxf", "0123456789abcdex", // Category 3, ASCII strings: // "z" + "0123456789abcdef".substring(1, index + 1) "z", "z1", "z12", "z123", "z1234", "z12345", "z123456", "z1234567", "z12345678", "z123456789", "z123456789a", "z123456789ab", "z123456789abc", "z123456789abcd", "z123456789abcde", "z123456789abcdef", // Category 4, non-ASCII strings: // "0123456789abcdef".substring(0, index) + "\u0440" "\u0440", "0\u0440", "01\u0440", "012\u0440", "0123\u0440", "01234\u0440", "012345\u0440", "0123456\u0440", "01234567\u0440", "012345678\u0440", "0123456789\u0440", "0123456789a\u0440", "0123456789ab\u0440", "0123456789abc\u0440", "0123456789abcd\u0440", "0123456789abcde\u0440", // Category 5, non-ASCII strings: // "0123456789abcdef".substring(0, index) + "\u0440" + // "0123456789abcdef".substring(index + 1) "\u0440123456789abcdef", "0\u044023456789abcdef", "01\u04403456789abcdef", "012\u0440456789abcdef", "0123\u044056789abcdef", "01234\u04406789abcdef", "012345\u0440789abcdef", "0123456\u044089abcdef", "01234567\u04409abcdef", "012345678\u0440abcdef", "0123456789\u0440bcdef", "0123456789a\u0440cdef", "0123456789ab\u0440def", "0123456789abc\u0440ef", "0123456789abcd\u0440f", "0123456789abcde\u0440", // Category 6, ASCII strings: // "\u0443" + "0123456789abcdef".substring(1, index + 1) "\u0443", "\u04431", "\u044312", "\u0443123", "\u04431234", "\u044312345", "\u0443123456", "\u04431234567", "\u044312345678", "\u0443123456789", "\u0443123456789a", "\u0443123456789ab", "\u0443123456789abc", "\u0443123456789abcd", "\u0443123456789abcde", "\u0443123456789abcdef", // Category 7, non-ASCII strings: // "0123456789abcdef".substring(0, index) + "\u0482" "\u0482", "0\u0482", "01\u0482", "012\u0482", "0123\u0482", "01234\u0482", "012345\u0482", "0123456\u0482", "01234567\u0482", "012345678\u0482", "0123456789\u0482", "0123456789a\u0482", "0123456789ab\u0482", "0123456789abc\u0482", "0123456789abcd\u0482", "0123456789abcde\u0482", // Category 8, non-ASCII strings: // "0123456789abcdef".substring(0, index) + "\u0482" + // "0123456789abcdef".substring(index + 1) "\u0482123456789abcdef", "0\u048223456789abcdef", "01\u04823456789abcdef", "012\u0482456789abcdef", "0123\u048256789abcdef", "01234\u04826789abcdef", "012345\u0482789abcdef", "0123456\u048289abcdef", "01234567\u04829abcdef", "012345678\u0482abcdef", "0123456789\u0482bcdef", "0123456789a\u0482cdef", "0123456789ab\u0482def", "0123456789abc\u0482ef", "0123456789abcd\u0482f", "0123456789abcde\u0482", // Category 9, ASCII strings: // "\u0489" + "0123456789abcdef".substring(1, index + 1) "\u0489", "\u04891", "\u048912", "\u0489123", "\u04891234", "\u048912345", "\u0489123456", "\u04891234567", "\u048912345678", "\u0489123456789", "\u0489123456789a", "\u0489123456789ab", "\u0489123456789abc", "\u0489123456789abcd", "\u0489123456789abcde", "\u0489123456789abcdef",
}; int length = strings.length; Assert.assertEquals(1 + 16 * 10, length); for (int i = 0; i != length; ++i) {
String lhs = strings[i]; for (int j = 0; j != length; ++j) {
String rhs = strings[j]; int result = $noinline$compareTo(lhs, rhs); finalint expected; if (i == 0 || j == 0 || i == j) { // One of the strings is empty or the strings are the same.
expected = lhs.length() - rhs.length();
} else { int i_category = (i - 1) / 16; int i_index = (i - 1) % 16; int j_category = (j - 1) / 16; int j_index = (j - 1) % 16; int min_ij_index = (i_index < j_index) ? i_index : j_index; if (i_category == j_category) { switch (i_category) { case0: case3: case6: case9: // Differs in length.
expected = lhs.length() - rhs.length(); break; case1: case2: case4: case5: case7: case8: // Differs in charAt(min_ij_index).
expected = lhs.charAt(min_ij_index) - rhs.charAt(min_ij_index); break; default: thrownew Error("Unexpected category.");
}
} elseif (i_category == 3 || i_category == 6 || i_category == 9 ||
j_category == 3 || j_category == 6 || j_category == 9) { // In these categories, charAt(0) differs from other categories' strings.
expected = lhs.charAt(0) - rhs.charAt(0);
} elseif (// Category 0 string is a prefix to any longer string in // remaining categories.
(i_category == 0 && i_index < j_index) ||
(j_category == 0 && j_index < i_index) || // Category 2 string is a prefix to category 3 string at the same // index. Similar for categories 4 and 5 and also 7 and 8. // This includes matching last strings of these pairs of categories.
(i_index == j_index &&
((i_category == 1 && j_category == 2) ||
(i_category == 2 && j_category == 1) ||
(i_category == 4 && j_category == 5) ||
(i_category == 5 && j_category == 4) ||
(i_category == 7 && j_category == 8) ||
(i_category == 8 && j_category == 7)))) { // Differs in length.
expected = lhs.length() - rhs.length();
} else { // The remaining cases differ in charAt(min_ij_index), the characters // before that are "0123456789abcdef".substring(0, min_ij_index). for (int k = 0; k < min_ij_index; ++k) { Assert.assertEquals("0123456789abcdef".charAt(k), lhs.charAt(k)); Assert.assertEquals("0123456789abcdef".charAt(k), rhs.charAt(k));
}
expected = lhs.charAt(min_ij_index) - rhs.charAt(min_ij_index); Assert.assertFalse(expected == 0);
}
} if (expected != result) { thrownew Error( "Mismatch at i=" + i + ", j=" + j + ", expected=" + expected + ", result=" + result);
} boolean equalsExpected =
(i == j) || // Last string in categories 1 and 2.
(i == 32 && j == 48) || (i == 48 && j == 32) || // Last string in categories 4 and 5.
(i == 80 && j == 96) || (i == 96 && j == 80) || // Last string in categories 7 and 8.
(i == 128 && j == 144) || (i == 144 && j == 128); Assert.assertEquals(equalsExpected, $noinline$equals(lhs, rhs));
}
}
// Regression test for incorrectly creating an uncompressed string when the // string should be compressed. Only the low 8 bits are relevant but the whole // `hibyte` was erroneously tested. Bug: 63661357 Assert.assertTrue("A".equals(new String(newbyte[] { (byte)'A' }, /* hibyte */ 0x100)));
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.