首頁 > 軟體

Java-String類最全彙總(下篇)

2023-01-16 14:02:20

字元, 位元組與字串

字元與字串

字串內部包含一個字元陣列,String 可以和 char[] 相互轉換.

字元陣列變為字串:

    public static void main(String[] args) {
        char[] val = {'a','b','c','d','e'};
        String str = new String(val);
        System.out.println(str);
    }

指定字元陣列變為字串:

   public static void main(String[] args) {
        char[] val = {'a','b','c','d','e'};
        String str = new String(val,1,3);//第一個引數是開始變得字元下標  第二個引數是要變的字元個數
        System.out.println(str);
    }

獲取指定位置的字元:

    public static void main(String[] args) {
        String str = "hello" ;
        System.out.println(str.charAt(0)); // 下標從 0 開始
    }

public static void main(String[] args) {
    String str = "hello" ;
    System.out.println(str.charAt(10));
}

將字串變為字元陣列:

public static void main(String[] args) {
    String str = "helloworld" ;
    char[] chars =str.toCharArray();//把str指向的字串物件變為字元陣列
    System.out.println(Arrays.toString(chars));
}

程式碼範例: 給定字串一個字串, 判斷其是否全部由數位所組成.

思路: 將字串變為字元陣列而後判斷每一位字元是否是" 0 “~”‘9’"之間的內容,如果是則為數位.

public static boolean isNumber(String str) {
    char[] array = str.toCharArray();
    for (int i = 0; i < array.length; i++) {
        if (array[i] < '0' || array[i] > '9') {
            return false;
        }
    }
    return true;
}
public static void main(String[] args) {
    String str = "12a34567";
    System.out.println(isNumber(str));
}

位元組與字串

位元組常用於資料傳輸以及編碼轉換的處理之中,String 也能方便的和 byte[] 相互轉換.

將位元組陣列變為字串:

public static void main(String[] args) {
    byte[] bytes = {97,98,99,100};
    String str = new String(bytes);
    System.out.println(str);
}

將部分位元組陣列中的內容變為字串:

public static void main(String[] args) {
    byte[] bytes = {97,98,99,100,101,102};
    String str = new String(bytes,1,4);//第一個引數是開始變得字元下標  第二個引數是要變的字元個數
    System.out.println(str);
}

將字串以位元組陣列的形式返回:

public static void main(String[] args) {
    String str = "abcd";
    byte[] bytes = str.getBytes();
    System.out.println(Arrays.toString(bytes));
}

編碼轉換處理:

public static void main(String[] args) throws UnsupportedEncodingException {
    String str = "abcd";
    byte[] bytes = str.getBytes("GBK");
    System.out.println(Arrays.toString(bytes));
}

小結

那麼何時使用 byte[], 何時使用 char[] 呢?

  • byte[] 是把 String 按照一個位元組一個位元組的方式處理, 這種適合在網路傳輸, 資料儲存這樣的場景下使用. 更適合針對二進位制資料來操作.
  • char[] 是吧 String 按照一個字元一個字元的方式處理, 更適合針對文字資料來操作, 尤其是包含中文的時候.

回憶概念: 文字資料 vs 二進位制資料

一個簡單粗暴的區分方式就是用記事本開啟能不能看懂裡面的內容.

如果看的懂, 就是文字資料(例如 .java 檔案), 如果看不懂, 就是二進位制資料(例如 .class 檔案).

字串常見操作

字串比較

上面使用過String類提供的equals()方法,該方法本身是可以進行區分大小寫的相等判斷

。除了這個方法之外,String類還提供有如下的比較操作:

程式碼範例: 不區分大小寫比較

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

注意:equalsIgnoreCase是忽略大小寫的意思。

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

  1. 相等:返回 0.
  2. 小於:返回內容小於 0.
  3. 大於:返回內容大於 0。

範例:觀察compareTo()比較

