String、StringBuffer、StringBuilder

来源:互联网 发布:钢铁侠盔甲多少钱知乎 编辑:程序博客网 时间:2024/06/03 16:09

String、StringBuffer、StringBuilder都可以存储和操作字符串它们之间的差异大概如下:

引用字符串是否可以改变

是否实现了equal方法

线程是否安全

效率

String

不可以

实现

安全

固定内容效率高

StringBuffer

可以

没有

安全

多线程效率高

StringBuilder

可以

没有

不安全

单线程效率高

1String是一个final修饰的类,因此,它的对象引用所指向的那个值是不可变的,如:

 String aa="a"; 

           aa=aa+"b";

           aa=aa+"c";

实际上就是三个不同的引用:"a"、"ab"、"abc"。因此用+连接字符串时,在堆内存中形成了很多不再使用的对象,造成内存的浪费。而StringBuffer与StringBuilder则都继承AbstractStringBuilder(抽象类),在进行字符串连接时,调用append方法即可动态的将字符串连接起来,没有新的对象生成。验证如下:

/*通过前后引用的变化,判断是否有新的对象生成*/public class StringTest {           public static void main(String args[]){String st1 =new String("a");String st2=new String();st2=st1;   //将st1的引用传递给st2System.out.println("输出st1的值"+st1+"\n输出st2的值"+st2);System.out.println("st1与st2引用是否相同:");System.out.println(st1==st2);st1=st1+"b";st1=st1+"c";System.out.println("输出st1的值:"+st1+"\n输出st2的值:"+st2);System.out.println(st1);System.out.print("st1引用未发生改变:");//判断引用是否发生变化System.out.println(st1==st2);//StringBuffer sb=new StringBuffer();StringBuffer sb1=new StringBuffer();sb.append("a");sb1=sb;              //将sb的引用传递sb1System.out.println("sb的值:"+sb+"\ns1的值:"+sb1);System.out.print("sb与sb1引用是否相同:");System.out.println(sb==sb1);sb.append("b").append("c");System.out.println("sb的值:"+sb+"\ns1的值:"+sb1);System.out.print("sb引用未发生改变:");//判断引用是否发生变化System.out.println(sb==sb1);StringBuilder  sbr=new StringBuilder();StringBuilder  sbr1=new StringBuilder();sbr.append("a");sbr1=sbr;    //将sbr的引用传递给sbr1System.out.println("sbr的值:"+sbr+"\nsbr1的值:"+sbr1);System.out.print("sbr、sbr1引用是否相同:");System.out.println(sbr==sbr1);sbr.append("b").append("c");System.out.println("sbr的值:"+sbr+"\nsbr1的值:"+sbr1);System.out.print("sbr引用未发生改变:");//判断引用是否发生变化System.out.println(sbr==sbr1);}}

线程是否安全:

对于线程安全而言,因为final的修饰,导致String中的对象是不可变的,也就可以理解为常量,因此可以看作是安全的。而在考虑多线程时,因为StringBuffer中加入了同步方法,故而是线程安全的,StringBuilder没有同步机制,是非线程安全的。

是否实现了equals方法和hashCode方法:

String类实现了这两个方法,故String可以使用equals方法判断对象的内容是否相同,也可以存入集合类。而StringBuffer与StringBuilder并没有实现这两个方法,故其equals方法相当与==,而将两者的对象存入Java集合类中会出现问题。

效率问题:

String在操作不用动态增加的字符串时,效率很高。而StringBuilder在单线程中效率较高,StringBuffer在操作多线程中效率较高。




原创粉丝点击