String类
String类对象代表不可变的Unicode字符序列,因此我们可以将String对象称为不可变对象。
String源码中:
/**The value is used for character actorage.*/
private final char value();
finalc 修饰字符串存储的数组,只能被初始化一次。
public class TestString {
public static void main (String[] args){
String s1 = new String("abcdefg");
String s2 =s1.substring(2,4);
System.out.println(s2);
System.out.println(s1.hashCode());
System.out.println(s2.hashCode());
}
}
StringBuffer
线程安全,做线程同步检测 ,效率低
StringBuilder
线程不安全,不做线程同步检测,效率高。(建议用此类)
StringBuffer的例子:
StringBuilder的例子:
String和StringBuilder的效率测试:
package SString;
public class Test {
public static void main(String[] args) {
/*使用String进行字符串的拼接*/
String str8 = "";
//本质上使用stringBuilder拼接,但是每次循环都会产生一个stringBuilder对象
long num1 = Runtime.getRuntime().freeMemory();//获取系统剩余内存
long time1 = System.currentTimeMillis();//获取系统的当前时间
for (int i = 0; i < 5000; i++) {
str8 = str8 + i;//相当于产生了10000个对象
}
long num2 = Runtime.getRuntime().freeMemory();//获取系统的当前时间
long time2 = System.currentTimeMillis();
System.out.println("String所占的内存:" + (num2-num1));
System.out.println("String所用的时间:" + (time2 - time1 ));
/*
* 使用StringBuilder进行字符串的拼接*/
StringBuilder sb1 = new StringBuilder("");
long num3 = Runtime.getRuntime().freeMemory();
long time3 = System.currentTimeMillis();
for (int i = 0; i < 5000; i++) {
sb1.append(i);
}
long num4 = Runtime.getRuntime().freeMemory();
long time4= System.currentTimeMillis();
System.out.println("StringBuilder所占的内存:" + (num4 - num3));
System.out.println("StringBuilder所用的时间:" + (time4 - time3 ));
}
}