System.out.println("A".compareTo("a")); // -32 
System.out.println("a".compareTo("A")); // 32 
System.out.println("A".compareTo("A")); // 0 
System.out.println("AB".compareTo("AC")); // -1 
System.out.println("劉".compareTo("楊"));

compareTo()是一個可以區分大小關係的方法,是String方法裡是一個非常重要的方法。這裡的返回值就是前面字元對應的數值減去後面的字元所對應的數值。

字串的比較大小規則, 總結成三個字 “字典序” 相當於判定兩個字串在一本詞典的前面還是後面. 先比較第一個字元的大小(根據 unicode 的值來判定), 如果不分勝負, 就依次比較後面的內容

字串查詢

從一個完整的字串之中可以判斷指定內容是否存在,對於查詢方法有如下定義:

程式碼範例: 字串查詢,最好用最方便的就是contains() ——(類似於C語言的strstr)

String str = "helloworld" ; 
System.out.println(str.contains("world")); // true 

該判斷形式是從JDK1.5之後開始追加的,在JDK1.5以前要想實現與之類似的功能,就必須藉助、indexOf()方法完成。

程式碼範例: 使用indexOf()方法進行位置查詢(找到之後返回我們查詢元素的第一個位置)

String str = "helloworld" ;
System.out.println(str.indexOf("world")); // 5,w開始的索引
System.out.println(str.indexOf("bit")); // -1,沒有查到
if (str.indexOf("hello") != -1) {
    System.out.println("可以查到指定字串!");
}

現在基本都是用contains()方法完成。

使用indexOf()需要注意的是,如果內容重複,它只能返回查詢的第一個位置

程式碼範例: 使用indexOf()的注意點

String str = "helloworld" ;
System.out.println(str.indexOf("l")); // 2 
System.out.println(str.indexOf("l",5)); // 8 
System.out.println(str.lastIndexOf("l")); // 8

在進行查詢的時候往往會判斷開頭或結尾。

程式碼範例: 判斷開頭或結尾

String str = "**@@helloworld!!" ;
System.out.println(str.startsWith("**")); // true 
System.out.println(str.startsWith("@@",2)); // ture 
System.out.println(str.endsWith("!!")); // true

字串替換

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

程式碼範例: 字串的替換處理

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

注意事項: 由於字串是不可變物件 , 替換不修改當前字串, 而是產生一個新的字串.

字串拆分

可以將一個完整的字串按照指定的分隔符劃分為若干個子字串。

可用方法如下:

程式碼範例: 實現字串的拆分處理

String str = "hello world hello bit" ;
String[] result = str.split(" ") ; // 按照空格拆分
for(String s: result) {
    System.out.println(s);
}

程式碼範例: 字串的部分拆分

String str = "hello world hello bit" ;
String[] result = str.split(" ",2) ;
for(String s: result) {
    System.out.println(s);
}

拆分是特別常用的操作. 一定要重點掌握. 另外有些特殊字元作為分割符可能無法正確切分, 需要加上跳脫.

程式碼範例: 拆分IP地址

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

​ 注意事項:

  1. 字元"|“,”*“,”+“,”.“都得加上跳脫字元,前面加上”"
  2. .而如果是"“,那麼就得寫成”\".(等於一個,而本身又需要一個來進行跳脫)
  3. 如果一個字串中有多個分隔符,可以用"|"作為連字元.程式碼範例: 多次拆分

程式碼範例: 多次拆分

String str = "name=zhangsan&age=18" ;
String[] result = str.split("&") ;
for (int i = 0; i < result.length; i++) {
    String[] temp = result[i].split("=") ;
    System.out.println(temp[0]+" = "+temp[1]);
}

這種程式碼在以後的開發之中會經常出現

字串擷取

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

程式碼範例: 觀察字串擷取

String str = "helloworld" ;
System.out.println(str.substring(5));//從第5個字元位置的位置開始擷取到結尾
System.out.println(str.substring(0, 5));//從0位置開始擷取到第5位置的元素

