1. 程式人生 > >String類及相關各種方法

String類及相關各種方法

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
  • 字串拆分處理

在這裡插入圖片描述

  • 字串按部分拆分
    vf
  • 拆分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