String類的常用方法以及知識點總結


 

一,String的簡介:

  •   查閱API中的String類的描述,發現String 類代表字符串。Java 程序中的所有字符串字面值(如 "abc" )都作為此類的實例實現。
  •   一旦這個字符串確定了,那么就會在內存區域中就生成了這個字符串。字符串本身不能改變,但str變量中記錄的地址值是可以改變的。
  •   字符串的本質是一個字符的數組(String類一旦被創建,就不能被改變)。

1.1,String常量池

  •   字符串的分配,和其他的對象分配一樣,耗費高昂的時間與空間代價。JVM為了提高性能和減少內存開銷,
  •   在實例化字符串常量的時候進行了一些優化。為 了減少在JVM中創建的字符串的數量,字符串類維護了一個字符串池,
  •   每當代碼創建字符串常量時,JVM會首先檢查字符串常量池。如果字符串已經存在池中, 就返回池中的實例引用。
  •   如果字符串不在池中,就會實例化一個字符串並放到池中。Java能夠進行這樣的優化是因為字符串是不可變的,可以不用擔心數據沖突
  •   進行共享。
1 public class Program
2 {
3     public static void main(String[] args)
4     {
5        String str1 = "Hello";  
6        String str2 = "Hello"; 
7        System.out.print(str1 == str2); //結果為true 8     }
9 }

  Note:String s = "aaa";
    這里,jvm創建一個變量引用s,在堆中創建一個對象aaa,將aaa放進常量池。s指向aaa。
    然后就到了change方法里,常量池在java用於保存在編譯期已確定的,已編譯的class文件中的一份數據。它包括了關於類,方法,接口等中的常量,也包括字符串常量。

1.2,String s = "aaa";與String s = new String("aaa");的區別:

  •   String s = "aaa"; 對象只是一個引用,內存中如果有"aaa"的話,s就指向它;如果沒有,才創建它;
  •   如果你以后還用到"aaa"這個字符串的話並且是這樣用:
  •   String ss = "aaa"; String sss = "aaa"; 這三個變量都共享"aaa"。
  •   而String s = new String("aaa");是根據"aaa"這個String對象再次構造一個String對象,將新構造出來的String對象的引用賦給aaa

1.3,String字符串的方法:

  •   public int length():返回此字符串的長度。
  •   public String():空構造
  •   public String(byte[] bytes):把字節數組轉成字符串
  •   public String(byte[] bytes,int index,int length):把字節數組的一部分轉成字符串
  •   public String(char[] value):把字符數組轉成字符串
  •   public String(char[] value,int index,int count):把字符數組的一部分轉成字符串
  •   public String(String original):把字符串常量值轉成字符串

1.4,String類的判斷功能:

  •   boolean equals(Object obj):比較字符串的內容是否相同,區分大小寫a A
  •   boolean equalsIgnoreCase(String str):比較字符串的內容是否相同,忽略大小寫 a A
  •   boolean contains(String str):判斷大字符串中是否包含小字符串
  •   boolean startsWith(String str):判斷字符串是否以某個指定的字符串開頭
  •   boolean endsWith(String str):判斷字符串是否以某個指定的字符串結尾
  •   boolean isEmpty():判斷字符串是否為空。

1.5,String類的獲取功能:

  •   int length():獲取字符串的長度。
  •   char charAt(int index):獲取指定索引位置的字符
  •   int indexOf(String str):返回指定字符串在此字符串中第一次出現處的索引。
  •   int indexOf(int ch,int fromIndex):返回指定字符在此字符串中從指定位置后第一次出現處的索引。
  •   int indexOf(String str,int fromIndex):返回指定字符串在此字符串中從指定位置后第一次出現處的索引。
  •   String substring(int start):從指定位置開始截取字符串,默認到末尾。
  •   String substring(int start,int end):從指定位置開始到指定位置結束截取字符串。

1.6,String的轉換功能:                                 

  •   byte[] getBytes():把字符串轉換為字節數組。
  •   char[] toCharArray():把字符串轉換為字符數組。
  •   static String valueOf(char[] chs):把字符數組轉成字符串。
  •   static String valueOf(int i):把int類型的數據轉成字符串。
  •   注意:String類的valueOf方法可以把任意類型的數據轉成字符串。
  •   String toLowerCase():把字符串轉成小寫。
  •   String toUpperCase():把字符串轉成大寫。
  •   String concat(String str):把字符串拼接。

1.7,String類的其他方法:                                   

  1.String rerplace(char old,char new);
    返回一個新的字符串,它是通過用 newChar 替換此字符串中出現的所有 oldChar 得到的。
  2.String replace(String old,String new);
    返回一個新的字符串,它是通過用 newChar 替換此字符串中出現的所有 oldChar 得到的。
  3.String trim();
    去掉字符串兩端的空格

1.8,字符串的" "與null的區別:                                

  ""是字符串常量.同時也是一個String類的對象,既然是對象當然可以調用String類中的方法;
  Null是空常量,不能調用任何的方法,否則會出現空指針異常,null常量可以給任意的引用數據類型賦值

二,創建字符串對象的兩種方式的區別:                             

2.1直接賦值創建對象:                                    

   1 String str = "hello world"; //直接賦值  

  直接賦值的方式創建的對象在方法的常量池中

2.2,通過new關鍵字進行創建對象:                              

   1 String str=new String("hello");//實例化的方式 

  通過構造方法創建字符串對象是在堆內存

2.3,兩種實例化方式的比較:                                 

  1)編寫代碼比較

 1     public static void main(String[] args) {
 2         String str = "hello";
 3         String strl = new String("hello");
 4         String strll = strl; // 引用傳遞,str3直接指向st2的堆內存地址
 5         String strlll = "hello";
 6         /**
 7          * ==: 基本數據類型:比較的是基本數據類型的值是否相同 引用數據類型:比較的是引用數據類型的地址值是否相同
 8          * 所以在這里的話:String類對象==比較,比較的是地址,而不是內容
 9          */
10         System.out.println(str == strl);    //結果:false 因為一個在常量池 一個在堆中所以地址不一樣
11         System.out.println(str == strll);    //結果:false 因為strll 引用了strl的地址
12         System.out.println(strll == strl);    //結果:true 地址值相等,引用類型比較的是地址值
13         System.out.println(str == strlll);    //結果:true 因為他們倆都引用了hello的常量所以相等
14 
15     }

  2)內存圖分析

 

