第五条 避免创建不必要的对象
第五条 避免创建不必要的对象
(1)
String s = new String("S");String s1 = "s";
二者比较当然是第二种更好,因为第一种比第二种多了一个new了个String。
多new一个String小规模看没什么,所以自己试着写了点代码,扩大这个规模,代码如下:
long l1 = new Date().getTime();for(int i = 0; i<1000000; i++) {String s = new String("S");}long l2 = new Date().getTime();System.out.println(l2 - l1);long l3 = new Date().getTime();String s1;for(int i = 0; i<1000000; i++) {s1 = "S";}long l4 = new Date().getTime();System.out.println(l4 - l3);
我的机子分别是47 0差别果然很大。。。
所以Sun推荐用StringBuilder或者StringBuffer
package com.util;public class Test {public static void main(String[] args) {StringBuilder sd = new StringBuilder();sd.append("H").append("ello");String s = "World";sd.append(s);System.out.println(sd);StringBuffer sb = new StringBuffer();sb.append("H").append("ello");String s1 = "World";sb.append(s1).toString();System.out.println(sd);}}
.String, StringBuffer StringBuilder的区别。(Core Java)
答:String的长度是不可变的;
StringBuffer的长度是可变的,如果你对字符串中的内容经常进行操作,特别是内容要修改时,那么使用StringBuffer,如果最后需要 String,那么使用StringBuffer的toString()方法;线程安全;
StringBuilder是从 JDK 5
开始,为StringBuffer该类补充了一个单个线程使用的等价类;通常应该优先使用 StringBuilder
类,因为它支持所有相同的操作,但由于它不执行同步,所以速度更快。
但是好像我写代码时,调不调toString方法都一样。
(2)
注意不要写这种代码
package com.util;public class Test {public static void main(String[] args) {Long sum = 0L;for(long i = 0; i<Integer.MAX_VALUE; i++) {sum +=i;}}}
其中有装箱和拆箱主意代码Long和long的区别就行
总之(1)注意选择好String,把String安排到好的位置
(2)在多次循环中小心java的自动装箱拆箱功能,它也会浪费大量的资源。
(3)如果有些变量是不变的话,那就没必要每次都实例化它,只要一个就够了,可以用singleton,枚举或者其他合适的方法