String:不可变字符序列。
StringBuffer:可变字符序列,并且线程安全,但是效率低。
StringBuilder:可变字符序列,线程不安全,但是效率高(一般用它)。
区别在于在使用String时候,每次对在字符进行添加数据的时候,都会产生一个新的对象。因为String产生的空间是固定的,所以不能直接进行添加,需要用加法或者用一个新的字符串来进行添加。
例如:
String s1 = new String("abcdef");
String s2 = new String("ghijk");
String s3 = s1+s2;
String s4 = "abcdef"+"ghijk";
String s5 = "abcdef";
System.out.println(s1==s5);//false
System.out.println(s3==s4);//false
System.out.println(s1.equals(s5));//true
从上述的代码中可以看出使用String的方法不同,产生的空间也不同。所以导致栈指向的对象也不同。
只要每一次对字符串进行修改就会产生一个新的对象。于是由此产生了StringBuffer和StringBuilder的使用。
在StringBuilder中一共有这些常用方法:
public StringBuilder append(…) //该方法是对字符串进行连接,添加新的内容,且返回的对象不变
public StringBuilder delete(int start,int end) //显示从开始的位置到结束的位置进行删除,且返回的还是这个对象。
public StringBuilder deleteCharAt(int index) //删除索引此处特定的一个char内容,并返回对象不变
public StringBuilder insert(…) //在特定的位置进行插入字符,且返回对象不变
public StringBuilder reverse() //将字符的内容倒序输出,且返回对象不变
public int indexOf(String str) //可以用来判断是否有该字符
public int indexOf(Stringstr,intfromIndex) //判断从某个字符到某个字符是否存在
public String substring(int start) // 返回一个新的字符,但是是以选择的地方开始
public String substring(int start,int end) //返回一个新的字符,以自己选择的位置开始
也可以从这里可以看出
//使用String方法
long num1=Runtime.getRuntime().freeMemory();//获取系统剩余内存空间
long time1=System.currentTimeMillis();//获取系统的当前时间
for(inti=0;i<5000;i++){
str8=str8+i;//相当于产生了5000个对象
}
long num2=Runtime.getRuntime().freeMemory();
long time2=System.currentTimeMillis();
System.out.println("String占用内存:"+(num1-num2));
System.out.println("String占用时间:"+(time2-time1));
//使用StringBuffer方法
StringBuilder sb1=newStringBuilder("");
long num3=Runtime.getRuntime().freeMemory();
long time3=System.currentTimeMillis();
for(inti=0;i<5000;i++){
sb1.append(i);
}
long num4=Runtime.getRuntime().freeMemory();
long time4=System.currentTimeMillis();
System.out.println("StringBuilder占用内存:"+(num3-num4));
System.out.println("StringBuilder占用时间:"+(time4-time3));
上述得出来的代码可以看出StringBuilder的占用内存和占用时间远远小于String。就是因为StringBuilder的空间是动态的。只需要向其中添加时一直修改其空间即可。
而String的使用会导致每一次进行i+1的操作时,进行new一个新的对象。