亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

一文帶你吃透Java中的String類

 更新時間:2023年05月10日 16:43:39   作者:蜀山劍客李沐白  
在 Java 中,字符串是一種常見的數(shù)據(jù)類型,經(jīng)常用于存儲一些文本信息,而String類則是Java提供的專門用于字符串操作的類,本文就來和大家聊聊String類的常用方法與實現(xiàn)原理吧

Java語言中的String對象是一個非常常見的數(shù)據(jù)類型,大多數(shù)情況下我們都是在使用String對象來表示字符串類型的數(shù)據(jù)。Java中的String類是一個final class,它是不可被繼承的。本文將對Java中的String對象進行詳細全面的描述,包括以下幾個方面:

一、String類的概述

在 Java 中,字符串是一種常見的數(shù)據(jù)類型,經(jīng)常用于存儲一些文本信息。而String類則是Java提供的專門用于字符串操作的類,在Java標準庫中,它位于java.lang包中。

String類是不可被繼承的final類,即它不能被其他類所繼承,也就是說它不能被修改。String類是通過使用Unicode字符集來表示字符串的,這使得Java支持多語言字符集。由于String類的不可變性(immutable),所以它可以作為安全的參數(shù)發(fā)送給諸如網(wǎng)絡(luò)連接或數(shù)據(jù)庫鏈接之類的方法,而不必擔心其被篡改。String對象可以用來存儲任何字符串類型的數(shù)據(jù),包括HTML、XML等格式的字符串。

二、String類的構(gòu)造函數(shù)

在 Java 中,String類提供了多種構(gòu)造函數(shù),可以用于創(chuàng)建字符串對象。下面是String類的一些常用構(gòu)造函數(shù):

  • String(char[] value):根據(jù)字符數(shù)組value來創(chuàng)建String對象。
  • String(char[] value, int offset, int count):根據(jù)字符數(shù)組value的指定部分(offset開始的count個字符)來創(chuàng)建String對象。
  • String(byte[] bytes):根據(jù)字節(jié)數(shù)組bytes來創(chuàng)建String對象,使用平臺默認的字符集。
  • String(byte[] bytes, Charset charset):根據(jù)字節(jié)數(shù)組bytes來創(chuàng)建String對象,使用指定的字符集charset。
  • String(String original):根據(jù)原始字符串original來創(chuàng)建String對象。

例如:

String str1 = new String("Hello World!"); 
char[] charArray = {'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd', '!'};
String str2 = new String(charArray);

三、String類的常用方法

在Java中,String類還提供了很多常用的方法,下面我們來介紹一些常用的方法:

3.1、字符串拼接

String concat(String str):連接指定的字符串參數(shù)到此字符串的末尾。

例如:

String s1 = "Hello";
String s2 = "World";
String s3 = s1.concat(s2); // s3 = "HelloWorld"

3.2、字符串截取

  • char charAt(int index):返回指定索引處的 char 值。
  • int indexOf(int ch):返回指定字符在此字符串中第一次出現(xiàn)處的索引。
  • int indexOf(int ch, int fromIndex):返回指定字符在此字符串中從指定位置后第一次出現(xiàn)處的索引。
  • int indexOf(String str):返回指定子字符串在此字符串中第一次出現(xiàn)處的索引。
  • int lastIndexOf(int ch):返回指定字符在此字符串中最后一次出現(xiàn)處的索引。
  • int lastIndexOf(int ch, int fromIndex):返回指定字符在此字符串中從指定位置前最后一次出現(xiàn)處的索引。
  • int lastIndexOf(String str):返回指定子字符串在此字符串中最后一次出現(xiàn)處的索引。
  • String substring(int beginIndex):返回一個新的字符串,它是此字符串的一個子字符串。
  • String substring(int beginIndex, int endIndex):返回一個新的字符串,它是此字符串的一個子字符串。

例如:

String str = "Java is the best programming language!";
System.out.println(str.charAt(5)); // out: 'i'
System.out.println(str.indexOf("the")); // out: 8
System.out.println(str.substring(0, 4)); // out: "Java"

3.3、字符串替換

  • String replace(char oldChar, char newChar):返回一個新的字符串,它是通過用 newChar 替換此字符串中出現(xiàn)的所有 oldChar 得到的。
  • String replace(CharSequence target, CharSequence replacement):使用指定的 replacement 替換此字符串所有匹配給定的正則表達式的子字符串。

例如:

String str = "Java is the best programming language!";
System.out.println(str.replace('a', 'A')); // out: "JAvA is the best progrAmming lAnguAge!"
System.out.println(str.replace("the", "a")); // out: "Java is a best programming language!"

3.4、字符串分割

  • String[] split(String regex):根據(jù)指定的正則表達式拆分此字符串。
  • String[] split(String regex, int limit):根據(jù)指定的正則表達式拆分此字符串,最多拆分出limit個子字符串。

例如:

String str = "Java is the best programming language!";
String[] words1 = str.split(" ");
System.out.println(Arrays.toString(words1)); 
// out: ["Java", "is", "the", "best", "programming", "language!"]
String[] words2 = str.split(" ", 3); 
System.out.println(Arrays.toString(words2)); 
// out: ["Java", "is", "the best programming language!"]