注意事項:

  1. 索引從0開始
  2. 注意前閉後開區間(左閉右開)的寫法, substring(0, 5) 表示包含 0 號下標的字元, 不包含 5 號下標,所以下圖不包含’w’字元

其他操作方法

程式碼範例: 觀察trim()方法的使用

String str = " hello world " ;
System.out.println("["+str+"]");
System.out.println("["+str.trim()+"]");

trim 會去掉字串開頭和結尾的空白字元(空格, 換行, 製表符等).

程式碼範例: 大小寫轉換

String str = " hello%$$%@#$%world 哈哈哈 " ;
System.out.println(str.toUpperCase());
System.out.println(str.toLowerCase());

這兩個函數只轉換字母。

程式碼範例: 字串length() —— 取得字串長度

String str = " hello%$$%@#$%world 哈哈哈 " ;
System.out.println(str.length());

注意:陣列長度使用陣列名稱.length屬性,而String中使用的是length()方法

程式碼範例: 觀察isEmpty()方法 —— 判斷是否為空字串(不是null,而是長度為0)

System.out.println("hello".isEmpty());
System.out.println("".isEmpty());
System.out.println(new String().isEmpty());

String類並沒有提供首字母大寫操作,需要自己實現.

程式碼範例: 首字母大寫

public static void main(String[] args) {
    System.out.println(fistUpper("yuisama"));
    System.out.println(fistUpper(""));
    System.out.println(fistUpper("a"));
}
public static String fistUpper(String str) {
    if ("".equals(str)||str==null) {
        return str ;
    }
    if (str.length()>1) {
        return str.substring(0, 1).toUpperCase()+str.substring(1) ;
    }
    return str.toUpperCase() ;
}

StringBuffer 和 StringBuilder

首先來回顧下String類的特點:

任何的字串常數都是String物件,而且String的常數一旦宣告不可改變,如果改變物件內容,改變的是其參照的指向而已。

通常來講String的操作比較簡單,但是由於String的不可更改特性,為了方便字串的修改,提供了其兩大類。

這兩大類大部分功能是相同的,我們主要介紹

StringBuffer

在String中使用"+"來進行字串連線,但是這個操作在

StringBuffer

類中需要更改為append()方法:

public synchronized StringBuffer append(各種資料型別 b)

我們來看這類的繼承結構:

  • 字串反轉:
public synchronized StringBuffer reverse()

程式碼範例: 字串反轉(reverse)

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

刪除指定範圍的資料(delete):

public synchronized StringBuffer delete(int start, int end)

程式碼範例: 觀察刪除操作( delete( , ) )

StringBuffer sb = new StringBuffer("helloworld"); 
System.out.println(sb.delete(5, 10)); 

插入資料(insert)

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

程式碼範例: 觀察插入操作( insert( , ) )

StringBuffer sb = new StringBuffer("helloworld"); 
System.out.println(sb.delete(5, 10).insert(0, "你好")); 

小結

字串操作是我們以後工作中非常常用的操作. 使用起來都非常簡單方便, 一定要使用熟練.

補充

1.什麼是雜湊表:資料結構–>描述和組織資料的一種方式。

12 45 2 7 15 92

問題:如何去查詢到一個關鍵字

1、順序查詢:通過關鍵字的一個一個的比較,才能找到O(n)

2、排序+二分查詢

雜湊表時間效率非常高 效率可以高到O(1)。

2.陣列的賦值 只有1次機會 就是在定義的時候

array不可以直接進行二次賦值,如下圖所示:

我們在new了一個新的array後,我們就可以對array進行二次賦值了

但是我們的陣列array用了final修飾後就不可以改變了

若array被final修飾後,還想修改array的值,那我們便需要通過反射修改array

到此這篇關於Java-String類最全彙總(下篇)的文章就介紹到這了,其他的內容(上篇)請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com