1 -11 : 文字列高速比較
通常Stringの内容比較には equals メソッドを利用しますが、String.internを利用するとより高速な比較が可能になります。このサンプルでは String.equals 比較:191msec String.intern 比較:30msec と1/6になっています。これはequalsは文字列の内容を比較するのに対し、internを利用すると==で直接参照で比較できるためです。つまり internは文字列の内容と参照を一意に関連付けてくれます。 String a = ""aa""; String b = ""aa""; String ia = a.intern(); // (1) String ib = b.intern(); // (2) の場合、(1) で""aa""が文字列プールに追加され、その参照が返されます。 (2)では""aa""が既に文字列プールに追加されているため(1)で返した参照と同じ参照を返します。つまり ia と ib は同じ文字列オブジェクトを参照することになります。このため == による比較が可能です。もし実際に intern を利用する場合は、== による比較は誤解を招きやすいため、コメントに「equals の代わりに intern, == で比較」など記述した方がいいです。
[InternTest.java]
public class InternTest {
long mills;
public static void main(String args[]) {
InternTest internTest = new InternTest();
internTest.execute();
}
void execute() {
String a = ""AMsoft"";
String b = ""Microsoft"";
String c = ""AMsoft"";
String internA = a.intern();
String internB = b.intern();
String internC = c.intern(); // internA と internC は同じオブジェクトを参照している
final int times = 1000000;
boolean isMatch;
System.out.println(""[比較速度比較]"");
resetTime();
for(int i = 0; i < times; i++) {
isMatch = a.equals(b);
isMatch = a.equals(c);
isMatch = b.equals(b);
}
printTime(""String.equals 比較"");
resetTime();
for(int i = 0; i < times; i++) {
isMatch = (a == b); // == による比較
isMatch = (a == c);
isMatch = (b == c);
}
printTime(""String.intern 比較"");
System.out.println(""[比較の正当性チェック]"");
System.out.println(""(a == b) = "" + (a == b));
System.out.println(""(a == c) = "" + (a == c));
System.out.println(""(b == c) = "" + (b == c));
}
void resetTime() {
mills = System.currentTimeMillis();
}
void printTime(String label) {
System.out.println(label + "":"" + (System.currentTimeMillis() - mills) + ""msec"");
}
}
実行結果
[比較速度比較]
String.equals 比較:191msec
String.intern 比較:30msec
[比較の正当性チェック]
(a == b) = false
(a == c) = true
(b == c) = false