前言 在 中的字元串屬於對象,那麼 中提供了 類來創建和操作字元串,即是使用對象;因為 類修飾的字元一旦被創建就不可改變,所以當對字元串進行修改的時候,需要使用到 和 類。 String類 接下來開始使用對象了,什麼是 類呢? 是用來修飾字元串的,字元串是一種特殊的對象,一旦初始化就不可被改變,用 ...
前言
在 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 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
是同步的,對多線程的訪問是安全的。這些是不同點,相同的是功能一模一樣的哦。
結語
- 點贊