1. 程式人生 > >JavaSE之三個特殊類(一、String類)

JavaSE之三個特殊類(一、String類)

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

 (1)、直接賦值:

public class Test1{
    public static void main(String[] args) {
        String str = "hello"; // str是一個物件,“hello”應該儲存在堆中
        System.out.println(str);
    }
}

在JVM底層實際上會自動維護一個物件池(字串物件池),如果現在採用了直接賦值的模式進行String類的物件 例項化操作,那麼該例項化物件(字串內容)將自動儲存到這個物件池之中。如果下次繼續使用直接賦值的模式 宣告String類物件,此時物件池之中如若有指定內容,將直接進行引用;如若沒有,則開闢新的字串物件而後將 其儲存在物件池之中以供下次使用。

(2)傳統方法:

public class Test1{
    public static void main(String[] args) {
        String str = new String("hello"); // 用new進行物件例項化
        System.out.println(str);
    }
}

      通過分析可知,如果使用String構造方法就會開闢兩塊堆記憶體空間,並且其中一塊堆記憶體將成為垃圾空間。除了這 一缺點之外,也會對字串共享產生問題。

1.1 字串的相等比較(equals())

      (1)可以使用“==”來判斷

// 基本資料型別比較
int x = 10 ;
int y = 10 ;
System.out.println(x==y); //true

// 在string物件上比較
String str1 = "Hello" ;
String str = new String("Hello") ;
System.out.println(str1==str); // false

       (2)用String類提供的equals方法。

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

釋String類"=="與"equals"的區別:

1. ”==”:進行的數值比較,比較的是兩個字串物件的記憶體地址數值。

2. “equals()”:可以進行字串內容的比較

釋String類中兩種物件例項化的區別:

1. 直接賦值:只會開闢一塊堆記憶體空間,並且該字串物件可以自動儲存在物件池中以供下次使用。

2. 構造方法:會開闢兩塊堆記憶體空間,其中一塊成為垃圾空間,不會自動儲存在物件池中,可以使用intern() 方法手工入池。

1.2 string類中字元與字串的操作方法

字串就是一個字元陣列,所以在String類裡面支援有字元陣列轉換為字串以及字串變為字元的操作方法。

語法:

在此之前先說明求字串和陣列的長度方法:例如:有一個字串str ,陣列str

a:字串的長度用方法來描述(str.length())

b:陣列的長度用屬性來描述(str.length)

(1)將字元陣列中的所有內容變為字串()

public class Test1{
    public static void main(String[] args) {
        char[] chars = new char[] {'w','o','r','l','d'}; // 陣列的靜態初始化
        System.out.println(chars.length); // 列印陣列長度
        System.out.println(new String(chars).length()); // 陣列轉化為字串 並列印長度

        // 過載  從下標為 0  開始  列印 長度為  3   的字元
        System.out.println((new String(chars,0,3)));
    }
}

(2)將字元陣列轉化為字串

public class Test1{
    public static void main(String[] args) {
        String str = "hello";
        // 求字串的長度 用方法來描述
        System.out.println(str.length());
        // 求陣列的長度  用屬性來描述
        System.out.println(str.toCharArray().length); // 把字串轉變為字元陣列
        // 取得字元  e
        System.out.println(str.charAt(1));
    }
}

還可以通過一道題來熟悉這兩個方法。

例題:判斷一個指定的字串是否是有數字組成的

 public class Test1{
     public static void main(String[] args) {
        String str = "12a3456";
        System.out.println(isNumber(str) ? "字串由數字構成!" : "字串中有非數字成員!");  
     }
     public static boolean isNumber(String str){
         // 把字串轉為字元陣列
         char[] data = str.toCharArray();
         for(int i = 0; i < data.length; i++){
             if(data[i]<'0' || data[i]>'9'){ // 不是數字
                 return false;
             } 
         }
        return true;
        } 
 }

1.3 String中位元組與字串的操作方法

位元組常用於資料傳輸以及編碼轉換的處理之中,在String中提供有對位元組的支援。

位元組陣列轉化為字元陣列、字元陣列轉化為位元組陣列可以通過一個例項來說明

例1:將一個字串按指定格式(GBK格式)先編碼,再解碼,最後輸出這個字串

public class Test1{
    public static void main(String[] args) throws Exception {
        String str = "你好世界";
        // 將字元轉化為指定的位元組陣列  String--->byte[]
        byte[] data = str.getBytes("GBK"); //  按照GBk格式,編碼
        // 將位元組陣列轉化為指定的字元    byte[]--->String
        String result = new String(data,"GBK"); // 按照GBK格式,解碼
        System.out.println(result);
        // 因為編解碼的格式不一樣,所以最終輸出的結果解釋亂碼
    }
}

主要過程:第一步:先讓字串轉化為位元組陣列

                  第二步:對位元組進行編碼(GBK格式)

                  第三步:再把位元組陣列轉化為字串並輸出。

例2:將小寫的字串轉化為大寫的字串並輸出。

public class Test1{
    public static void main(String[] args) {
        String str = "abcdef";
        byte[] data = str.getBytes();  // 將字串轉化為位元組陣列
       
        for(int i = 0; i < data.length; i++){  // 小寫字母和大寫字母相差32
                   data[i] -= 32;
            }
        String result = new String(data); // 位元組陣列轉化為字串
        System.out.println(result);
    }
}

