第二十節:詳細講解String和StringBuffer和StringBuilder的使用

達叔小生發表於2018-08-06

標題圖

前言

Java中的字串屬於物件,那麼Java 中提供了 String 類來建立和操作字串,即是使用物件;因為String類修飾的字元一旦被建立就不可改變,所以當對字串進行修改的時候,需要使用到StringBufferStringBuilder 類。


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 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==str4false

那麼這兩種建立方式有何不同,對於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的區別

StringBuilderjava.lang類,是一個可變的字元序列,提供了與StringBuffer相容的APIStringBufferStringBuilder方法是一模一樣的。

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

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

結語

  • 點贊

送❤

相關文章