Java中String、StringBuffer、StringBuilder的區(qū)別詳解
java中String、StringBuffer、StringBuilder是編程中經(jīng)常使用的字符串類,他們之間的區(qū)別也是經(jīng)常在面試中會(huì)問(wèn)到的問(wèn)題?,F(xiàn)在總結(jié)一下,看看他們的不同與相同。
1.可變與不可變
String類中使用字符數(shù)組保存字符串,如下就是,因?yàn)橛小癴inal”修飾符,所以可以知道string對(duì)象是不可變的。
private final char value[];
StringBuilder與StringBuffer都繼承自AbstractStringBuilder類,在AbstractStringBuilder中也是使用字符數(shù)組保存字符串,如下就是,可知這兩種對(duì)象都是可變的。
char[] value;
2.是否多線程安全
String中的對(duì)象是不可變的,也就可以理解為常量,顯然線程安全。
AbstractStringBuilder是StringBuilder與StringBuffer的公共父類,定義了一些字符串的基本操作,如expandCapacity、append、insert、indexOf等公共方法。
StringBuffer對(duì)方法加了同步鎖或者對(duì)調(diào)用的方法加了同步鎖,所以是線程安全的??慈缦略创a:
public synchronized StringBuffer reverse() {
super.reverse();
return this;
}
public int indexOf(String str) {
return indexOf(str, ); //存在 public synchronized int indexOf(String str, int fromIndex) 方法
}
StringBuilder并沒(méi)有對(duì)方法進(jìn)行加同步鎖,所以是非線程安全的。
3.StringBuilder與StringBuffer共同點(diǎn)
StringBuilder與StringBuffer有公共父類AbstractStringBuilder(抽象類)。
抽象類與接口的其中一個(gè)區(qū)別是:抽象類中可以定義一些子類的公共方法,子類只需要增加新的功能,不需要重復(fù)寫已經(jīng)存在的方法;而接口中只是對(duì)方法的申明和常量的定義。
StringBuilder、StringBuffer的方法都會(huì)調(diào)用AbstractStringBuilder中的公共方法,如super.append(...)。只是StringBuffer會(huì)在方法上加synchronized關(guān)鍵字,進(jìn)行同步。
最后,如果程序不是多線程的,那么使用StringBuilder效率高于StringBuffer。
java中 String StringBuffer StringBuilder的區(qū)別小結(jié)
* String類是不可變類,只要對(duì)String進(jìn)行修改,都會(huì)導(dǎo)致新的對(duì)象生成。
* StringBuffer和StringBuilder都是可變類,任何對(duì)字符串的改變都不會(huì)產(chǎn)生新的對(duì)象。
在實(shí)際使用時(shí),如果經(jīng)常需要對(duì)一個(gè)字符串進(jìn)行修改,例如插入、刪除等
* 但StringBuffer和StringBuilder有什么區(qū)別呢?
StringBuffer是線程安全的,在多線程程序中是很方便使用的,但是程序的效率就會(huì)慢一點(diǎn)。
StringBuilder不是線程安全的,在單線程中,比StringBuffer的效率要高。
* 綜合來(lái)說(shuō),三者的運(yùn)行時(shí)間:
String > StringBuffer > StringBuilder
- 全面解釋java中StringBuilder、StringBuffer、String類之間的關(guān)系
- java 中String和StringBuffer與StringBuilder的區(qū)別及使用方法
- Java之String、StringBuffer、StringBuilder的區(qū)別分析
- Java那點(diǎn)事——StringBuffer與StringBuilder原理與區(qū)別
- java String、StringBuilder和StringBuffer的區(qū)別詳解
- Java中StringBuffer和StringBuilder區(qū)別
- Java String、StringBuffer與StringBuilder的區(qū)別
- Java中String、StringBuffer、StringBuilder的區(qū)別介紹
- java中String、StringBuffer與StringBuilder的區(qū)別
- Java中StringBuilder與StringBuffer的區(qū)別
相關(guān)文章
mybatis根據(jù)表逆向自動(dòng)化生成代碼的實(shí)現(xiàn)
若采用mybatis框架,數(shù)據(jù)庫(kù)新建表,手動(dòng)編寫的話,需要編寫大量的實(shí)體類、mapper文件、mapper.xml文件,都是一些重復(fù)且有規(guī)律的工作。我們可以引用插件,然后做配置,自動(dòng)生成這些文件,本文就來(lái)詳細(xì)的介紹一下2021-08-08
Spring @Bean注解的使用場(chǎng)景與案例實(shí)現(xiàn)
隨著SpringBoot的流行,我們現(xiàn)在更多采用基于注解式的配置從而替換掉了基于XML的配置,所以本篇文章我們主要探討基于注解的@Bean以及和其他注解的使用2023-03-03
SpringBoot application.yml和bootstrap.yml的區(qū)別
本文主要介紹了SpringBoot application.yml和bootstrap.yml的區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04
使用Spring的注解方式實(shí)現(xiàn)AOP實(shí)例
本篇文章主要介紹了使用Spring的注解方式實(shí)現(xiàn)AOP實(shí)例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-06-06
Java編程使用Runtime和Process類運(yùn)行外部程序的方法
這篇文章主要介紹了Java編程使用Runtime和Process類運(yùn)行外部程序的方法,結(jié)合實(shí)例形式分析了java使用Runtime.getRuntime().exec()方法運(yùn)行外部程序的常見(jiàn)情況與操作技巧,需要的朋友可以參考下2017-08-08

