String和stringbuffer
很多人都会认为,String和StringBuffer没有多大的区别,但是String与StringBuffer的区别,就是一个变量和常量的关系。
StringBuffer对象的内容可以修改;而String对象一旦产生后就不可以被修改,重新赋值就是两个对象。
StringBuffer 的内部实现方式和String不同,StringBuffer在进行字符串处理时,不生成新的对象,在内存使用上要优于String类。所以在实际使用时,如果经常需要对一个字符串进行修改,使用StringBuffer要更加适合一些。
在String类中没有用来改变已有字符串中的某个字符的方法,由于不能改变一个java字符串中的某个单独字符,所以在JDK文档中称String类的对象是不可改变的。然而,不可改变的字符串具有一个很大的优点:编译器可以把字符串设为共享的
StringBuffer 类属于一种辅助类,可预先分配指定长度的内存块建立一个字符串缓冲区。这样使用StringBuffer类的append方法追加字符 比 String使用 + 操作符添加字符 到 一个已经存在的字符串后面有效率得多。
因为使用 + 操作符每一次将字符添加到一个字符串中去时,字符串对象都需要寻找一个新的内存空间来容纳更大的字符串,这是一个非常消耗时间的操作。添加多个字符也 就意味着要一次又一次的对字符串重新分配内存。使用StringBuffer类就避免了这个问题。
StringBuffer是线程安全的,在多线程程序中也可以很方便的进行使用,但是程序的执行效率相对来说就要稍微慢一些。
下面就举一个例子来说明一下
public static void main(String[] args) throws Exception{ String str=new String(); long start=System.currentTimeMillis(); for(int i=0;i<50000;i++){ str+=i+""; } long end=System.currentTimeMillis(); System.out.println(end-start); StringBuffer strbuf=new StringBuffer(); start=System.currentTimeMillis(); for(int i=0;i<50000;i++){ strbuf.append(i+""); } end=System.currentTimeMillis(); System.out.println(end-start); }
所用时间
9216 8
这可以看出stringbuffer的速度
但是,看上一个例子红色字体位置,我所用的string是每次添加不同的值,如果每次添加相同的值,因为栈内存中已经存在共享值,所以string不再创建新的内存,直接引用
public static void main(String[] args) throws Exception{ String str=new String(); long start=System.currentTimeMillis(); for(int i=0;i<50000;i++){ str="abc"; } long end=System.currentTimeMillis(); System.out.println(end-start); StringBuffer strbuf=new StringBuffer(); start=System.currentTimeMillis(); for(int i=0;i<50000;i++){ strbuf=new StringBuffer("abc"); } end=System.currentTimeMillis(); System.out.println(end-start); }
0 5
这就是string的栈内存
StringBuffer常用方法:
1. append(str); 添加
StringBudder strBuf=new StringBuffer("a");
strBuf.append("bcdefghi");
结果:bcdefghi
2.deleteCharAt(int index); 删除第几个字节
strBuf.append("abcdefghi");
strBuf.deleteCharAt(0);
结果:bcdefghi
3.delete(int start,int end);删除从第几个到第几个
strBuf.append("abcdefghi");
strBuf.delete(1,3);
结果:adefghi
4.insert(int index,str);在什么位置添加什么内容
strBuf.append("abcdefghi");
strBuf.insert(1,"A");
结果:aAdefghi
5.reverse()将字段反转
strBuf.append("abc");
strBuf.reverse();
结果:cba
6.setCharAt(int index,char char) 修改字段
注意 只能用char类型
strBuf.append("abc");
strBuf.setCharAt(1,‘B’);
结果:aBc
7.trimToSize() 字符个数
和size()相同 只不过这种可以节省空间
朱星翰