1.4  String中的字串比較方法

上面使用過String類提供的equals()方法,該方法本身是可以進行區分大小寫的相等判斷。除了這個方法之外,String 類還提供有如下的比較操作:

a:不區分大小寫方法

String str1 = "hello" ;
String str2 = "Hello" ;
System.out.println(str1.equalsIgnoreCase(str2)); // true

b:區分大小寫方法

String str1 = "hello" ;
String str2 = "Hello" ;
System.out.println(str1.equals(str2)); // false

在String類中compareTo()方法是一個非常重要的方法,該方法返回一個整型,該資料會根據大小關係返回三類內 容:

                                   1. 相等:返回0.

                                   2. 小於:返回內容小於0.

                                   3. 大於:返回內容大於0。

1.5  String中字串查詢

語法如上的表格中,下面請看程式碼:

public class Test1{
    public static void main(String[] args) {
       String str = "hello world";
       String str1 = "@@!!hello world$$";

       System.out.println(str.contains("world")); // 判斷是否存在world(true
       System.out.println(str.contains("this"));  // 判斷是否存在this (false
       System.out.println(str.indexOf("l")); // 從頭開始查詢第一個 l 的位置 (2
       System.out.println(str.indexOf("l",5)); // 從下標為5 的位置開始查詢遇到的第一個 l (9 
       System.out.println(str.lastIndexOf("l")); // 從後往前開始查詢遇到第一個 l  (9
       

       System.out.println(str1.startsWith("@@")); // 判斷是不是以字元@@開頭(true
       System.out.println(str1.startsWith("!!",2)); // 從下標為2的位置開始判斷是不是以字元!!開頭(true
       System.out.println(str1.endsWith("$$")); // 判斷是不是以$$結尾(true

       
    }
}

1.6  String中字元替換方法

使用一個指定的新的字串替換掉已有的字串資料,可用的方法如下:

程式碼:

public class Test1{
    public static void main(String[] args) {
       String str = "hello world";

       System.out.println(str.replaceFirst("l", "A")); // 把第一個 l 換成 A 
       System.out.println(str.replaceAll("l", "A")); // 把所有的 l 替換為 A
      
    }
}

 

1.7  String字串拆分方法

可以將一個完整的字串按照指定的分隔符劃分為若干個子字串。 可用方法如下:

注意:一般的拆分,直接使用語法正常操作就好,如果發現有些內容無法拆分開就需要使用"\"轉義,轉義之後再拆分。

public class Test1{
    public static void main(String[] args) {
       String str = "hello world hello sky";
       String[] data = str.split(" "); // 按照空格拆分
       for(String str1 : data){
           System.out.println(str1);
       }
       String[] data1 = str.split(" ",2); // 按照空格拆分,拆分的長度為2
       for(String str2 : data1){
           System.out.println(str2);
       }
      
    }
}

輸出結果:

例題:有一個字串str = xingming:zhangsan|nianling:18  ,把姓名和年齡拆分開。(模式:姓名:年齡|姓名:年齡|..)

程式碼:

public class Test1{
    public static void main(String[] args) {
       String str = "xingming:zhangsan|nianling:18";
       // 要拆分出姓名 和 年齡
       // 1、按照 | 拆分 (但是要轉義)
       String[] temp = str.split("\\|");
       // 按照|拆分完  得到兩個字元陣列   再按照:拆分
       for(int i = 0; i < temp.length; i++){
           String[] result = temp[i].split(":"); // 按照 : 拆分
           System.out.println(result[1]); // 取得拆分後的第二個 字串  就是想要的
       }
    }
}

執行結果:

 

1.8   String  中字串的擷取

從一個完整的字串之中截取出部分內容。可用方法如下:

public class Test1{
    public static void main(String[] args) {
       String str = "hello world";
       System.out.println(str.substring(1)); // 從 下標1 開始 擷取到最後
       System.out.println(str.substring(1,8)); // 從下標1擷取到下標8
    }
}

 

字串擷取的應用:可以用來實現字串的首字母大寫

實現程式碼:

public class Test1{
    public static void main(String[] args) {
       String str = "hello world";
      
       // 先擷取首字母 把首字母大寫後  加上 首字母之後的
       System.out.println(str.substring(0,1).toUpperCase()+str.substring(1));
    }
}

 

 

1.9   字串的其他操作方法

 

其他的語法和上面的大同小異,就不一一介紹了。主要說一下trim()方法和isEmpty()方法。

trim()方法: 主要是去除字串開頭和結尾的空格,字串中間的不影響。

isEmpty()方法:字串的判空操作。具體的以例項來看

程式碼實現:

public class Test1{
    public static void main(String[] args) {
        // 先判空  不為空去除左右的空格
       String str = "   hello  world   ";
       System.out.println("["+str+"]");
       if(!(str == null || str.isEmpty())){
           System.out.println("["+str.trim()+"]");
       }    
    }
}

 

執行結果:

從執行結果看,字串左右兩端的空格去除了,但是中間的還在,因此使用時候注意別人要求什麼。