作者:達叔小生
鏈接:https://www.jianshu.com/p/febed3db066d
詳細講解String和StringBuffer和StringBuilder的使用

前言

在 Java中的字符串屬於對象,那麼Java 中提供了 String 類來創建和操作字符串,即是使用對象;因爲String類修飾的字符一旦被創建就不可改變,所以當對字符串進行修改的時候,需要使用到StringBuffer 和 StringBuilder 類。


String類

接下來開始使用對象了,什麼是String類呢?

是用來修飾字符串的,字符串是一種特殊的對象,一旦初始化就不可被改變,用String修飾的字符串變量是不可以被改變的。

例子:

//定義一個字符串
String str = "hello world";
String str = new String("hello world");

在Java中,我們經常用到字符串,所以需要學習如何操作字符串。對於String類,存在java.lang.String中,String類代表字符串,如何實現字符串的字面值,就是用此類來實例的。

那麼字符串是?

字符串是作爲常量,被雙引號包着的爲常用,被初始化即不可被更改。那麼接下來舉個例子效果。

String i = "123";
System.out.println("i="+i);
//結果爲
i=123
如果添加以下
String i = "123";
i = "12"
System.out.println("i="+i);
//結果爲
i=12

看到這個效果,你會認爲不是改了嗎?其實不是的,而是新創建了一個對象而已。

在String中,對象是不可變的,但可以共享的。那麼怎麼理解是共享的呢?這裏引出常量池的概念,如下:

//多個引用指向同一個字符串
String str1 = "dashu"
String str2 = "dashu";
System.out.println(str1==str2);
//結果
true

爲true代表它們同時指向一個字符串,即爲對象。創建了一個str1對象,字符串常理爲"dashu",那麼再次創建一個對象時,常理名相同,在常量池中發現有相同的"dashu",那麼就同時指向一個值。

常量池是用來放置一堆常量的,如果其中有相同的值,那麼就不用再次創建對象,這是爲了節約內存空間,如果再次創建,就會浪費內存空間,第一個創建的字符串放在常量池中,如果要用的時候,就拿來用。

詳細講解String和StringBuffer和StringBuilder的使用

展示

//內容相同,但是創建方式不同的情況
String str3 = "abc"
String str4 = new String ("abc");
System.out.println(str3==str4);//false
System.out.println(str3.equals(str4));//true
//結果
false
true

其實str3==str4,比較的是對象,而str3.equals(str4),比較的是內容。在代碼中只要有new,表示在內存中開闢了一個新空間,所以地址不相同,即str3==str4爲false。

那麼這兩種創建方式有何不同,對於str3來說,在內存中只創建了一個對象,而str4就不同了,而是在內存中有兩個對象。那麼怎麼理解呢?

str3就不用說了,可以知道就創建一個對象,在str4中,因爲有個new,在內存中有new即爲創建了一個對象,new String()爲構造函數,那麼它接收的是一個字符串對象,那麼接收的值是由常量池來的,常量池中的字符串本身就是一個對象。

一般不會像str4中那樣創建,因爲浪費內存了,但常用來存儲數組,字符數組和字節數組。new Stirng(),所以字符和字節可以轉換爲字符串。


String方法

爲什麼我們要學習String呢?

是因爲我們需要使用對象,使用String類中的一堆方法。如果要知道有哪些方法,可以查一下API,要使用時不知道用哪些方法,那麼就可以去查,用到就查,也不用每個都記住。

記住字符串是一個對象,是不可被更改的,它的一切方法都是圍繞着對象的數據而定的。String類爲不可變對象,一旦被創建,就不能修改它的數值。

對於上方代碼中的例子所示,已存在的String對象,對其修改都是重新創建一個新的對象,然後把新的值保存進去而已。

所以不要理解錯了下方的代碼:

String i = "123";
i = "12"
System.out.println("i="+i);
//結果爲
i=12

對於方法可以自行查找API試試效果即可,查找百度JavaAPI文檔即可下載使用。


StringBuffer

對於字符串是常量,它的值在創建後時不可以改變的,但字符串緩衝區支持可變的字符串。

StringBuffer類爲java.lang中,StringBuffer爲字符串緩衝,StringBuffer爲線程安全的可變字符序列,類似String的字符串緩衝區,緩衝區不能改,但裏面可以改,通過某方法可以改變序列的長度和內容。

StringBuffer提供了主要的兩種方法,一,append(),二,inset()。

StringBuffer爲一個字符串緩衝區,相對於一個容器,長度是可變的,可以存儲任意類型數據,是將任意數據轉變爲字符串進行存儲,StringBuffer提供了對數據的很多的操作功能。

例子:

StringBuffer sb = new StringBuffer();
sb.append("da");
sb.append("shu");
System.out.println(sb);
//sb.append("da").append("shu");

如果要操作數據,要轉換爲字符串。StringBuffer所有存儲的元素都被轉成字符串纔可使用。

String str = sb.append("da").append("shu").toString();

在指定位置插入元素

sb.insert(2,"hehe");//插入

StringBuffer和StringBuilder的區別

StringBuilder爲java.lang類,是一個可變的字符序列,提供了與StringBuffer兼容的API,StringBuffer和StringBuilder方法是一模一樣的。

StringBuilder不同步,不安全。如果同時append(),delete(),insert(),會導致出錯,多線程訪問不安全,添加修飾synchronized即可。在jdk1.5版本後,推出StringBuilder被用作一個StringBuffer的簡易替換,用在字符串緩衝區被單個線程使用的時候。

使用StringBuilder的出現,是爲了提高效率,是非同步的,是對單線程訪問效率高,對於StringBuffer是同步的,對多線程的訪問是安全的。這些是不同點,相同的是功能一模一樣的哦。

相关文章