Java —— 字符串

Java —— 字符串

Java 中字符串的不變性

String 對象創建後則不能被修改,是不可變的,所謂的修改其實是創建了新的對象,所指向的內存空間不同。如下所示:

在這裏插入圖片描述
運行結果:
在這裏插入圖片描述
結合上面的代碼,關於字符串小夥伴們必須需要了解滴:

1、 通過 String s1=“愛慕課”; 聲明瞭一個字符串對象, s1 存放了到字符串對象的引用,在內存中的存放引用關係如下圖所示:
在這裏插入圖片描述
然後通過 s1=“歡迎來到:”+s1; 改變了字符串 s1 ,其實質是創建了新的字符串對象,變量 s1 指向了新創建的字符串對象,如下圖所示:
在這裏插入圖片描述
2、 一旦一個字符串在內存中創建,則這個字符串將不可改變。如果需要一個可以改變的字符串,我們可以使用StringBuffer或者StringBuilder(後面章節中會講到)。

3、 每次 new 一個字符串就是產生一個新的對象,即便兩個字符串的內容相同,使用 ”==” 比較時也爲 ”false” ,如果只需比較內容是否相同,應使用 ”equals()” 方法

Java 中 String 類的常用方法 Ⅰ

String 類提供了許多用來處理字符串的方法,例如,獲取字符串長度、對字符串進行截取、將字符串轉換爲大寫或小寫、字符串分割等,下面我們就來領略它的強大之處吧。

String 類的常用方法:
在這裏插入圖片描述
結合代碼來熟悉一下方法的使用:
在這裏插入圖片描述
運行結果:
在這裏插入圖片描述
友情提示:

  1. 字符串 str 中字符的索引從0開始,範圍爲 0 到 str.length()-1

  2. 使用 indexOf 進行字符或字符串查找時,如果匹配返回位置索引;如果沒有匹配結果,返回 -1

  3. 使用 substring(beginIndex , endIndex) 進行字符串截取時,包括 beginIndex 位置的字符,不包括 endIndex 位置的字符

練習:
在這裏插入圖片描述

public class HelloWorld {
    public static void main(String[] args) {
        // Java文件名
		String fileName = "HelloWorld.java"; 
        // 郵箱
		String email = "[email protected]";
		
		// 判斷.java文件名是否正確:合法的文件名應該以.java結尾
        /*
        參考步驟:
        1、獲取文件名中最後一次出現"."號的位置
        2、根據"."號的位置,獲取文件的後綴
        3、判斷"."號位置及文件後綴名
        */
        //獲取文件名中最後一次出現"."號的位置
		int index = fileName.indexOf(".");
        
        // 獲取文件的後綴
		String prefix =fileName.substring(index);
        
		// 判斷必須包含"."號,且不能出現在首位,同時後綴名爲"java"
		if ( index!=-1&&index!=0&&prefix.equals (".java") ) {
			System.out.println("Java文件名正確");
		} else {
			System.out.println("Java文件名無效");
		}

        // 判斷郵箱格式是否正確:合法的郵箱名中至少要包含"@", 並且"@"是在"."之前
         /*
        參考步驟:
        1、獲取文件名中"@"符號的位置
        2、獲取郵箱中"."號的位置
        3、判斷必須包含"@"符號,且"@"必須在"."之前
        */
	    // 獲取郵箱中"@"符號的位置
		int index2 = email.indexOf('@');
        
        // 獲取郵箱中"."號的位置
		int index3 = email.indexOf('.');
        
		// 判斷必須包含"@"符號,且"@"必須在"."之前
		if (index2 != -1 && index3 > index2) {
			System.out.println("郵箱格式正確");
		} else {
			System.out.println("郵箱格式無效");
		}
	}
}

運行結果:
在這裏插入圖片描述

Java 中的 String 類常用方法 Ⅱ

我們繼續來看 String 類常用的方法,如下代碼所示:
在這裏插入圖片描述

運行結果:
在這裏插入圖片描述
那麼,“==” 和 equals() 有什麼區別呢?

==: 判斷兩個字符串在內存中首地址是否相同,即判斷是否是同一個字符串對象

equals(): 比較存儲在兩個字符串對象中的內容是否一致

PS:字節是計算機存儲信息的基本單位,1 個字節等於 8 位, gbk 編碼中 1 個漢字字符存儲需要 2 個字節,1 個英文字符存儲需要 1 個字節。所以我們看到上面的程序運行結果中,每個漢字對應兩個字節值,如“學”對應 “-47 -89” ,而英文字母 “J” 對應 “74” 。同時,我們還發現漢字對應的字節值爲負數,原因在於每個字節是 8 位,最大值不能超過 127,而漢字轉換爲字節後超過 127,如果超過就會溢出,以負數的形式顯示。

練習:
功能:統計指定字符串中字符 ‘a’ 出現的次數

分析:可以通過循環遍歷字符串中的每一個字符,判斷是否是字符 a ,如果是,則累加統計出現的次數

public class HelloWorld {
    public static void main(String[] args) {
		// 定義一個字符串
		String s = "aljlkdsflkjsadjfklhasdkjlflkajdflwoiudsafhaasdasd";
        
        // 出現次數
		int num = 0;
        
         // 循環遍歷每個字符,判斷是否是字符 a ,如果是,累加次數
		for (int i=0; i<s.length(); i++)
		{
            // 獲取每個字符,判斷是否是字符a
			if (s.charAt(i)=='a') {
                // 累加統計次數
				num++; 
			}
		}
		System.out.println("字符a出現的次數:" + num);
	}
}

運行結果:
在這裏插入圖片描述

認識 Java 中的 StringBuilder 類

在Java中,除了可以使用 String 類來存儲字符串,還可以使用 StringBuilder 類或 StringBuffer 類存儲字符串,那麼它們之間有什麼區別呢?

String 類具有是不可變性。如
在這裏插入圖片描述
運行結果:
在這裏插入圖片描述
從運行結果中我們可以看到,程序運行時會額外創建一個對象,保存 “helloworld”。當頻繁操作字符串時,就會額外產生很多臨時變量。使用 StringBuilder 或 StringBuffer 就可以避免這個問題。至於 StringBuilder 和StringBuffer ,它們基本相似,不同之處,StringBuffer 是線程安全的,而 StringBuilder 則沒有實現線程安全功能,所以性能略高。因此一般情況下,如果需要創建一個內容可變的字符串對象,應優先考慮使用 StringBuilder 類。

那麼如何定義 StringBuilder 類的對象呢? 我們來看下面的代碼

public class HelloWorld {
    public static void main(String[] args) {
        
       // 創建一個StringBuilder對象,用來存儲字符串
		StringBuilder hobby=new StringBuilder("愛慕課");
        
		System.out.println(hobby);
	}
}

在這裏插入圖片描述

Java 中的 StringBuilder 類的常用方法

StringBuilder 類提供了很多方法來操作字符串:
在這裏插入圖片描述

例如:在下面的示例代碼中,創建了 StringBuilder 對象,用來存儲字符串,並對其做了追加和插入操作。這些操作修改了 str 對象的值,而沒有創建新的對象,這就是 StringBuilder 和 String 最大的區別。
在這裏插入圖片描述
運行結果:

在這裏插入圖片描述

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