-2

最適化とパフォーマンスの観点から、これを行うのと同じかどうかを知りたかったのです。

public class Test {

    public static void main(String[] args) {        

        String option1 = "Text 1";
        String option2 = "Text 2";
        String option3 = "Text 3";

}

以下より:

public class Test {

    public static void main(String[] args) {        

        String option1 = new String("Text 1");
        String option2 = new String("Text 2");
        String option3 = new String("Text 3");

}
4

3 に答える 3

1

2 番目のオプションは、元の文字列のコピーを作成します。メモリに制約のあるプラットフォームで実行したり、操作を何度も実行したりすると、大量のガベージ コレクションが発生し、最終的に OutOfMemoryError が発生するため、これはおそらく望ましくありません。

例として、次の例を作成しました。

public class Outie {

    public static void main(String[] args) {
        java.util.ArrayList<String> al = new java.util.ArrayList<String>();
        while (true) {
            al.add(new String("Outie"));
        }
    }
}

コンパイルして実行すると、インクリメンタル GC とフル GC が数回実行されてから、プログラムが異常終了します。

$ java -verbosegc Outie
[GC 27648K->21021K(106048K), 0.0232500 secs]
[GC 48669K->39738K(133696K), 0.0251830 secs]
[GC 82898K->82549K(138880K), 0.0513920 secs]
[Full GC 82549K->75130K(226880K), 0.6177140 secs]
[GC 124479K->139363K(252672K), 0.0547170 secs]
[Full GC 139363K->112517K(352448K), 0.6634360 secs]
[GC 185168K->208879K(381952K), 0.0711140 secs]
[Full GC 208879K->168535K(515520K), 1.1115060 secs]
[GC 277163K->312989K(571200K), 0.1107330 secs]
[GC 379933K->307985K(615616K), 0.1115700 secs]
[GC 374929K->374905K(618944K), 0.1452780 secs]
[GC 521181K->467291K(650752K), 0.7257080 secs]
[GC 532443K->532619K(687936K), 1.1450690 secs]
[Full GC 532619K->507837K(965824K), 3.0001520 secs]
[GC 720339K->720812K(965824K), 0.8367880 secs]
[GC 811628K->811932K(998976K), 0.8454970 secs]
[Full GC 811932K->730029K(1352448K), 3.9708660 secs]
[GC 1036526K->1037014K(1352448K), 0.8832300 secs]
[GC 1160982K->1161502K(1400576K), 0.8352880 secs]
[Full GC 1161502K->1038805K(1544192K), 5.5201590 secs]
[GC 1205141K->1205495K(1544192K), 0.9881680 secs]
[GC-- 1281377K->1423593K(1544192K), 1.6090210 secs]
[Full GC 1423593K->1277979K(1544192K), 7.9840780 secs]
[Full GC 1277979K->1277965K(1544192K), 6.1397000 secs]
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOf(Arrays.java:2245)
    at java.util.Arrays.copyOf(Arrays.java:2219)
    at java.util.ArrayList.grow(ArrayList.java:213)
    at java.util.ArrayList.ensureCapacityInternal(ArrayList.java:187)
    at java.util.ArrayList.add(ArrayList.java:411)
    at Outie.main(Outie.java:6)
于 2013-05-13T23:31:49.837 に答える
-2

簡単なロジックを使用して質問に答えることができます。そのようです:

は、ある意味で、単なるnew String("foo")よりも「優れている」とし"foo"ます。すぐに、それnew String(new String("foo"))はさらに良いことになります。などなど。

明らかに、これはナンセンスです。誰も書いてない

new String(new String(new String("foo"))) 

したがって、そのまま使用できます"foo"

于 2013-05-13T23:37:38.370 に答える