4)總結:兩種實例化方式的區別
  1)直接賦值(String str = "hello"):只開辟一塊堆內存空間,並且會自動入池,不會產生垃圾。
  2)構造方法(String str= new String("hello");):會開辟兩塊堆內存空間,其中一塊堆內存會變成垃圾被系統回收,
    而且不能夠自動入池,需要通過public String intern();方法進行手工入池。
    在開發的過程中不會采用構造方法進行字符串的實例化。

三,關於String的面試題:

  2.4.1,String,StringBuffer和Stringbuilder有什么區別:

      String是字符串常量,一旦創建就不能修改;StringBuffer和StringBuilder是字符串可變量,可以修改,但是StringBuffer是線程安全的,StringBuilder是線程不安全的

  2.4.2,下面的代碼將創建幾個字符串對象。

1 public static void main(String[] args) {
2      String s1 = new String("Hello");  
3      String s2 = new String("Hello");
4       //答案是3個對象.
5         //第一,行1 字符串池中的“hello”對象。
6         //第二,行1,在堆內存中帶有值“hello”的新字符串。
7         //第三,行2,在堆內存中帶有“hello”的新字符串。這里“hello”字符串池中的字符串被重用。      
8         
9 }    

  2.4.3代碼中有幾個字符串被創建;

     1 String str = new String("Cat"); 

    答:上面一行代碼將會創建1或2個字符串。如果在字符串常量池中已經有一個字符串“Cat”,那么就創建一個“Cat”字符串。
    如果字符串常量池中沒有“Cat”,那么首先會在字符串池中創建,然后才在堆內存中創建,這種情況就會創建2個對象了。  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM