String類及相關各種方法
阿新 • • 發佈:2018-11-19
String類
String類的兩種例項化方式
- a.直接賦值
String str = "Hello";
//直接賦值,在堆上分配空間
- b.傳統方法(構造方法例項化)
String str1 = new String("hello");
字串相等比較
- 採用String類提供的equals方法
public boolean equals(String.anotherString)
//成員方法(通過物件呼叫:物件.equals)
eg:str1.equals(anotherString)
解釋String類“==”與“equals”的區別
1.“= =”:進行數值的比較,比較的是兩個字串物件的記憶體地址數值
2.“equals()”:可以進行字串內容的比較
- 字串常量是String類的匿名物件
- 那麼在之前出現的
String str = “hello”
,本質上就是講一個匿名的String類物件設定有名字,而且匿名物件一定儲存在堆記憶體中 - 小tips:在以後開發中,如果要判斷使用者輸入的字串是否等同於特定字串,一定要將特定字串(String常量)寫在前面,避免NullPointerException
String str2 = null;
System.out.println("hello".equals(str2));
//任何的字元常量都是String的匿名物件,所以該物件永遠不會為null
String類兩種例項化區別
-
採用直接賦值,沒有開闢新的堆空間
-
為什麼沒有開闢堆記憶體空間呢
-
JVM底層會自動維護一個字串的物件池,如果現在採用直接賦值的形式進行String的物件例項化,該物件會自動儲存在這個物件池中。如果下次繼續使用直接賦值的模式宣告String物件,此時物件池中若有指定內容,則直接引用;如果沒有,則開闢新的堆空間後將其儲存在物件池供下次使用。
-
採用構造方法
String str = new String("hello");
- 如上我們可以看到,使用String構造方法會開闢兩塊堆記憶體空間,並且其中一塊成為垃圾空間,並且字串常量並沒有儲存在物件池中
- 入池操作
public native String intern();
入池操作:
String str = new String("hello").intern();
字串常量不可變更
- 字串定義後,不可改變(在後面加上後,實際匿名物件沒變,引用在變,棧的指向在變,只是在增多垃圾空間)
- 字串上沒有任何變化,但是字串物件的引用一直在改變,會形成大量垃圾空間
- 原則:
- 1.字串採用直接賦值
- 2.字串比較採用equals()實現
- 3.字串別改變太多
字元與字串的相互轉化
- 字串就是一個字元陣列,所以在String類裡面支援有字元陣列轉換為字串,以及字串轉化為字元的操作方法
- 將字元陣列轉換為字串
public String (char[] value)
public String (char[] value,int offset,int count)
- 將字串轉為單個字元
public char charAt(int index):
char c = "hello".charAt(1);//輸出為e
- 將字串變為字元陣列
public char[] toCharArray();
char []data = "hello".toCharArray();
- 取得字串長度
public int length();
位元組(byte)與字串
- 將位元組陣列轉為字串
public String (char[] value)
public String (char[] value,int offset,int count)
- 將字串轉為位元組陣列
public byte[] getBytes();
- 將字串按照指定編碼轉為位元組陣列
public byte[] getBytes(String charsetName);
字串比較
- 不區分大小寫相等比較
public boolean equalsIgnoreCase(Srting anotherString)
- 比較兩個字串大小(物件方法:在類裡面,要先定義類的物件)
public int compareTo(String anotherString)
返回大於0:表示大於比較物件
返回等於0:表示兩者相等
返回小於0:表示小於比較物件
str1.compareTo(str2)
字串中遇到不相等的第一對相對應的,即輸出
字串查詢
public boolean contains(String str):判斷str在本字串中是否存在
public boolean startsWith(String str):判斷是否以指定字串開頭
public boolean startsWith(String str,int index):從指定位置開始判斷是否以指定字串開頭
public boolean endsWith(String str):判斷是否以指定字串結尾
字串替換
public String replaceAll(String regex,String replacement):替換所有指定內容
public String replaceFirst(String regex,String replacement):替換首個內容
字串拆分
public String[] split(String regex):將字串按照指定格式全部拆分
public String[] split(String regex,int limit):將字串部分拆分,陣列長度為limit
- 字串拆分處理
- 字串按部分拆分
- 拆分IP地址
- 多次拆分
字串的擷取
public String substring(int beginIndex):從指定位置擷取到字串結尾 [...
public String substring(int beginIndex,int endIndex):擷取部分內容 [ ... )
String類的其他用法
- a.去掉左右空格
public String trim();
- b.轉大小寫
public String toUpperCase();
public String toLowerCase(); - 這兩個函式只轉換字母
- c.判斷字串是否為空(只能判斷是否為空字串而不是null)
public boolean isEmpty();
StringBuffer、StringBuilder類—(兩隻SB)瞭解一下
為什麼有StringBuffer類
- 任何的字串常量都是String物件,而且String的常量一旦宣告不可改變,如果改變物件內容,改變的是其引用的指向而已;
- 通常來講String的操作比較簡單,但是由於String的不可更改性,為了方便字串的修改,提供了StringBuffer類
字串修改
public StringBuffer append(各種資料型別);
String類與StringBuffer類之間的轉變
- String---->StringBuffer
呼叫StringBuffer的構造方法或append() - StringBuffer---->String
StringBuffer.toString();
字串反轉
public StringBuffer reverse();
刪除指定範圍的資料
public StringBuffer delete(int start,int end);
插入資料
public StringBuffer insert(int offset,各種資料型別)
瞭解
- String的內容不可修改,而兩隻sb可以修改內容(append)
- StringBuffer採用同步處理,執行緒安全,效率較低
- StringBuilder採用非同步處理,執行緒不安全,效率較高,String“+”底層會將String–>StringBuiler