String,stringBuffer,StringBuilder总结

一,String 底层是char数组

(1)如:直接赋值:String s1 = "HelloWorld"

通过new关键字来创建:String s3 = new String("HelloWorld") 

上面的两种赋值方式必然是不同,如s1它这种赋值方式会让s1引用指向jvm中的方法区的常量池中的“HelloWorld”,而s3则是在堆空间中new String(”HelloWorld“),即重新创建一个对象,让引用指向它。于是他两的地址必然不同,比较时肯定不同。

(2)String s1 = "HelloWorld";

String s4 = "Hello"; String s5 = "World"; String s6 = "Hello" + "World"; String s7 = s3 + s4;

System.out.println(s1 == s6);//3:输出为true System.out.println(s1 == s7);//4:输出为false

原因:当字符串相加时,如果都是静态字符串,则与直接赋值相同。会先在常量池中找是否存在,是的话,就指向它。如果不存在则添加进常量池。String s6 = "Hello" + "World";与String s1 = "HelloWorld"是一样的,String s6 = "Hello" + "World";在编译阶段就会被处理成 "HelloWorld"。

(3)System.out.println(s1 == s7.intern());//5:输出为true System.out.println(s3 == s3.intern());//6:输出为false

string中的intern()调用时,如果常量池中已经包含一个等于此String对象的字符串,则返回池中字符串,否则将此String对象添加到池中,并返回此对象的引用。5的话,字符串已存在在常量池,引用相同,而s3是new的,一个调用intern()时就将它添加的常量池中,原来的s3不变,所以是false;

(4trim() 去掉起始和结尾的空格

二 ,StringBufferbuffer

(1)String和StringBuffer都是进行字符串处理的,但String在处理字符串时会创建许多对象,StringBuffer不,所以在在经常对字符串进行修改时(如,增加,删除等操作)使用Stringbuffer更好。

(3)StringBuffer有两种构造方法,有参和无参,无参是创建一个空的对象,默认容量16,有参传入字符串,那么StringBuffer对象就是字符串,初始容量加上默认容量。传入in类型,就会指定容量。需要注意的是StringBuffer和String是属于不同类型,不能直接强转。则它门之间传化如下:

     String s = “abc”;

     StringBuffer sb1 = new StringBuffer(“123”);

     StringBuffer sb2 = new StringBuffer(s);   //String转换为StringBuffer

     String s1 = sb1.toString();              //StringBuffer转换为String

(4)append()方法:追加字符:

(5)它的大部分方法是有synchronized修饰的,但通过调用实现同步,因此StringBuffer是线程安全的。

(6)它的replace()方法与String不同,有三个参数,前两个相同,第三个是指定字符串。

三,StringBilder

(1)非线程安全的可变字符序列,此类被设计用于StringBuffer的简易替换,用在字符串缓冲区被单个线程使用时,它的多数方法是没有被synchronized修饰的,所以是非线程安全的。

(2)StingBuffer的设计就会导致,当开发人员是在单线程的环境中时,就会增加额外的开销,而且大多数对于StringBuffer 的使用基本上都是在单线程的环境中,所以开发人员根本不需要对于synchronized 的额外开销,所以就有了Stringbuilder,其使用更加方便而且在单线程环境中更加快速。

四 ,总结:

(1)性能:创建动态字符串过程中,使用String需要的时间最久,而使用StringBuilder时间最短,而且创建的次数越多这个性能越明显。

(2)使用选择:

1、如果创建静态的字符串而且在程序中是不变的,那么选择String

2、如果是创建动态字符串,并且是在多线程中使用,那么用StringBuffer

3、其他的都使用StringBuilder,并且大多数情况下都是使用StringBuilder

发布了28 篇原创文章 · 获赞 12 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_42002367/article/details/81228573