1 -11 : 文字列高速比較

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