Java substring 方法詳解

一、基本介紹

Java中的字符串是不可變對象,不能像數組一樣通過下標來修改指定位置的字符。substring方法可以從一個字符串中截取一部分子串,返回一個新的字符串對象,可以基於原始字符串對象創建一個新的不可變字符串。

Java substring方法的語法如下:

public String substring(int beginIndex)
public String substring(int beginIndex, int endIndex)

字符串中字符的下標從0開始,beginIndex參數指定要截取的子串的起始字符的下標,endIndex參數指定要截取的子串的最後一個字符的下標加1,即`[beginIndex, endIndex)`表示一個左閉右開區間。如果省略第二個參數,則表示截取從beginIndex到字符串的最後一個字符的子串。

二、截取子串

截取原始字符串中的一部分作為新字符串,是substring方法最基本的功能,常用於在處理字符串時獲取字符串中某個區間的子串。以下是一個簡單的示例:

    String str = "hello, world";
    String substr1 = str.substring(0, 5);
    System.out.println(substr1); // 輸出hello
    String substr2 = str.substring(7);
    System.out.println(substr2); // 輸出world

在以上代碼中,將原始字符串str中從0到5的字符截取下來作為子串,得到新的字符串substr1,輸出hello;將原始字符串str中從7到最後一個字符的字符截取下來作為子串,得到新的字符串substr2,輸出world。

三、字符串共享

Java中的字符串為了避免重複創建對象,採用了共享字符串對象的方式來節省內存。在實際編程中需要注意這個特點,特別是對於截取子串這個操作,需要理解共享的本質。以下是一個示例:

    String str = "hello, world";
    String substr = str.substring(0, 5);
    System.out.println(str == substr); // 輸出false

在以上代碼中,原始字符串str和截取後得到的子串substr不是同一個對象,輸出了false。這是因為子串是通過創建新的字符串對象來實現的,與原始字符串分別佔用內存空間。但是,如果我們截取的子串與原始字符串完全重合,Java中採用的是共享對象的方式,共享的本質是子串對象與原始字符串對象指向的是同一個char數組,不同的是子串對象引用了數組的一部分,原始字符串對象引用了整個數組。如果要比較兩個字符串對象是否相等,需要使用equals方法,不能直接使用==運算符。

    String str = "hello, world";
    String substr = str.substring(0, 5);
    String substr2 = str.substring(0, 5);
    System.out.println(substr == substr2); // 輸出true

在以上代碼中,將原始字符串str中從0到5的字符截取下來作為子串substr和substr2,由於兩個子串的字符完全相同,Java採用了共享的方式,substr和substr2指向同一個對象,輸出了true。

四、異常處理

使用substring方法時需要注意邊界問題,如果beginIndex或endIndex的取值超出了字符串的實際範圍,則會報字符串索引越界異常(StringIndexOutOfBoundsException),需要使用try-catch語句來處理異常。以下是一個示例:

    String str = "hello, world";
    try {
        String substr = str.substring(0, 100); // 報異常:StringIndexOutOfBoundsException
    } catch (StringIndexOutOfBoundsException e) {
        e.printStackTrace();
    }

在以上代碼中,我們嘗試從原始字符串中截取從0到100的字符,由於超出了實際字符範圍,導致字符串索引越界異常,可以在try-catch語句塊中處理異常,避免程序崩潰。

五、不可變字符串

Java中的字符串是不可變的對象,無法修改原始字符串中的字符,使用substring方法獲得的子串也同樣是不可變的,不能通過下標修改其中的字符,要在處理字符串時需要反覆截取子串,每次都需要創建新的字符串對象,會產生大量的內存垃圾。以下是一個具體的示例:

    String str = "hello, world";
    for (int i = 0; i < str.length(); i++) {
        String substr = str.substring(0, i + 1);
        System.out.println(substr);
    }

在以上代碼中,我們從開頭逐漸截取字符串中的字符,輸出所有可能的子串。由於Java中字符串是不可變的對象,每次截取都會創建新的字符串對象,需要消耗大量的內存,併產生大量的內存垃圾。如果處理的字符串較長,需要減少內存消耗和垃圾產生,可以考慮使用可變字符串(StringBuilder或StringBuffer)。

六、可變字符串

可變字符串是Java中的一種特殊字符串類型,可以隨時修改其中的字符,而不會像不可變字符串那樣每次修改都需要創建新的字符串對象。Java提供了兩種可變字符串類型,分別是StringBuilder和StringBuffer,二者差異較小,都可以用於修改字符串。以下是一個示例:

    StringBuilder builder = new StringBuilder("hello, world");
    builder.setCharAt(0, 'H');
    builder.append(", Java");
    String str = builder.toString();
    System.out.println(str);

在以上代碼中,我們創建了一個StringBuilder對象,將其初始化為”hello, world”,然後使用setCharAt方法將第一個字符修改為大寫的H,再使用append方法追加了一個字符串”, Java”,最後使用toString方法將StringBuilder對象轉化為字符串對象。與不可變的字符串不同,使用可變字符串可以直接修改字符,避免了創建新對象的開銷。

七、小結

Java substring方法是字符串處理中常用的方法之一,可以從一個字符串中截取一部分作為新字符串使用。使用時需要注意邊界問題,避免字符串索引越界異常的發生。Java中的字符串是不可變對象,無法直接修改其中的字符,經常反覆截取字符串會產生大量的內存垃圾,可以考慮使用可變字符串來代替不可變字符串。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/229116.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-10 12:07
下一篇 2024-12-10 12:07

相關推薦

  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Bean加載過程

    Java Bean加載過程涉及到類加載器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean加載的過程。 一、類加載器 類加載器是Java虛擬機…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • 解決.net 6.0運行閃退的方法

    如果你正在使用.net 6.0開發應用程序,可能會遇到程序閃退的情況。這篇文章將從多個方面為你解決這個問題。 一、代碼問題 代碼問題是導致.net 6.0程序閃退的主要原因之一。首…

    編程 2025-04-29
  • ArcGIS更改標註位置為中心的方法

    本篇文章將從多個方面詳細闡述如何在ArcGIS中更改標註位置為中心。讓我們一步步來看。 一、禁止標註智能調整 在ArcMap中設置標註智能調整可以自動將標註位置調整到最佳顯示位置。…

    編程 2025-04-29
  • Python創建分配內存的方法

    在python中,我們常常需要創建並分配內存來存儲數據。不同的類型和數據結構可能需要不同的方法來分配內存。本文將從多個方面介紹Python創建分配內存的方法,包括列表、元組、字典、…

    編程 2025-04-29
  • Python中init方法的作用及使用方法

    Python中的init方法是一個類的構造函數,在創建對象時被調用。在本篇文章中,我們將從多個方面詳細討論init方法的作用,使用方法以及注意點。 一、定義init方法 在Pyth…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發布。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29

發表回復

登錄後才能評論