1 String对象及其特点
a) 不变性:指String对象一旦生成,则不能在对他进行改变。
b) 对常量池的优化:当两个String对象拥有相同的值时,他们只是引用常量池的同一个进行拷贝(不重新new对象,不分配内存,只是添加一个指针)。
c) 类final的定义:作为final类的Sting对象在系统中不可能有任何子类,这是对系统的保护。
public static void main(String[] args) {
String a = "abc";
String b = "abc";
System.out.println(a==b);
System.out.println(a.equals(b));
}
两个输出都为true,对着个程序进行深度分析:
对于a==b, a中存放的是字符串"abc"在存中存放的地址,b中也是一样,所以a==b的值为true
对于equals方法比较的是a、b中存放内存地址指向的值,由于都是"abc"所以结果也是true。
2 StringBuffer和StringBuider的选择
StringBuffer和StringBuilder是一对孪生兄弟,都是实现了AbstractStringBuilder抽象类,拥有几乎相同的对外接口,最大的不同:StringBuffer对所有的方法是同步的,StringBuilder并没有做任何的同步。
由于方法同步需要消耗一定的系统资源,因此,StringBuilder的效率比较好,但是在多线程中,StringBuilder无法保证线程安全。
String的累加操作:String的concat()方法效率远高于“+”和“+=”运算符,但又远远低于StringBuffer类,通过StringBuffer()和append()方法对String进行累加优化。
程序效率对比:
package lh.zjzk;
public class StringBuilderStringBuffer {
public static void main(String[] args) {
//效率对比
long l1 = System.currentTimeMillis();
String s = "";
for(int i = 0;i < 10000;i++){//使用 + 运算连接做为
s += i;
}
long l2 = System.currentTimeMillis();
System.out.println("+ 运算 时间为:"+(l2-l1));
l1 = System.currentTimeMillis();
String s2 = "";
for(int i = 0;i < 10000;i++){//使用 + 运算连接做为
s2.concat("a");
}
l2 = System.currentTimeMillis();
System.out.println("concat 运算 时间为:"+(l2-l1));
l1 = System.currentTimeMillis();
StringBuffer s3 = new StringBuffer();
for(int i = 0;i < 10000;i++){//使用 + 运算连接做为
s3.append(i);
}
l2 = System.currentTimeMillis();
System.out.println("StringBuffer运算 时间为:"+(l2-l1));
l1 = System.currentTimeMillis();
StringBuilder s4 = new StringBuilder();
for(int i = 0;i < 10000;i++){//使用 + 运算连接做为
s4.append(i);
}
l2 = System.currentTimeMillis();
System.out.println("StringBuilder 运算 时间为:"+(l2-l1));
}
}
结果: