【Java】String類(比較/查找/替換/拆分/截取/轉換等)

一、常見的構造 String 的方式
//方式一

String str = "Hello Bit";

//方式二

String str2 = new String("Hello Bit");

//方式三

char[] array = {'a', 'b', 'c'}; String str3 = new String(array)

二、字符串比較
① 比較地址

例1:

String str1 = "Hello"; 
String str2 = "Hello"; 
System.out.println(str1 == str2); 

//執行結果 true   

例2:

String str1 = new String("Hello"); 
String str2 = new String("Hello"); 
System.out.println(str1 == str2);

// 執行結果 false 

② 比較字符串內容
必須採用String類提供的equals方法

String str1 = new String("Hello"); 
String str2 = new String("Hello"); System.out.println(str1.equals(str2)); //System.out.println(str2.equals(str1)); 
// 或者這樣寫也行
// 執行結果 true

③比較大小

String str1 = "Hello"; 
String str2 = "joosd"; 
System.out.println(str1.compareTo(str2));

注意
常量在編譯時就已經編譯好了

  1. String str4=“abc”+“def”+360;
    編譯時一個對象:編譯時就已經是abcdef360
    “abc”+“def”:字符常量
    360:常量

  2. int a =360;
    String str4=“abc”+“def”+a;
    編譯時2個對象:”abcdef”拼接好產生一個對象;此時a是一個變量,拼接時需要在產生一個對象;

面試題:請解釋String類中兩種對象實例化的區別
1.直接賦值:只會開闢一 塊堆內存空間,並且該字符串對象可以自動保存在對象池中以供下次使用。

2.構造方法:會開闢兩塊堆內存空間,其中-塊成爲垃圾空間,不會自動保存在對象池中,可以使用intern0方法手工入池。

String str="abcdef";//放在常量池
String str2=new String("abcdef").intern();

(1)常量池當中存在 返回常量池當中字符串對象的地址;

char[] array = {'a','b','c','d','e','f'};
String str3=new String(array).intern();

(2) 如果常量池中不存在,那麼在常量池中生成該對象的引用

String str="abcdef";
System.out.println(str==str3);//true

字符串是一種不可變對象. 它的內容不可改變

在這裏插入圖片描述
需要修改字符串:

方法1:
在這裏插入圖片描述
【str.substring(1):提取一個子串:從1號下標開始 ello】

方法2:反射

指的是程序運行過程中, 獲取/修改某個對象的詳細信息(類型信息, 屬性信息等), 相當於讓一個對象更好的 “認清自己” .
在這裏插入圖片描述

三、字符, 字節與字符串
1、字符與字符串
字符串內部包含一個字符數組,String 可以和 char[] 相互轉換.
在這裏插入圖片描述
(1) 獲取指定位置的字符

String str = "hello" ;  System.out.println(str.charAt(0));  
// 下標從 0 開始 
// 執行結果 h 

(2)字符串與字符數組的轉換
a.數組轉化爲字符串
在這裏插入圖片描述
b.字符串轉化爲數組
方法一:
在這裏插入圖片描述

方法二:
在這裏插入圖片描述
2、字節與字符串
在這裏插入圖片描述
例:實現字符串與字節數組的轉換處理

String str = "helloworld" ;  

// String 轉 byte[] 
byte[] data = str.getBytes() ;  

for (int i = 0; i < data.length; i++) {      System.out.print(data[i]+" "); } 
 
// byte[] 轉 String 
System.out.println(new String(data));

【注意】

1.byte[] 是把 String 按照一個字節一個字節的方式處理, 這種適合在網絡傳輸, 數據存儲這樣的場景下使用. 更適合 針對二進制數據來操作.

2.char[] 是吧 String 按照一個字符一個字符的方式處理, 更適合針對文本數據來操作, 尤其是包含中文的時候.

四、字符串常見操作

1.字符串比較
在這裏插入圖片描述
代碼示例: 不區分大小寫比較

String str1 = "hello" ;  String str2 = "Hello" ;  System.out.println(str1.equals(str2)); // false
System.out.println(str1.equalsIgnoreCase(str2)); // true

在String類中compareTo()方法是一個非常重要的方法,一個可以區分大小關係的方法,該方法返回一個整型,該數據會根據大小關係返回三類內 容:
在這裏插入圖片描述
在這裏插入圖片描述
2 .字符串查找
在這裏插入圖片描述
例1:contains()

String str = "helloworld" ;  
System.out.println(str.contains("world")); // true 

例2:使用indexOf()方法進行位置查找

String str = "helloworld" ;
System.out.println(str.indexOf("world")); // 5,w開始的索引 
System.out.println(str.indexOf("bit")); // -1,沒有查到 if 
(str.indexOf("hello") != -1) {    
System.out.println("可以查到指定字符串!"); 
}

①.indexOf效率略高於contains(contains底層調用indexOf)
②.使用indexOf()需要注意的是,如果內容重複,它只能返回查找的第一個位置

例: 使用indexOf()的注意點

String str = "helloworld" ;  
System.out.println(str.indexOf("l")); // 2 
System.out.println(str.indexOf("l",5)); // 8 
System.out.println(str.lastIndexOf("l")); // 8 從後往前找(默認從最後一個元素開始

在進行查找的時候往往會判斷開頭或結尾:

String str = "**@@helloworld!!" ;  
System.out.println(str.startsWith("**")); // true 判斷是否從指定字符串開頭
System.out.println(str.startsWith("@@",2)); // ture
System.out.println(str.endsWith("!!")); // true

3.字符串替換
在這裏插入圖片描述
例:字符串的替換

String str = "helloworld" ;
System.out.println(str.replaceAll("l", "_"));
System.out.println(str.replaceFirst("l", "_")); 

注意: 由於字符串是不可變對象, 替換不修改當前字符串, 而是產生一個新的字符串.

4.字符串拆分
在這裏插入圖片描述
例:實現字符串的拆分

String str = "hello world hello bit" ; 
String[] result = str.split(" ") ; // 按照空格拆分 
for(String s: result) {   //輸出數組
System.out.println(s); 
} 
String str = "ab-cd-ef";//數組接收
String[] strings = str.split("-");//用-分組
System.out.println(Arrays.toString(strings));//輸出數組

例:部分拆分

String str = "hello world hello bit" ;
String[] result = str.split(" ",2) ;
for(String s: result) { 
  System.out.println(s); 
} 
String str = "ab-cd-ef";
String[] strings=str.split("-",2);
//最多分成兩組 優先分組ab 後面爲一組

例:拆分IP地址
字符" | " , " * " , “+” 都得加上轉義字符,前面加上"" , 而如果是"",那麼就得寫成"\ \"

String str = "192.168.1.1" ; 
String[] result = str.split("\\.") ; 
//第一個\表示將後面的一個\轉化爲真正的\ 而\.才能變爲.
for(String s: result) {    
  System.out.println(s); 
}

例:多次拆分

String str = "name=zhangsan&age=18" ;
String[] result = str.split("&") ;
for (int i = 0; i < result.length; i++) 
{  
   String[] temp = result[i].split("=") ;
   System.out.println(temp[0]+" = "+temp[1]); 
} 

5.字符串截取
在這裏插入圖片描述
例:

String str = "helloworld" ; 
System.out.println(str.substring(5)); 
System.out.println(str.substring(0, 5));

注意:

  1. 索引從0開始
  2. 注意前閉後開區間的寫法, substring(0, 5) 表示包含 0 號下標的字符, 不包含 5 號下標

6.其他操作方法
在這裏插入圖片描述

        String str = " abc def ";
        str = str.trim();
        System.out.println(str);//刪除空格

        String str1 = " abc def ";
        str1 = str1.toLowerCase();
        System.out.println(str1);//變成大寫

        String str2 = " abc def ";
        str2 = str2.concat("hello");
        System.out.println(str2);//拼接
    }

    public static void main(String[] args) {
        String str="";//空串
        String str1=null;//空指針引用

        if(str1.isEmpty()){
            System.out.println("abcd");
    }
       if(str.isEmpty()) {
           System.out.println("abcd");//空指針異常
        }
    }

7. StringBuffer 和 StringBuilder

String和StringBuffer大的區別在於:
String的內容無法修改,而StringBuffer的內容可以修改。頻繁修改字符串的 情況考慮使用StingBuffer。

注意
String和StringBuffer類不能直接轉換。如果要想互相轉換,可以採用如下原則:
String變爲StringBuffer: 利用StringBuffer的構造方法append()方法

      StringBuffer a = new StringBuffer("abcdef");
      a.append("JAVA");//拼接
      System.out.println(a);

在String中使用"+"來進行字符串連接,但是這個操作在StringBuffer類中需要更改爲append()方法

StringBuffer變爲String: 調用toString()方法。

    StringBuilder b = new StringBuilder();
        b.append("abcde");
        b.append("gh");
        String s=b.toString();
        //把StringBuilder類型轉化爲String
        System.out.println(s);

請解釋String、StringBuffer、StringBuilder的區別:
1.String的內容不可修改,StringBuffer與StringBuilder的內容可以修改.

2.StringBuffer與StringBuilder大部分功能是相似的 StringBuffer採用同步處理,屬於線程安全操作;而StringBuilder採用異步處理,屬於線程不安全操作.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章