java中String、StringBuffer、StringBuilder是編程中經(jīng)常使用的字符串類(lèi),在上一篇博文中我們已經(jīng)熟悉String字符串的特性和使用,而StringBuffer、StringBuilder又是怎么樣的字符串類(lèi)呢??他們之間的區(qū)別和關(guān)系又是什么呢??這問(wèn)題經(jīng)常在面試中會(huì)問(wèn)到,現(xiàn)在總結(jié)一下,看看他們的不同與相同。

1.可變與不可變

1)String類(lèi)中使用字符數(shù)組保存字符串,如下就是,因?yàn)橛小癴inal”修飾符,所以可以知道string對(duì)象是不可變的。

    private final char value[];

String的值是不可變的,這就導(dǎo)致每次對(duì)String的操作都會(huì)生成新的String對(duì)象,不僅效率低下,而且大量浪費(fèi)有限的內(nèi)存空間。

1 String a = "a"; //假設(shè)a指向地址0x00012 a = "b";//重新賦值后a指向地址0x0002,但0x0001地址中保存的"a"依舊存在,但已經(jīng)不再是a所指向的,a 已經(jīng)指向了其它地址。

因此String的操作都是改變賦值地址而不是改變值操作。

2)StringBuilder與StringBuffer都繼承自AbstractStringBuilder類(lèi),在AbstractStringBuilder中也是使用字符數(shù)組保存字符串,如下就是,可知這兩種對(duì)象都是可變的。

    char[] value;

StringBuffer是可變類(lèi),和線(xiàn)程安全的字符串操作類(lèi),任何對(duì)它指向的字符串的操作都不會(huì)產(chǎn)生新的對(duì)象。 每個(gè)StringBuffer對(duì)象都有一定的緩沖區(qū)容量當(dāng)字符串大小沒(méi)有超過(guò)容量時(shí),不會(huì)分配新的容量,當(dāng)字符串大小超過(guò)容量時(shí),會(huì)自動(dòng)增加容量。

1 StringBuffer buf=new StringBuffer(); //分配長(zhǎng)16字節(jié)的字符緩沖區(qū)2 StringBuffer buf=new StringBuffer(512); //分配長(zhǎng)512字節(jié)的字符緩沖區(qū)3 Stri