3.5、大小寫轉(zhuǎn)換

  • String toLowerCase():使用默認語言環(huán)境的規(guī)則將此 String 所有字符都轉(zhuǎn)換為小寫。
  • String toUpperCase():使用默認語言環(huán)境的規(guī)則將此 String 所有字符都轉(zhuǎn)換為大寫。

例如:

String str = "Java is the best programming language!";
System.out.println(str.toUpperCase()); // out: "JAVA IS THE BEST PROGRAMMING LANGUAGE!"

3.6、字符串比較

  • boolean equals(Object anObject):將此字符串與指定對象進行比較。如果兩個對象相等,則返回 true;否則返回 false。
  • boolean equalsIgnoreCase(String anotherString):將此 String 與另一個 String 進行比較,不考慮大小寫。
  • boolean startsWith(String prefix):測試此字符串是否以指定的前綴開始。
  • boolean endsWith(String suffix):測試此字符串是否以指定的后綴結(jié)束。
  • int compareTo(String anotherString):按字典順序比較兩個字符串。

例如:

String str1 = "Java is awesome!";
String str2 = "Java is great!";
System.out.println(str1.equals(str2)); // out: false
System.out.println(str1.startsWith("Java")); // out: true
System.out.println(str2.endsWith("great!")); // out: true
System.out.println(str1.compareTo(str2)); // out: -6

四、String類的不可變性原理及優(yōu)缺點

String類在Java中是不可變的(immutable)的,這意味著一旦創(chuàng)建了一個String對象,它的值就不能被修改。String類的不可變性主要由以下兩個方面造成:

4.1、String類的存儲結(jié)構(gòu)

在Java中,String對象實際上是一個包含字符數(shù)組的引用和一個表示字符串長度的整數(shù)。因此,在進行字符串操作時,String對象的引用和長度是不會變化的,只有字符數(shù)組才會被修改。而由于Java數(shù)組是一個固定長度的數(shù)據(jù)結(jié)構(gòu),因此String對象的不可變性就被保證了。

4.2、String類的操作方法

在Java中,String對象提供了很多用于字符串操作的方法(例如substring、concat等)。這些方法都是返回一個新的String對象,而不會在原有的String對象上進行修改,這也保證了String對象的不可變性。

String對象的不可變性帶來了下面的優(yōu)點:

  • 線程安全:由于String對象的不可變性,多個線程可以對同一個String對象進行訪問操作,而不必擔心數(shù)據(jù)的安全問題。
  • 安全性:由于String對象不可變,它不能被篡改,從而可以避免一些惡意攻擊。
  • 性能優(yōu)化:由于String對象是不可變的,因此可以進行一些性能方面的優(yōu)化。例如,String類實現(xiàn)了字符串池這個概念。

同時也存在以下缺點:

  • 內(nèi)存占用:由于每次使用String類進行字符串操作時,都會創(chuàng)建一個新的String對象,并且原有的String對象不會被修改,這樣就會占用更多的內(nèi)存空間。
  • 創(chuàng)建大量垃圾對象:由于String對象的不可變性,每進行一次字符串操作就會創(chuàng)建一個新的String對象,如果進行大量的字符串操作,就會創(chuàng)建大量的垃圾對象,導(dǎo)致垃圾回收器的頻繁運行。
  • 字符串拼接效率低:由于每進行一次字符串拼接操作,就會創(chuàng)建一個新的String對象,效率較低。

五、String類的實現(xiàn)原理及性能問題

在 Java 中,String對象是通過char[]字符數(shù)組來存儲字符串的。StringBuilder和StringBuffer也是通過char[]數(shù)組來存儲字符串的,只不過它們在進行字符串操作時,會在原有的char[]數(shù)組上進行修改,而不是每次都創(chuàng)建一個新的char[]數(shù)組。

由于String對象的不可變性,每次對String對象進行字符串操作時都會創(chuàng)建一個新的String對象,這樣會導(dǎo)致大量的內(nèi)存開銷和垃圾對象的產(chǎn)生,因此在進行大量的字符串操作時,應(yīng)該盡量使用StringBuilder或StringBuffer來避免這些問題。

StringBuilder和StringBuffer都繼承了AbstractStringBuilder類,它們之間的區(qū)別在于StringBuilder是線程不安全的,而StringBuffer是線程安全的。如果多個線程需要對同一個字符串進行操作時,應(yīng)該使用StringBuffer來保證線程安全性。

在進行字符串操作時,如果需要創(chuàng)建一個新的String對象,可以使用靜態(tài)方法String.valueOf()或者直接將字符數(shù)組傳遞給String類的構(gòu)造函數(shù)來創(chuàng)建新的String對象,這樣可以避免產(chǎn)生大量的垃圾對象。

六、字符串池的工作原理

Java中有一種稱為字符串池(String Pool)的機制,它的主要作用是避免創(chuàng)建重復(fù)的String對象,從而節(jié)省內(nèi)存空間。

