我想知道在优化和性能方面这样做是否相同:
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");
}
答案 0 :(得分:1)
第二个选项将复制原始字符串。这可能不是您想要的,就像您在内存受限的平台上执行它一样,或者如果您多次执行操作,您将导致大量垃圾收集,并最终导致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"));
}
}
}
编译和运行时,在程序异常结束之前,会多次运行incremental和full 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)
答案 1 :(得分:-1)
字符串文字实际上是对象本身,所以第一个应该更好。但它没有任何区别IMO
答案 2 :(得分:-2)
您可以使用简单的逻辑来回答您的问题。像这样:
假设,new String("foo")
在某种意义上比“{1}}更好”。紧接着"foo"
会更好。等等。
new String(new String("foo"))
因此,您可以使用new String(new String(new String("foo")))
。