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()方法;…………..