當創(chuàng)建一個字符串時,JVM首先會在字符串池中查找該字符串是否已經(jīng)存在。如果存在,則返回該字符串在字符串池中的引用;否則,在字符串池中創(chuàng)建該字符串,并返回該字符串在字符串池中的引用。

下面是一個示例代碼:

String str1 = "Hello";
String str2 = "Hello";
String str3 = new String("Hello");

System.out.println(str1 == str2); // true,因為str1和str2都指向字符串池中的同一個對象
System.out.println(str1 == str3); // false,因為str3指向堆內(nèi)存中新創(chuàng)建的String對象

因此,如果需要創(chuàng)建多個相同的字符串對象,可以直接使用字符串池中已有的對象,這樣可以節(jié)省內(nèi)存空間。

七、String類與StringBuilder、StringBuffer的比較

在進行字符串操作時,Java中常用的有String、StringBuilder和StringBuffer三種類。

  • String:String類是不可變的,每次進行字符串操作時都會創(chuàng)建一個新的String對象。因此,在需要大量字符串操作時,使用String類效率較低。
  • StringBuilder:StringBuilder是可變的,它可以在原有的字符數(shù)組上進行修改,而不用每次都創(chuàng)建一個新的字符數(shù)組。因此,在需要大量字符串操作時,使用StringBuilder類可以提高效率。
  • StringBuffer:StringBuffer也是可變的,并且是線程安全的,因此適用于多個線程對同一字符串進行操作的場景。

下面是一個比較字符串拼接效率的示例代碼:

String s = "";
for (int i = 0; i < 10000; i++) {
    s += "a";
}

上述代碼中使用了String來進行字符串拼接操作,每次都會創(chuàng)建一個新的String對象,因此效率較低。下面是使用StringBuilder進行字符串拼接的代碼示例:

StringBuilder sb = new StringBuilder();
for (int i = 0; i < 10000; i++) {
    sb.append("a");
}
String s = sb.toString();

由于StringBuilder是可變的,因此在進行字符串操作時效率較高。

總之,在進行大量的字符串操作時,應(yīng)該盡量使用StringBuilder或StringBuffer,避免使用String類導(dǎo)致效率低下。

以上就是一文帶你吃透Java中的String類的詳細內(nèi)容,更多關(guān)于Java String類的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • java在文件尾部追加內(nèi)容的簡單實例

    java在文件尾部追加內(nèi)容的簡單實例

    下面小編就為大家?guī)硪黄猨ava在文件尾部追加內(nèi)容的簡單實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-12-12
  • Java引用類型interface的用法總結(jié)

    Java引用類型interface的用法總結(jié)

    這篇文章主要為大家詳細介紹了Java中引用類型interface的用法的相關(guān)資料,文中的示例代碼講解詳細,對我們學(xué)習(xí)Java有一定幫助,感興趣的可以了解一下
    2022-10-10
  • MyBatis-Plus攔截器對敏感數(shù)據(jù)實現(xiàn)加密

    MyBatis-Plus攔截器對敏感數(shù)據(jù)實現(xiàn)加密

    做課程項目petstore時遇到需要加密屬性的問題,而MyBatis-Plus為開發(fā)者提供了攔截器的相關(guān)接口,本文主要介紹通過MyBatis-Plus的攔截器接口自定義一個攔截器類實現(xiàn)敏感數(shù)據(jù)如用戶密碼的加密功能,感興趣的可以了解一下
    2021-11-11
  • 淺談Java中static關(guān)鍵字的作用

    淺談Java中static關(guān)鍵字的作用

    這篇文章主要介紹了Java中static關(guān)鍵字的作用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • Java8并行流中自定義線程池操作示例

    Java8并行流中自定義線程池操作示例

    這篇文章主要介紹了Java8并行流中自定義線程池操作,結(jié)合實例形式分析了并行流的相關(guān)概念、定義及自定義線程池的相關(guān)操作技巧,需要的朋友可以參考下
    2019-05-05
  • SpringBoot根據(jù)目錄結(jié)構(gòu)自動配置Url前綴方式

    SpringBoot根據(jù)目錄結(jié)構(gòu)自動配置Url前綴方式

    這篇文章主要介紹了SpringBoot根據(jù)目錄結(jié)構(gòu)自動配置Url前綴方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • java使用java.io.File類和java.nio.file.Path類對文件重命名

    java使用java.io.File類和java.nio.file.Path類對文件重命名

    這篇文章主要給大家介紹了關(guān)于java使用java.io.File類和java.nio.file.Path類對文件重命名的相關(guān)資料,本文僅為日常操作記錄,方便后期使用查找本地電腦文件太多了,又不想一個一個重命名,改名字什么的很麻煩,需要的朋友可以參考下
    2024-02-02
  • SpringBoot的@Value注解如何設(shè)置默認值

    SpringBoot的@Value注解如何設(shè)置默認值

    這篇文章主要介紹了SpringBoot的@Value注解如何設(shè)置默認值問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • mybatis group by substr函數(shù)傳參報錯的解決

    mybatis group by substr函數(shù)傳參報錯的解決

    這篇文章主要介紹了mybatis group by substr函數(shù)傳參報錯的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01

最新評論