經常使用類回顧之(String類)

String類:

String類:表示不可變的字符串,當前對象建立完畢以後,該對象的內容(字符序列)是不能改變的,一旦內容改變就是一個新的對象.

String對象的建立:

1):直接賦一個字面量: String str1 = 「ABCD」;java

2):經過構造器建立: String str2 = new String(「ABCD」);面試

兩種方式有什麼區別,分別在內存中如何分佈?數組

String對象的空值:安全

1):表示引用爲空(null): String str 1 = null; 沒有初始化,沒有分配內存空間.多線程

2):內容爲空字符串: String str2 = 「」; 以及初始化,分配內存空間,不過沒有內容.

判斷字符串非空:

1):引用不能爲空(null);併發

2):字符內容不能爲空字符串(「」);app


字符串的比較操做:

1):使用」==」號: 只能比較引用的內存地址是否相同.工具

2):使用equals方法: 在Object類中和」==」號相同,建議子類覆蓋equals方法去比較本身的內容.String類覆蓋equals方法,比較的是字符內容.性能

面試題1:

:::下列代碼分別建立了幾個String對象.測試

String str1 = 「ABCD」;

//最多建立一個String對象,最少不建立String對象.若是常量池中,以及存在」ABCD」,那麼str1直接引用,此時不建立String對象.不然,先在常量池先建立」ABCD」內存空間,再引用.

String str2 = new String(「ABCD」);

最多建立兩個String對象,至少建立一個String對象.new關鍵字:絕對會在堆空間,建立內存區域. 因此至少建立一個String個對象.

面試題2:

:::說說下面String對象,彼此之間是否相等.

String str1="ABCD";
    String str2="A"+"B"+"C"+"D";
    String str3="AB"+"CD";
    String temp="CD";
    String str4="AB"+temp;
    
    System.out.println(str1==str2);
    System.out.println(str1==str3);
    System.out.println(str1==str4);

String對象比較:

1):單獨使用""引號建立的字符串都是直接量,編譯期就已經肯定存儲到常量池中;

2):使用new String("")建立的對象會存儲到堆內存中,是運行期才建立;

3):使用只包含直接量的字符串鏈接符如"aa" + "bb"建立的也是直接量編譯期就能肯定,已經肯定存儲到常量池中(str2和str3);

4):使用包含String直接量(無final修飾符)的字符串表達式(如"aa" + s1)建立的對象是運行期才建立的,存儲在堆中;

經過變量/調用方法去鏈接字符串,都只能在運行時期才能肯定變量的值和方法的返回值,不存在編譯優化操做.

經常使用方法:

1):String的建立和轉換:

byte[] getBytes():把字符串轉換爲byte數組
String(byte[] bytes):把byte數組轉換爲字符串

————————————————————————————————————————————————————————————————————

String str="abcd";
    byte[] bytes=str.getBytes();
    for (byte b : bytes) {
        System.out.println(b);
    }
    String str2=new String(bytes);
    System.out.println(str2);

——————————————————————————————————————————————————————————————————

char[] toCharArray():把字符串轉換爲char數組

String(char[] value):把char數組轉換爲字符串

String str="abcd";
    char[] chars=str.toCharArray();
    for (char c : chars) {
        System.out.println(c);
    }
    System.out.println(new String(chars));

獲取字符串信息

int length() 返回此字符串的長度

char charAt(int index) 返回指定索引處的 char 值

int indexOf(String str)返回指定子字符串在此字符串中第一次出現處的索引。

int lastIndexOf(String str)返回指定子字符串在此字符串中最右邊出現處的索引

String str="abcda";
            System.out.println(str.length());
            System.out.println(str.charAt(0));
            System.out.println(str.indexOf("cd"));
            System.out.println(str.lastIndexOf('a'));
            System.out.println(str.contains("b"));

字符串比較判斷

boolean equals(Object anObject) 將此字符串與指定的對象比較。

boolean equalsIgnoreCase(String anotherString) 將此 String 與另外一個 String 比較,不考慮大小寫

boolean contentEquals(CharSequence cs) 將此字符串與指定的 CharSequence 比較

String a1="abc";
    String a2="aBc";
    
    System.out.println(a1.equals(a2));
    System.out.println(a1.equalsIgnoreCase(a2));
    System.out.println(a1.contentEquals(a2));

字符串大小寫轉換

String toUpperCase() 把當前字符串轉換爲大寫(誰調用該方法,誰就是當前字符)

String toLowerCase() 把當前字符串轉換爲小寫

練習1:有這麼樣一個字符串"a1.txt;a2.txt;a3.jpg;hello.java;33.png",獲取以hello開頭的文件的文件名和擴展名.

String str="a1.txt;a2.txt;a3.jpg;hello.java;33.png";
    String[] filenames=str.split(";");
    for (String s : filenames) {
        //System.out.println(s);
        if(s.startsWith("hello")){
            int index=s.lastIndexOf(".");
            System.out.println("hello"+s.substring(index));
        }
        
    }

練習2:寫一個工具類,判斷字符串非空或空

package gwd.com.day12;

public class  utils {
    
private utils(){}

    
public static boolean hasLength(String str){
        
return str!=null && !"".equals(str.trim());
}
    
public static boolean isBlank(String str) {
return !hasLength(str);
}

}

String、StringBuilder、StringBuffer

分別使用String/StringBuilder/StringBuffer來拼接30000次字符串,對比各自損耗的時間:

通過測試:

String作字符串拼接的時候,性能極低(耗時),緣由是Sting是不可變的,每次內容改變都會在內存中建立新的對象.

String耗時:1964ms

StringBuffer耗時:3ms

StringBuilder耗時:1ms

結論:之後拼接字符串,通通使用StringBuffer/StringBuilder,不要使用String.


String和StringBuilder以及StringBuffer的區別(建議使用StringBuilder):

StringBuffer和StringBuilder都表示可變的字符串,功能方法都是相同的.

惟一的區別:

StringBuffer: StringBuffer中的方法都使用了synchronized修飾符,表示同步的,在多線程併發的時候能夠保證線程安全,保證線程安全的時候,性能(速度)較低.

StringBuilder:StringBuilder中的方法都沒有使用了synchronized修飾符,不安全,可是性能較高.

使用StringBuilder無參數的構造器,在底層建立了一個長度爲16的char數組:

char[] value = new char[16];

此時該數組只能存儲16個字符,若是超過了,得自動擴容.自動擴容(建立長度更大的數組,再把以前的數組拷貝到新數組)
此時性能極低,通常的,咱們事先知道大概須要存儲多少字符,在構造器中就應該設置.

//建立一個長度爲80的char數組.

new StringBuilder(80);

經常使用方法:

append(Object val):表示追加任意類型數據

StringBuilder deleteCharAt(int index) :刪除字符串中,指定位置的字符

StringBuilder sb=new StringBuilder();
    sb.append("xx");
    sb.append("tt");
    
    System.out.println(sb);
相關文章
相關標籤/搜索