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在操作多线程中效率较高。
- String 、StringBuffer 和 StringBuilder
- String,StringBuffer,StringBuilder(转载)
- String、StringBuffer和StringBuilder
- String,StringBuffer,StringBuilder
- String、StringBuffer和StringBuilder
- String、StringBuffer和StringBuilder
- String StringBuffer StringBuilder
- String StringBuffer StringBuilder
- String StringBuffer StringBuilder
- String StringBuffer StringBuilder
- String ,StringBuffer ,StringBuilder问题
- String StringBuffer StringBuilder
- String StringBuffer StringBuilder 区别
- StringBuilder StringBuffer String
- StringBuilder。StringBuffer。String
- String,StringBuffer与StringBuilder
- String、StringBuffer和StringBuilder
- String, StringBuffer, StringBuilder区别
- MaterialPlayDrawable
- oracle存储过程简介
- 自定义模型类
- jquery day2
- ELF 主体:节区02
- String、StringBuffer、StringBuilder
- jquery 点击取得当前行的某一列值
- 基于抽象语法树的Online Judge语义查重系统设计与实现(毕设)
- EasyUI datetimebox设置默认值为当前时间
- Android Library的依赖方式及发布
- oracle存储过程IN,OUT,IN OUT参数
- 【Linux学习笔记】16:用户登录查看命令
- 基于微服务的软件架构模式
- hdu 6180 Schedule(贪心 multiset)