浅谈String,StringBuilder,StringBuf

2018-06-06  本文已影响0人  Y_Sunny_U

首先,说一下这三者之间常见的问题

1.  String和new String的区别

2.  String和StringBuffer的转换

3.  String StringBuffer StringBuilder的区别

4.  ==和equal的区别、

针对这四个问题,我们进行 一 一 分析

1.  String str1 =“ABC"   和 String  str2  = new String("ABC")的区别   

对于字符串:其对象是存储在栈中的""定义的存储在常量池中   new 确定存储在堆中

相等的字符串在常量池中只有一份,在堆中有多份(String str在栈中  “ABC"在常量池中 new String() 在堆中)

String str1="ABC"可能创建一个对象或者不创建对象,

如果"ABC"这个字符串在java String池里不存在,会在java String池创建这个一个String对象("ABC")如果已经存在,str1直接reference to 这个String池里的对象。

String str2 = new String("ABC")至少创建一个对象,也可能两个。

因为用到new关键字,会在heap(堆)创建一个 str2 的String 对象,它的value 是 "ABC".同时,如果"ABC"这个字符串在java String池里不存在,会在java String池创建这个一个String对象("ABC").

String str1 = new String(“abc”)        str1 != str2      (== 与equals的区别)  

String str2 = new String("abc")   

String str3 = "ABC"                          str3 = str4

String str4 = "ABC"                          str3 = str4 = str5

String str5 = "A"+"BC";  

2. String和StringBuffer的转换

2.1  String转StringBuffer: 

StringBuffer sb = new StringBuffer(s);   String  s  = new String("xxx"); 

2.2  StringBuffer转String:  

String str = sb.toString();

3.String和StringBuffer  StringBuilder的区别

1) 执行速度:StringBulider>StringBuffer>String

2) 变量(常量)线程安全

String     

常量,不可变的

在进行字符串处理时,会产生新的String对象          

添加字符串使用“+”                                            

线程安全

StringBuffer   

变量,可以修改内容

在进行字符串处理时,不会产生新的String对象

添加字符是使用append()

线程安全的(多线程程序中可以使用但执行效率缓慢)

StringBuilder

  变量,可以修改内容

线程不安全的(单线程中的性能比StringBuffer高)

总结:

1.如果要操作少量的数据用 = String

2.单线程操作字符串缓冲区 下操作大量数据 = StringBuilder

  3.多线程操作字符串缓冲区 下操作大量数据 = StringBuffer

4.==和equal的区别

==是一个运算符   equals则是string对象的方法

==比较的是引用类型 比较的是地址值是否相同

equals比较的是内容是否相同(堆中的内容是否相同)

扩展String的一种方式比StringBuffer快的多  

e.g.      String  s  = "you"+"are"+"better"这种方式比StringBuffer的append()快的多,这就被jvm解析成StringBuffer对象的拼接    

String s = "you" String s2 = "are"   String s3 = "better"   String s4 = s+s2+s3这种方式比StringBuffer慢的多这样jvm就规规矩矩的拼接String字符串了

上一篇 下一篇

猜你喜欢

热点阅读