1. 字符串优化处理
Java对String做了大量优化,主要以下三个方面:
1)不变性 多线程共享时可以省略同步和锁等待的时间
2)针对常量池的优化 拥有相同的值时,它们只引用常量池的同一个拷贝(str.intern()可以返回的即常量池的引用)
3)类型的final定义
1.1 jdk6 subString()方法的内存溢出
jdk6 subString()方法使用的是通过
偏移量来截取字符串,如果for很多次循环截取一个大字符串的一小部分,就容易造成内存溢出,但是jdk 7之后采用的是
System.arraycopy 意思是将截取后的字符串复制一份出来,
另外如果使用jdk6的话,用new String(str.substring(begin,end))返回新字符串也不会出现内存溢出,因为以前的大String对象失去所有的强引用,可以被垃圾回收器回收。
1.2 StringBuffer append() 和 String 常量字符串相加的误区:
1
|
String result =
"a"
+
"b"
+
"c"
+
"d"
;
|
对于常量字符串的累加,Java在编译时就做了充分的优化,对于这些在编译时便能确定取值的字符串操作,在编译时就进行了计算,因此,在运行时上面代码并没有如想象中生成大量的String实例。上诉代码反编译后可以看到就是
String = "abcd";
但是如下代码,Java在编译时不会确定result的值,还是建议用StringBuffer或者StringBuilder
1
2
3
4
5
|
String a =
"a"
;
String b =
"b"
;
String c =
"c"
;
String d =
"d"
;
String result = a + b + c +d ;
|
1.3 StringBuffer 和 StringBuilder 设置容量参数
public StringBuilder(int capacity)
public StringBuffer(int capacity)
如果提前知道容量,可以直接通过构造函数传入,避免数组复制