首页 > java > String、StringBuffer、Stringbuilder的区别

String、StringBuffer、Stringbuilder的区别

作者:宋 翠婷

一、String类

(1)字符串是特殊的对象。

(2)字符串一旦被初始化就不可以被改变、字符串常量。

问题:Stirng str = “abc”;   Stirng str1 = new String(“abc”);有啥区别?

解答:举例说明。

第一组合:
String str = "abc";
String str1 = "abc";
第二组:
String str = "abc";
String str1 = new String("abc");
当同时用打印出
System.out.println(str=str1);
System.out.println(str.equals(str1));
第一组:
true;
true;
第二组:
false;
true;

第一组String对象在创建“abc”的时候会将创建好的对象放入常量池中,第二次str1在创建对象的时候会去 常量池中去找是否有str1需要创建的“abc”对象,如果发现有str1对象的地址也会指向这个“abc”对象。所以 在判断str==str1的时候他们的地址和值都是一样的,结果就是true。

第二组的的str1因为是通过new的方式在“堆”中开辟了一片空间,通过构造函数初始化,往这个构造函数中传 入一个字符串“abc”,“abc”这个字符串本身在常量池中,地址引用。所以其实第二组中的str1在内存中存在 两个对象。(即,在堆内存中的对象和常量池中的对象) 注: 需要明白常量池的原理机制。

二:StringBuffer

特点:

1、长度可以变化。

2.可以堆内容通过指定方法进行修改。

StringBuffer:字符串缓冲区:字符串中维护了一个“可变长度的数组”;

解释:其实就是StringBuffer有一个16个字符的默认长度可以理解为,StringBuffer对象 new StringBuffer()

初始化的时候,创建了一个长度为16个字符的字符串数组。

classs StirngBuffer{

       char[] buf;

      StringBuffer(){

        buf = new char[16];

      }

}

需要存储的数据大于16个字符的时候,新建一个长度是原来的1.x倍的数组。并将原来的数组数据复制到这个数组中,并将新的元素也添加到新的数组中。

 

三:StringBuider

特点:

1、和StringBuffer用法无区别。

2、StringBuffer是线程同步的(安全,速度较慢);

3、StringBuider是线程不同步的(不安全,速度快);

4、当多线程操作的时候用StringBuffer,当单线程的时候尽量用StringBuider提高效率

5、它们均有 qppend();insert();delete();等方法,这就是它们线程不安全的原因。StringBuffer是线程同步的, 就解决了线程安全的问题。StringBuffer 加了同步锁。syschronized  append()方法;…………..

您必须 [ 登录 ] 才能发表留言!