歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Java的String和StringBuffer和StringBuilder詳解

Java的String和StringBuffer和StringBuilder詳解

日期:2017/3/1 9:28:46   编辑:Linux編程

前言

最近發現團隊成員在Java代碼方面的質量不夠高,准備寫一些基礎的文章,供大家參考。

一、定義

String是不可變字符序列。
StringBuffer是可變的字符序列。
StringBuilder也是可變的字符序列。

1、StringBuffer和StringBuilder的唯一區別

StringBuffer對象是線程安全的,這意味著StringBuffer對象可以同時被多個並行線程修改,因為它所有的方法都被聲明為"synchronized(同步)"。
StringBuilder類是JDK 1.5版引入的非線程安全的類,這意味著它的所有方法都是非同步方法。
因此,在單一模型的應用中,我們應該使用StringBuilder,這樣對象不會有鎖定和解鎖,這樣性能就會增加。
而在單線程模型應用中,會按順序執行操作,因此對象不會崩潰。

2、什麼時候選擇String和StringBuffer

如果我們不需要在同一內存空間中存儲字符串的修改,那麼我們必須使用String。
而如果需要在同一內存空間中存儲字符串的修改,那麼我們必須使用StringBuffer或StringBuilder。

3、String的優缺點

優點:使用String時,如果字符串發生修改,那麼修改後的內容會保存在內存中的不同位置,這樣的話,內存中就同時有原始的字符串值和修改後的字符串值。
缺點:對於每一個這樣的操作,它會消耗更多的內存,因為它把修改後的字符串值存儲在新的內存空間中。因此它會導致性能問題。
解決方案:要解決這個性能問題,開發者應該使用StringBuilder或者StringBuffer來實現字符串的修改,然後再轉換成String對象把字符串傳遞給用戶。

4、StringBuffer和StringBuilder的優缺點

優點:StringBuffer和StringBuilder有更好的性能,因為它們對內存的消耗更少,所有對字符串的修改操作都存儲在同一內存位置。
缺點:修改前的原始字符串值不會被保留。

二、創建String或StringBuffer對象

String對象的創建有兩種方式
1)直接使用字符串賦值創建對象
String str = "instance of java for us";

2)使用String構造器創建對象
String str = new String("instance of java for us");

StringBuffer對象的創建
使用構造器
StringBuffer str = new StringBuffer();

StringBuilder對象的創建
使用構造器
StringBuilder str = new StringBuilder();

三、在StringBuffer和StringBuilder只能執行指定的操作

可以執行字符串的追加、插入、刪除、反向等操作
因為String對象是不可變的對象,因此這些操作不能在String對象中執行。

四、字符串的連接

使用String對象來把新字符串連接到現有的字符串上,有兩種方法:

1、使用“+”操作符

2、使用concat()方法

而使用StringBuffer連接字符串,只有一種方法:使用append()方法
而使用StringBuilder連接字符串,只有一種方法:使用append()方法
示例代碼:
package com.ch;
public Class Demo{
public static void main(String args[]) {
String str="Java";
StringBuffer sb= new StringBuffer("Java");
StringBuilder sbr= new StringBuilder("Java");

System.out.println(str.concat(" language"));
System.out.println(sb.append(" language"));
System.out.println(sbr.append(" language"));
}
}

輸出:
Java language
Java language
Java language

五、比較

Object對equals()方法的定義是:對象a和b如果是同一個對象的引用,那麼a.equals(b)返回true,否則返回false。
而String類重寫了Object的equals()方法,String對象的equals()方法比較的是內容,內容相等則返回true。
StringBuffer和StringBuilder則沒有重寫equals()方法,與Object的equals()方法的定義相同。

Copyright © Linux教程網 All Rights Reserved