1. 程式人生 > >【JavaSE】之String類

【JavaSE】之String類

                                              .java.long.String類

1.String類的兩種例項化方式

a.直接賦值(直接賦值,在堆上分配空間)

String str1 = "Hello World";
System.out.println(str1);

b.傳統方法(通過構造方法例項化String物件)

String str2 = new String("Hello World");
System.out.println(str2);

2.字串相等比較

如果是兩個int型,判斷其相等完全可以用==來判斷

public boolean equals(String anotherString):成員方法(通過物件呼叫)

str1.equals(anotherString)

==比較的是兩字串的地址   equals比較的是兩字串的內容

String str1 = "Hello World";
String str2 = new String("Hello World");
System.out.println(str1 == str2);

String str1 = "Hello World";
String str2 = new String("Hello World");
System.out.println(str1.equals(str2));

3.字串常量(“ ”)是String的匿名物件 

System.out.println(“hello”.equals(str2));(推薦)

String str1 = null;
System.out.println("Hello World".equals(str1));

System.out.println(str2.equals(“hello”));  如果str為空,則會出現空指標異常

String str1 = null;
System.out.println(str1.equals("Hello World"));

小 tips:如果要判斷使用者輸入的字串是否等同與特定字串,一定要將特定字串(String常量)寫在前面,避免NULLPointerException。

4.String類的設計採用了共享設計模式

        JVM底層會自動維護一個字串的物件池(物件陣列),如果現在採用直接賦值的形式進行String的物件例項化,該物件會自動儲存在這個物件池中。如果下次繼續使用直接賦值的模式宣告String物件,此時物件池中若有指定內容,則直接引用;如果沒有,則開闢新的對空間後將其儲存在物件池中供下次使用。

手工入池(本地方法):    public native String intern(); 成員方法

a.採用直接賦值法

String str1 = "hello";
String str2 = "hello";
String str3 = "hello";
System.out.println(str1 == str2);
System.out.println(str2 == str3);
System.out.println(str1 == str3);

b.採用構造方法

String str1 = new String("hello");

        String str = "hello";
        String str1 = new String("hello").intern();
        System.out.println(str == str1);

5.字串常量不可變更

字串一旦定義後不可改變;字串的加操作一定少產生,最多不超過3次

        String str = "hello";
        str += "world";
        str += "!!!";
        System.out.println(str);

        可以發現字串上沒有發生任何變化,但是字串物件的引用一直在改變,而且會形成大量的垃圾空間,所以以下程式碼不應該出現:

String str = "hello";
for(int i=0; i<1000; i++){
    str += x;
}
System.out.println(str);

原則:

a.字串使用就採用直接賦值

b.字串比較就使用equals()實現

c.字串別改變太多

6.字元與字串的相互轉換(非常重要)

a.將字元陣列轉為字串

public String (char[ ]   value)-> new String (char[ ])

        char[] data = new char[]{'h','e','l','l','o'};
        String str = new String(data);
        System.out.println(str);

public String(char[ ]  value, int  offest【開始位置】, int  count【數量】)

        char[] data = new char[]{'h','e','l','l','o'};
        String str = new String(data,0,2);
        System.out.println(str);

b.將字串轉為單個字元

public char charAt (int index【下標】)   【如果索引超出範圍會越界異常】

        String str = "hello";
        char c = str.charAt(0);
        System.out.println(c);

c.將字串轉為字元陣列   String->char[ ]

public char[ ]  tocharArray();

public class test{
    public static void main(String[] args){
        String str = "helloworld";
        char[] data = str.toCharArray();
        for(int i=0; i<data.length; i++){
            System.out.print(data[i]+" ");
        }
    }
} 

取得字串的長度:public int  length();    字串是方法,陣列是屬性。

例:判斷一個字串是否由數字組成

public class test{
    public static void main(String[] args){
        System.out.println(isNumber("123a"));   
    }
    public static boolean isNumber(String str){
        //1.String->data[]
        char[] data = str.toCharArray();
        //2.判斷是否為數字
        for(int i=0; i<data.length; i++){
            if(data[i]<'0' || data[i]>'9'){
                return false;
            }
        }
        return true;
    }
}

7.位元組(byte)與字串的轉換

a.將位元組陣列轉為字串(重要) byte[ ] -> String

public String (byte[ ]  value);

public String (byte[ ]  value, int offest, int count)

byte[] data = new byte[]{1,3,5,7,9};
String str = new String(data); 
System.out.println(str);  

b.將字串轉為字元陣列(陣列) String->byte[ ]

public byte[ ]  getBytes();

        String str = new String("hello");
        byte[] data = str.getBytes(); 
        for(byte b:data){
            System.out.print(b+" ");
        }  

c.將字串按照指定編碼轉為位元組陣列

