Code: Select all
private static String buildSampleString() {
StringBuilder builder = new StringBuilder();
for (int i = 0; i < 10; i++) {
builder.append((char)(i + 'a'));
}
return builder.toString();
}
private static void performTest(String a) {
String b = buildSampleString().intern();
System.out.println("a vs. b: " + (a == b) + ", " + a.equals(b));
System.out.println(b + ": " + System.identityHashCode(b));
}
public static void main(String[] args) {
String a = buildSampleString();
performTest(a);
performComputation(); // see below for details
performTest(a);
}
Code: Select all
buildSampleString()
In der Dokumentation für String.intern() heißt es:
Code: Select all
It follows that for any two strings s and t, s.intern() == t.intern() is true if and only if s.equals(t) is true.
Dies ist der Code für performComputation:
Code: Select all
private static final Random random = new Random();
private static String randomString() {
StringBuilder builder = new StringBuilder();
for (int i = 0; i < 10000000; i++) {
builder.append((char)(random.nextInt(127 - 32) + 32));
}
return builder.toString();
}
private static void performComputation() {
for (int i = 0; i < 10; i++) {
String s = randomString();
System.out.println(s.substring(0, 3) + "..." + s.substring(s.length() - 3));
}
}
Was genau ist hier los?
Bearbeiten: Vollständiger Code zum Reproduzieren des Verhaltens:
Code: Select all
import java.util.Random;
public class Main {
private static final Random random = new Random();
private static String randomString() {
StringBuilder builder = new StringBuilder();
for (int i = 0; i < 10000000; i++) {
builder.append((char)(random.nextInt(127 - 32) + 32));
}
return builder.toString();
}
private static void performComputation() {
for (int i = 0; i < 10; i++) {
String s = randomString();
System.out.println(s.substring(0, 3) + "..." + s.substring(s.length() - 3));
}
}
// ----------------------------------------------------------------------------------------------------------------
private static String buildSampleString() {
StringBuilder builder = new StringBuilder();
for (int i = 0; i < 10; i++) {
builder.append((char)(i + 'a'));
}
return builder.toString();
}
private static void performTest(String a) {
String b = buildSampleString().intern();
System.out.println("a vs. b: " + (a == b) + ", " + a.equals(b));
System.out.println(b + ": " + System.identityHashCode(b));
}
public static void main(String[] args) {
String a = buildSampleString();
performTest(a);
performComputation();
performTest(a);
}
}