public byte[ ] getBytes(String charsetName);

        String str = new String("我想睡覺");
        byte[] data = str.getBytes("GBK"); 
        for(byte b:data){
            System.out.print(b+" ");
        }

8.字串比較

a.不區分大小寫相等比較

public boolean equalsIgnoreCase(String anotherString);

    	System.out.println("hello".equalsIgnoreCase("Hello"));

b.比較兩個字串大小

public int compareTo(String anotherString);

返回大於0,表示大於比較物件;

返回等於0,表示等於比較物件;

返回小於0,表示小於比較物件;

        System.out.println("hello".compareTo("Hello"));

9.字串查詢

a.判斷str在本字串中是否存在

public boolean contains (String str);

        String str = "hello";
        System.out.println(str.contains("he"));

b.判斷是否以指定字串開頭

public boolean startsWith(String str);

        String str = "hello";
        System.out.println(str.contains("el"));

從指定位置開始判斷是否以指定字串開頭     public boolean startsWith(String str,int index);

        String str = "hello";
        System.out.println(str.startsWith("el",1));

c.判斷是否以指定的字串結尾

public boolean endsWith(String str);

        String str = "hello";
        System.out.println(str.endsWith("lo"));

10.字串替換

public String replaceAll(String regex,String replacement):替換所有內容

        String str = "hello";
        System.out.println(str.replaceAll("l","_"));

public String replaceFirst(String regex,String replacement):替換首個內容

        String str = "hello";
        System.out.println(str.replaceFirst("l","_"));

11.字串拆分

public String【】 split(String regex):將字串按照指定格式全部拆分

        String str = "I am a student";
        String[] result = str.split(" ");
        for(String str1:result){
            System.out.println(str1);
        }

public String【】 split(String regex,int limit):將字串部分拆分,陣列長度為limit

注意:如果給定長度小於字串的長度,先按照給定長度進行分配,最後剩餘全為最後一個字串

            如果出現特殊字元,一定要用轉義字元將其轉為普通字元。

        String str = "I am a student";
        String[] result = str.split(" ",2);
        for(String str1:result){
            System.out.println(str1);
        }

        String str = "192.168.11.2";
        String[] result = str.split("\\.");
        for(String str1 : result){
            System.out.println(str1);
        }

12.字串擷取

public String substring(int beginIndex)【; 從指定位置擷取到字串結尾

        String str = "hello";
        System.out.println(str.substring(2));

public String substring (int beginIndex, int endIndex)【);擷取部分內容

        String str = "hello";
        System.out.println(str.substring(0,2));

13.String類的其他方法

a.去掉左右空格,中間的保留

public String trim();

        String str = " hello ";
        System.out.println(str.trim());

b.轉大小寫

public String toLowerCase(); 轉小寫

public String toUpperCase(); 轉大寫

        String str = "helloWORD";
        System.out.println(str.toLowerCase());
        System.out.println(str.toUpperCase());

c.判斷字串是否為空(只能判斷是否為空字串,而不是null)

public boolean isEmpty();

        String str = "";
        System.out.println(str.isEmpty());

完整的判斷字串為空:  if(str == null || str.isEmpty())

例:將一個字串首字母大寫

public class test{
    public static void main(String[] args) throws Exception{
        System.out.println(firstCase("helloworld"));
    }
    public static String firstCase(String str){
        return str.substring(0,1).toUpperCase()+str.substring(1);
    }
}

 

14.兩隻sb(面試)-方便進行字串的修改-java.long

StringBuffer與StringBuilder使用沒有區別

String和兩隻sb的區別:

I.String的內容不可修改,而兩隻sb可以改內容(append)

II.StringBuffer採用同步處理,執行緒安全,效率較低

   StringBuilder採用非同步處理,執行緒不安全,效率較高,String的“+”操作底層會將String->Stringbuilder

a.字串修改

public StringBuffer append(各種資料型別)

        StringBuffer sb = new StringBuffer();
        sb.append("hello").append("world");
        System.out.println(sb);

 

b.StringBuffer與String的相互轉化

I.String->StringBuffer       呼叫StringBuffer的構造方法或append()

        StringBuffer sb = new StringBuffer("hello");

II.StringBuffer->String     StringBuffer.toString();

        StringBuffer sb = new StringBuffer("hello");
        String result = sb.toString();
        System.out.println(result.isEmpty());

c.字串反轉

public StringBuffer reverse();

        StringBuffer sb = new StringBuffer("hello");
        sb.reverse();
        System.out.println(sb);

d.刪除指定範圍的資料

public StringBuffer delete(int start,int end);

        StringBuffer sb = new StringBuffer("hello world");
        System.out.println(sb.delete(0, 6));

 

e.插入資料

public StringBuffer insert(int offset,各種資料型別)

        StringBuffer sb = new StringBuffer("hello");
        System.out.println(sb.insert(5, "真好"));