主頁 > 後端開發 > Java中的字串

Java中的字串

2023-05-18 09:12:24 後端開發

目錄
  • 一、簡介
  • 二、字串定義
    • 2.1 直接定義字串
    • 2.2 通過使用 String 類的構造方法來創建字串
  • 三、如何使用Java API幫助檔案
    • 3.1 幫助檔案下載地址
    • 3.2 幫助檔案使用
    • 3.2 中文幫助檔案
  • 四、 String字串和int、double、float 的相互轉換
    • 4.1 String 轉int
    • 4.2 String 轉Double、Float
    • 4.3 int轉換為String
    • 4.3 Double、Float轉換為String
  • 五、字串拼接
    • 5.1 使用連接運算子“+”
    • 5.2 使用 concat() 方法
  • 六 、獲取字串長度
  • 七、字串大小寫轉換
  • 八 、去除字串中的空格
  • 九 、截取字串
  • 十、分割字串
  • 十一、字串替換
  • 十二、字串比較
    • 12.1 equals()
    • 12.2 equals() 與 == 比較字符
    • 12.3 equalsIgnoreCase()
    • 12.4 compareTo() 與 compareToIgnoreCase()
  • 十三、 字串查找
    • 13.1 charAt()
    • 13.2 indexOf()
    • 13.3 lastlndexOf()
    • 13.4 contains()
  • 十四、字串按指定字符集轉byte序列
    • 14.1 getBytes()
    • 14.2 getBytes(String charsetName)
  • 十五、字符復制
    • 15.1 getChars()
    • 15.2 copyValueOf()
  • 十六、空字串與null
    • 16.1 空字串與null的區別
    • 16.2 非空判斷
    • 16.3 StringUtils的isBlank與isEmpty
  • 十七、String、StringBuilder、StringBuffer
    • 17.1 比較
    • 17.2 繼承結構
    • 17.3 使用場景選擇
    • 17.4 StringBuffer 常用函式

一、簡介

Java字串就是Unicode字符序列,Java里沒有內置的字串型別,而是在標準的類別庫中提供了一個預定義類,String,每個用雙引號""括起來的都是String類的一個實體

字串是日常開發中最常用, Java字串的一個重要特點就是字串不可變

二、字串定義

2.1 直接定義字串

String str = "www.xiezhrspace.cn";
//或者
String str;
str = "www.xiezhrspace.cn";

2.2 通過使用 String 類的構造方法來創建字串

//① String() 初始化新創建的 String物件,使其表示空字符序列
String str = new String();
//② String(String original) 初始化新創建的String物件,使其表示與引數相同的字符序列;換句話說,新創建的字串是引數字串的副本,
String str = new String("www.xiezhrspace.cn")
//③ String(char[] value) 分配一個新的字串,將引數中的字符陣列元素全部變為字串,該字符陣列的內容已被復制,后續對字符陣列的修改不會影響新創建的字串
char a[] = {'H','e','l','l','0'};
String sChar = new String(a);
//④ String(char[] value, int offset, int count) 分配一個新的 String,它包含來自該字符陣列引數一個子陣列的字符,offset 引數是子陣列第一個字符的索引,count 引數指定子陣列的長度,該子陣列的內容已被賦值,后續對字符陣列的修改不會影響新創建的字串
char a[]={'H','e','l','l','o'};
String sChar=new String(a,1,4);
...

String 提供的構造方法很多,文章只列舉常用的,其余的可自行查找Java幫助檔案,幫助檔案的使用參照下一小節

三、如何使用Java API幫助檔案

3.1 幫助檔案下載地址

https://www.oracle.com/java/technologies/downloads/
在這里插入圖片描述
在這里插入圖片描述
下載完解壓后目錄如下
在這里插入圖片描述

3.2 幫助檔案使用

① 雙擊index.html打開
在這里插入圖片描述
② 搜索框中輸入關鍵字String 找到java.lang包下的String
在這里插入圖片描述
③ 查看String 類的幫助資訊
String 類的基本資訊
在這里插入圖片描述
String 類public/protected 修飾的屬性
在這里插入圖片描述
String 類public/protected 修飾所有構造器
在這里插入圖片描述
String 類public/protected 修飾所有構造器
在這里插入圖片描述

3.2 中文幫助檔案

如果小伙伴看英文比較吃力,這里也提供了中文幫助檔案下載地址(檔案包含jdk1.6~jdk10 的幫助檔案),
注: 中文幫助檔案采用的是工具翻譯的,有些地方可能不準確,請結合著官方英文檔案查看

鏈接:https://pan.baidu.com/s/1Rh-o1i-LCjEPNB4EyO9FrQ
提取碼:7kms

在這里插入圖片描述

在這里插入圖片描述

四、 String字串和int、double、float 的相互轉換

4.1 String 轉int

String 轉換 int 時,String 的值一定是整數,否則會報數字轉換例外(java.lang.NumberFormatException)

  • Integer.parseInt(String s)
  • Integer.valueOf(String s)
public class StringTest {

    public static void main(String[] args) {
        System.out.println(Integer.parseInt("123"));
        System.out.println(Integer.valueOf("345"));
    }
}
//輸出結果為
123
345

4.2 String 轉Double、Float

String 轉換 Double、Float 時,String 的值一定是浮點型別,否則會報數字轉換例外(java.lang.NumberFormatException)

  • Double.parseDouble(String s)
  • Double.valueOf(String s)
  • Float.parseFloat(String s)
  • Float.valueOf(String s)
public class StringTest {

    public static void main(String[] args) {
        System.out.println(Double.parseDouble("12.45"));
        System.out.println(Double.valueOf("12.45"));
        System.out.println(Float.parseFloat("25.68"));
        System.out.println(Float.valueOf("25.68"));
    }
}
//輸出結果為
12.45
12.45
25.68
25.68

4.3 int轉換為String

使用第三種方法相對第一第二種耗時比較大,在使用第一種 valueOf() 方法時,注意 valueOf 括號中的值不能為空,否則會報空指標例外(NullPointerException)

  • String.valueOf( Integer i)
  • Integer.toString( Integer i)
  • "" + Integer i
public class StringTest {

    public static void main(String[] args) {
        System.out.println(String.valueOf(123));
        System.out.println(Integer.toString(345));
        System.out.println(456 + "");
    }
}
//輸出結果為
123
345
456

4.3 Double、Float轉換為String

使用第三種方法相對第一第二種耗時比較大,在使用第一種 valueOf() 方法時,注意 valueOf 括號中的值不能為空,否則會報空指標例外(NullPointerException)

  • String.valueOf(Double d)
  • Double.toString(Double d)
  • "" + Double d
  • String.valueOf(Float d)
  • Float.toString(Float d)
  • "" + Float f
public class StringTest {

    public static void main(String[] args) {
        public class StringTest {

    public static void main(String[] args) {
        System.out.println(String.valueOf(20.48d));
        System.out.println(Double.toString(20.48d));
        System.out.println(20.48d + "");

        System.out.println(String.valueOf(10.24f));
        System.out.println(Float.toString(10.24f));
        System.out.println(10.24f + "");
    }
}

    }
}
//輸出結果為
20.48
20.48
20.48
10.24
10.24
10.24

五、字串拼接

5.1 使用連接運算子“+”

str1+str2

public class StringTest {

    public static void main(String[] args) {

        System.out.println("微信公眾號:" + "XiezhrSpace");
        
    }
}
//輸出
微信公眾號:XiezhrSpace

5.2 使用 concat() 方法

str1.concat(str2)

public class StringTest {

    public static void main(String[] args) {

        System.out.println("個人博客:".concat("www.xiezhrspace.cn"));

    }
}
// 輸出
個人博客:www.xiezhrspace.cn

六 、獲取字串長度

str.length()

public class StringTest {

    public static void main(String[] args) {
        String str1 = "公眾號:XiezhrSpace";
        String str2 = "個人博客:www.xiezhrspace.cn";

        System.out.println("str1長度:"+str1.length());
        System.out.println("str2長度:"+str2.length());
    }
}
//輸出
str1長度:15
str2長度:23

七、字串大小寫轉換

  • str.toLowerCase() 將字串中的字母全部轉換為小寫,非字母不受影響
  • str.toUpperCase() 將字串中的字母全部轉換為大寫,非字母不受影響
public class StringTest {

    public static void main(String[] args) {
       String str ="Hello World!";
        System.out.println("原始字串:"+str);
        System.out.println("使用toLowerCase() 方法之后為:" + str.toLowerCase());
        System.out.println("使用toUpperCase() 方法之后為:" + str.toUpperCase());
    }
}
//輸出
原始字串:Hello World!
使用toLowerCase() 方法之后為:hello world!
使用toUpperCase() 方法之后為:HELLO WORLD!

八 、去除字串中的空格

字串中存在的首尾空格一般情況下都沒有任何意義,如字串“ Hello ”,但是這些空格會影響到字串的操作,如連接字串或比較字串等,所以應該去掉字串中的首尾空格,這需要使用 String 類提供的 trim() 方法

  • str.trim()
  • str.replace((char) 12288, ' '); str.trim()

注意

  • trim() 只能去掉字串中前后的半角空格(英文空格),而無法去掉全角空格(中文空格),
    這時候我們只能先將全角空格替換為半角空格再進行操作,其中替換是 String 類的 replace() 方法
  • 12288 是中文全角空格的 unicode 編碼
//字串中的每個空格占一個位置,直接影響了計算字串的長度
public class StringTest {

    public static void main(String[] args) {
        String str = " hello ";
        System.out.println(str.length());    // 輸出 7
        System.out.println(str.trim().length());    // 輸出 5
    }
}
//輸出
7
5
//去除全角空格實體
public class StringTest {

    public static void main(String[] args)  {
       String str = " hello";
       //帶有全角的空格沒有去掉
        System.out.println(str.trim().length());
        //去除全角空格
        System.out.println(str.replace((char) 12288, ' ').trim().length());
    }
}
//輸出
6
5

九 、截取字串

  • substring(int beginIndex) //指定位置截取到字串結尾
  • substring(int beginIndex,int endIndex) 是截取指定范圍的內容

substring() 方法是按字符截取,而不是按位元組截取

substring(int beginIndex)

//呼叫時,括號中是需要提取字串的開始位置,方法的回傳值是提取的字串
public class StringTest {

    public static void main(String[] args) {
        String str = "關注XiezhrSpace公眾號";
        System.out.println(str.substring(2));
    }
}

//輸出
XiezhrSpace公眾號

substring(int beginIndex,int endIndex)

//方法中的 beginIndex 表示截取的起始索引,截取的字串中包括起始索引對應的字符;
//endIndex 表示結束索引,截取的字串中不包括結束索引對應的字符
public class StringTest {

    public static void main(String[] args) {
        String str = "關注XiezhrSpace公眾號";
        System.out.println(str.substring(2,13));
    }
}
//輸出
XiezhrSpace

注意:, 對于開始位置 beginIndex, Java 是基于字串的首字符索引為 0 處理的,但是對于結束位置 endIndex,Java 是基于字串的首字符索引為 1 來處理的 ,具體如下圖所示

在這里插入圖片描述

十、分割字串

  • str.split(String sign)

  • str.split(String sign,int limit)

  • str 為需要分割的目標字串,

  • sign 為指定的分割符,可以是任意字串,

  • limit 表示分割后生成的字串的限制個數,如果不指定,則表示不限制,直到將整個目標字串完全分割為止,

public class StringTest {

    public static void main(String[] args) {
        String str = "蘋果,香蕉,獼猴桃,梨";
        String arr1[] = str.split(",");
        String arr2[] = str.split(",",3);

        System.out.println("①分割所有水果");
        for (int i = 0; i < arr1.length; i++) {
            System.out.println(arr1[i]);
        }

        System.out.println("②分割取前兩個水果,其余不分割");
        for (int i = 0; i < arr2.length; i++) {
            System.out.println(arr2[i]);
        }

    }
}
//輸出
①分割所有水果
蘋果
香蕉
獼猴桃
梨
②分割取前兩個水果,其余不分割
蘋果
香蕉
獼猴桃,梨

對于 .|$&*.^ 等轉義字符,程式中使用時,需要加上\\, 實體如下

public class StringTest {

    public static void main(String[] args) {
        String str1 = "蘋果|香蕉|獼猴桃|梨";
        String str2 = "黃色$橙色$紅色$白色";
        String arr1[] = str1.split("\\|");
        String arr2[] = str2.split("\\$");

        System.out.println("分割以|分割的水果:");
        for (int i = 0; i < arr1.length; i++) {
            System.out.println(arr1[i]);
        }
        System.out.println("分割以$為分隔符的顏色:");
        for (int i = 0; i < arr2.length; i++) {
            System.out.println(arr2[i]);
        }

    }
}
//輸出結果
分割以|分割的水果:
蘋果
香蕉
獼猴桃
梨
分割以$為分隔符的顏色:
黃色
橙色
紅色
白色
//多層分隔符決議
public class StringTest {

    public static void main(String[] args) {
        String str = "xiezhr相關資訊^個人公賬號|XiezhrSpace$個人博客|www.xiezhrspace.cn";
        String arr1[] = str.split("\\^");
        String arr2[] = arr1[1].split("\\$");
        String arr3[] ={};

        System.out.println(arr1[0]);
        for (int i = 0; i < arr2.length; i++) {
          arr3= arr2[i].split("\\|");
            for (int i1 = 0; i1 < arr3.length; i1++) {
                System.out.println(arr3[i1]);
            }
        }
        
    }
}
//輸出
xiezhr相關資訊
個人公賬號
XiezhrSpace
個人博客
www.xiezhrspace.cn

十一、字串替換

str.replace(char oldChar, char newChar)

將目標字串中的指定字符(串)替換成新的字符(串)

  • oldChar 表示被替換的字串
  • newChar 表示用于替換的字串

str.replaceFirst(String regex, String replacement)

將目標字串中匹配某正則運算式的第一個子字串替換成新的字串

  • regex 表示正則運算式
  • replacement 表示用于替換的字串

str.replaceAll(String regex, String replacement)

將目標字串中匹配某正則運算式的所有子字串替換成新的字串

  • regex 表示正則運算式
  • replacement 表示用于替換的字串
public class StringTest {

    public static void main(String[] args) {
        String str1 ="個人公眾號:XiezhrSpace";
        String str2 ="xiezhr love programming";

        System.out.println("原始字串:" + str1);
        System.out.println("替換后:"+str1.replace(":", "|"));
        System.out.println("原始字串:" + str2);
        System.out.println("替換后:"+str2.replace("programming", "anime"));

    }
}
//輸出
原始字串:個人公眾號:XiezhrSpace
替換后:個人公眾號|XiezhrSpace
原始字串:xiezhr love programming
替換后:xiezhr love anime
public class StringTest {

    public static void main(String[] args) {
      String str ="中國移動:https://www.10086.cn/ 10086:https://www.10086.cn/";

      System.out.println("匹配成功:");
      System.out.println(str.replaceFirst("10086", "xiezhrspace"));

      System.out.println("未匹配成功:");
      System.out.println(str.replaceFirst("mobile", "xiezhrspace"));
    }
}

//輸出
匹配成功:
中國移動:https://www.xiezhrspace.cn/ 10086:https://www.10086.cn/
未匹配成功:
中國移動:https://www.10086.cn/ 10086:https://www.10086.cn/
public class StringTest {

    public static void main(String[] args) {
      String str ="中國移動:https://www.10086.cn/ 10086:https://www.10086.cn/";

      System.out.println("匹配成功:");
      System.out.println(str.replaceAll("10086", "xiezhrspace"));

      System.out.println("未匹配成功:");
      System.out.println(str.replaceAll("mobile", "xiezhrspace"));
    }
}
//輸出
匹配成功:
中國移動:https://www.xiezhrspace.cn/ xiezhrspace:https://www.xiezhrspace.cn/
未匹配成功:
中國移動:https://www.10086.cn/ 10086:https://www.10086.cn/

十二、字串比較

str1.equals(str2)
str1.equalsIgnoreCase(str2)
str1.compareTo(str2);

12.1 equals()

逐個地比較兩個字串的每個字符是否相同,如果兩個字串具有相同的字符和長度,它回傳 true,否則回傳 false,字符大小寫不同,回傳false

public class StringTest {

    public static void main(String[] args) {
        String str1 ="xiezhr";
        String str2 = new String("xiezhr");
        String str3 = "XIEZHR";

        System.out.println("str1與str2比較結果:" + str1.equals(str2));
        System.out.println("str1與str3比較結果:" + str1.equals(str3));

    }
}
//輸出結果
str1與str2比較結果:true
str1與str3比較結果:false

12.2 equals() 與 == 比較字符

== 比較參考地址是否相同,equals() 比較字串的內容是否相同

public class StringTest {

    public static void main(String[] args) {
        String str1 ="xiezhr";
        String str2 = new String("xiezhr");

        System.out.println("使用equals方法比較的結果:");
        System.out.println(str1.equals(str2));
        System.out.println("使用==比較的結果:");
        System.out.println(str1 == str2);

    }
}
//輸出
使用equals方法比較的結果:
true
使用==比較的結果:
false

12.3 equalsIgnoreCase()

字串與指定的物件比較,不考慮大小寫

public class StringTest {

    public static void main(String[] args) {
        String str1 ="xiezhr";
        String str2 ="XIEZHR";
        String str3 = new String("xiezhr");

        System.out.println("str1與str2通過equalsIgnoreCase比較結果:" + str1.equalsIgnoreCase(str2));
        System.out.println("str1與str3通過equalsIgnoreCase比較結果:" + str1.equalsIgnoreCase(str3));
    }
}
//輸出
str1與str2通過equalsIgnoreCase比較結果:true
str1與str3通過equalsIgnoreCase比較結果:true

12.4 compareTo() 與 compareToIgnoreCase()

基于字串各個字符的 Unicode 值,按字典順序(ASCII碼順序)比較兩個字串的大小
如果第一個字符和引數的第一個字符不等,結束比較,回傳他們之間的長度差值(ASCII碼差值)
如果第一個字符和引數的第一個字符相等,則以第二個字符和引數的第二個字符做比較,以此類推,直至不等為止,回傳該字符的ASCII碼差值
如果兩個字串不一樣長,可對應字符又完全一樣,則回傳兩個字串的長度差值
compareToIgnoreCase方法可以忽略大小寫

  • 如果引數字串等于此字串,則回傳值 0;
  • 如果此字串小于字串引數,則回傳一個小于 0 的值;
  • 如果此字串大于字串引數,則回傳一個大于 0 的值,
public class StringTest {

    public static void main(String[] args) {
        String str1 ="xiezhr";
        String str2 ="XIEZHR";
        String str3 = new String("xiezhr");
        String str4 = "xiezhr";
        String str5 ="xiezhrspace";

        System.out.println(str1.compareTo(str2));
        System.out.println(str1.compareTo(str3));
        System.out.println(str1.compareTo(str4));
        System.out.println(str1.compareTo(str5));
        System.out.println(str1.compareToIgnoreCase(str2));

    }
}
//輸出
32
0
0
-5
0

十三、 字串查找

13.1 charAt()

字串本質上是由一個個字符組成的字符陣列,因此它也有索引,索引跟陣列一樣從零開始,charAt() 方法可以在字串內根據指定的索引查找字符

public class StringTest {

    public static void main(String[] args) {
       String str ="www.xiezhrspace.cn";

        System.out.println(str.charAt(0));
        System.out.println(str.charAt(4));
        System.out.println(str.charAt(5));
        System.out.println(str.charAt(12));

    }
}
//輸出
w
x
i
a

13.2 indexOf()

①public int indexOf(int ch): 回傳指定字符在字串中第一次出現處的索引,如果此字串中沒有這樣的字符,則回傳 -1
②public int indexOf(int ch, int fromIndex): 回傳從 fromIndex 位置開始查找指定字符在字串中第一次出現處的索引,如果此字串中沒有這樣的字符,則回傳 -1
③int indexOf(String str): 回傳指定字符在字串中第一次出現處的索引,如果此字串中沒有這樣的字符,則回傳 -1
④int indexOf(String str, int fromIndex): 回傳從 fromIndex 位置開始查找指定字符在字串中第一次出現處的索引,如果此字串中沒有這樣的字符,則回傳 -1

  • ch -- 字符,Unicode 編碼,
  • fromIndex -- 開始搜索的索引位置,第一個字符是 0 ,第二個是 1 ,以此類推,
  • str -- 要搜索的子字串
public class StringTest {

    public static void main(String[] args) {
       String str ="XiezhrSpace";

        System.out.println(str.indexOf("e"));
        System.out.println(str.indexOf("pa"));
        System.out.println(str.indexOf("e", 4));
    }
}
//輸出
2
7
10

在這里插入圖片描述

13.3 lastlndexOf()

用于回傳字符(串)在指定字串中最后一次出現的索引位置,如果能找到則回傳索引值,否則回傳 -1

lastlndexOf 方法的四種形式

  • public int lastIndexOf(int ch): 回傳指定字符在目標字串中最后一次出現處的索引,如果指定字串中沒有指定的字符,回傳 -1

  • public int lastIndexOf(int ch, int fromIndex): 回傳指定字符在目標字串中最后一次出現處的索引,從指定的索引處開始進行反向搜索,如果目標字串中沒有指定字符,回傳 -1,

  • public int lastIndexOf(String str): 回傳指定子字串在目標字串中最后一次出現處的索引,如果目標字串中沒有指定字符,回傳 -1

  • public int lastIndexOf(String str, int fromIndex): 回傳指定子字串在目標符串中最后一次出現處的索引,從指定的索引開始反向搜索,如果目標字串中沒有指定的字符,回傳 -1

public class StringTest {

    public static void main(String[] args)  {
        String str = new String("個人博客:www.xiezhrspace.cn");
        String str1 = "xiezhr";
        String str2 = "cn";

        System.out.print("查找指定字符 w 在目標字符str中最后出現的位置 :" );
        System.out.println(str.lastIndexOf( 'w' ));
        System.out.print("從第2個位置查找指定字符 w在目標字串str最后出現的位置 :" );
        System.out.println(str.lastIndexOf( 'w', 14 ));
        System.out.print("指定子字串 str1 在目標字串str最后出現的位置:" );
        System.out.println( str.lastIndexOf( str1 ));
        System.out.print("從第7個位置開始查找指定字串 str1在目標字串中最后出現的位置 :" );
        System.out.println( str.lastIndexOf( str1, 7 ));
        System.out.print("指定字串 str2 在目標字串str最后出現的位置 :" );
        System.out.println(str.lastIndexOf( str2 ));

    }
}
//輸出
查找指定字符 w 在目標字符str中最后出現的位置 :7
從第2個位置查找指定字符 w在目標字串str最后出現的位置 :7
指定子字串 str1 在目標字串str最后出現的位置:9
從第7個位置開始查找指定字串 str1在目標字串中最后出現的位置 :-1
指定字串 str2 在目標字串str最后出現的位置 :21

13.4 contains()

查找字串中是否包含目標字符(串)

public class StringTest {

    public static void main(String[] args) {
        String str = "xiezhrspace";
        System.out.println(str.contains("xiezhr"));
        System.out.println(str.contains("cn"));
    }
}
//輸出
true
false

十四、字串按指定字符集轉byte序列

14.1 getBytes()

按指定的字符集將字串編碼為 byte 序列,并將結果存盤到一個新的 byte 陣列中

14.2 getBytes(String charsetName)

默認字符集將字串編碼為 byte 序列,并將結果存盤到一個新的 byte 陣列中


import java.io.UnsupportedEncodingException;

public class StringTest {

    public static void main(String[] args)  {
        String str = "網名xiezhr";
        byte[] bytes1 = null;
        byte[] bytes2 = null;
        byte[] gbks = null;
        byte[] bytes = str.getBytes();
        try {
            bytes1 = str.getBytes("utf-8");
            bytes2 = str.getBytes("ISO-8859-1");
             gbks = str.getBytes("GBK");
        }catch (UnsupportedEncodingException e){
            System.out.println("不支持的字符集"+e.getMessage());
        }

        System.out.println("按默認字符集將字串轉byte陣列:");
        for (byte aByte : bytes) {
            System.out.print(aByte+" ");
        }
        System.out.println();
        System.out.println("按utf-8編碼將字串轉bytes陣列:");
        for (byte b1 : bytes1) {
            System.out.print(b1+" ");
        }
        System.out.println();
        System.out.println("按ISO-8859-1編碼將字串轉bytes陣列:");
        for (byte b2 : bytes2) {
            System.out.print(b2+" ");
        }
        System.out.println();
        System.out.println("按GBK編碼將字串轉bytes陣列:");
        for (byte gbk : gbks) {
            System.out.print(gbk+" ");
        }
    }
}
//輸出
按默認字符集將字串轉byte陣列:
-25 -67 -111 -27 -112 -115 120 105 101 122 104 114 
按utf-8編碼將字串轉bytes陣列:
-25 -67 -111 -27 -112 -115 120 105 101 122 104 114 
按ISO-8859-1編碼將字串轉bytes陣列:
63 63 120 105 101 122 104 114 
按GBK編碼將字串轉bytes陣列:
-51 -8 -61 -5 120 105 101 122 104 114 

十五、字符復制

15.1 getChars()

將字符從字串復制到目標字符陣列

public void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)

  • srcBegin -- 字串中要復制的第一個字符的索引,
  • srcEnd -- 字串中要復制的最后一個字符之后的索引,
  • dst -- 目標陣列,
  • dstBegin -- 目標陣列中的起始偏移量
public class StringTest {

    public static void main(String[] args)  {
        String Str1 = new String("www.xiezhrspace.cn");
        char[] Str2 = new char[15];

        try {
            Str1.getChars(4, 15, Str2, 3);
            System.out.print("復制的字串為:" );
            System.out.println(Str2 );
        } catch( Exception e) {
            System.out.println(e.getMessage());
        }
    }
}
//輸出,新字串Str2 是從第三位復制的
復制的字串為:   xiezhrspace

15.2 copyValueOf()

將字符陣列中指定字符復制到目標字符

public static String copyValueOf(char[] data)

  • data -- 字符陣列

public static String copyValueOf(char[] data, int offset, int count)

  • data -- 字符陣列
  • offset -- 子陣列的初始偏移量
  • count -- 子陣列的長度

public class StringTest {

    public static void main(String[] args)  {
        char[] str1 ={'w','w','w',':','x','i','e','z','h','r','s','p','a','c', 'e','.','c','n' };
        String str2 = null;
        String str3 = null;

        System.out.println(str2.copyValueOf(str1));
        System.out.println(str3.copyValueOf(str1, 4, 11));
        
    }
}
//輸出
www:xiezhrspace.cn
xiezhrspace

十六、空字串與null

一個比較容易混淆的知識點,空串是長度為0的字串,null表示沒有參考任何物件

16.1 空字串與null的區別

  • String str = null ;
    表示宣告一個字串物件的參考,但指向為null,也就是說還沒有指向任何的記憶體空間;
  • String str = "";
    表示宣告一個字串型別的參考,其值為""空字串,這個str參考指向的是空字串的記憶體空間;
  • String str = new String();
    創建一個字串物件的默認值為""
/**
字串物件與null的值不相等,且記憶體地址也不相等;
空字串物件與null的值不相等,且記憶體地址也不相等;
new String()創建一個字串物件的默認值為""
**/
public class StringTest {

    public static void main(String[] args) {
        String str1 = new String();
        String str2 = null;
        String str3 = "";

        System.out.println(str1==str2);                
        System.out.println(str1.equals(str2));         
        System.out.println(str2==str3);                
        System.out.println(str3.equals(str2));         
        System.out.println(str1==str3);                
        System.out.println(str1.equals(str3));         
    }
}
//輸出
false  //記憶體地址的比較,回傳false
false  //值的比較,回傳false
false  //記憶體地址的比較,回傳false
false  //值的比較,回傳false
false  //記憶體地址的比較,回傳false
true   //值的比較,回傳true

16.2 非空判斷

執行下面代碼,會拋出java.lang.NullPointerException ,這也是我們日常開發中經常見到的報錯,
所以,字串非空判斷顯得尤為重要

public class StringTest {

    public static void main(String[] args) {
       String str = null;
       str.length();
    }
}
// 報空指標例外
Exception in thread "main" java.lang.NullPointerException
	at StringTest.main(StringTest.java:5)

非空判斷一般包含空字串和null判斷,常見的判斷方法主要有以下幾種
① 最多人使用的一個方法, 直觀, 方便, 但效率很低
注: s==null 判斷需要寫在前面,要不然還是會報NullPointerException

 if(!(s == null || s.equals(""))){
 	 System.out.println("業務邏輯代碼");
 };
 //或者
 if(str !=null &&!"".equals(str)){
   	System.out.println("業務邏輯代碼");
 }

②比較字串長度, 效率比第一種方法高

  if(!(str==null||str.length()==0)){
      System.out.println("業務邏輯代碼");
  }
  if(str!=null&&str.length()!=0){
      System.out.println("業務邏輯代碼");
  }
}

③ Java SE 6.0 才開始提供的方法, 效率和方法②差不多, 但出于兼容性考慮, 推薦使用方法二

 if(!(str==null||str.isEmpty())){
     System.out.println("業務邏輯代碼");
 }
 if(str!=null&& !str.isEmpty()){
     System.out.println("業務邏輯代碼");
 }

16.3 StringUtils的isBlank與isEmpty

與java.lang這個包作用類似,Commons Lang 包是由apache 提供的jar包,這一組API也是提供一些基礎的、通用的操作和處理

官方下載地址:https://commons.apache.org/proper/commons-lang/download_lang.cgi
maven 包參考

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.9</version>
</dependency>

commons-lang3 提供了很多常用的基礎操作處理,包括字串、日期、陣列等等,
由于本文主要是說字串String,所以我們只對其中的StringUtils的isBlank與isEmpty 方法說明,

判斷字串為空,一般會遇到 null 、"" 、字串中間有空格 " ", 下面是兩個方法處理結果

public static boolean isBlank(String str)

import org.apache.commons.lang3.StringUtils;

public class StringTest {

    public static void main(String[] args) {

        System.out.println(StringUtils.isBlank(null));
        System.out.println(StringUtils.isBlank(""));
        System.out.println(StringUtils.isBlank("  "));
        System.out.println(StringUtils.isBlank("        "));
        System.out.println(StringUtils.isBlank("\t \n \f \r"));
        System.out.println(StringUtils.isBlank("\\"));
        System.out.println(StringUtils.isBlank("公眾號XiezhrSpace"));
        System.out.println(StringUtils.isBlank("  公眾號XiezhrSpace  "));
    }
}
//輸出
true    
true
true
true
true
false
false
false

public static boolean isEmpty(String str)

import org.apache.commons.lang3.StringUtils;

public class StringTest {

    public static void main(String[] args) {

        System.out.println(StringUtils.isEmpty(null));
        System.out.println(StringUtils.isEmpty(""));
        System.out.println(StringUtils.isEmpty("  "));  //StringUtils 中空格作非空處理
        System.out.println(StringUtils.isEmpty("        "));
        System.out.println(StringUtils.isEmpty("\t \n \f \r"));
        System.out.println(StringUtils.isEmpty("\\"));
        System.out.println(StringUtils.isEmpty("公眾號XiezhrSpace"));
        System.out.println(StringUtils.isEmpty("  公眾號XiezhrSpace  "));
        
    }
}
//輸出
true
true
false
false
false
false
false
false

當然了,StringUtils工具類還有對應的isNotBlank和isNotEmpty 方法,意思是不為空,

十七、String、StringBuilder、StringBuffer

具體區別可以參考https://blog.csdn.net/itchuxuezhe_yang/article/details/89966303 這篇博文,寫的還是挺好的,

17.1 比較

  • String 類是不可變類,即一旦一個 String 物件被創建以后,包含在這個物件中的字符序列是不可改變的;
  • StringBufferStringBuilder支持可變字串;
  • StringBuilderStringBuffer 功能基本相似,方法也差不多;
  • StringBuffer 是執行緒安全的,而 StringBuilder 則沒有實作執行緒安全功能;
  • StringBuilder 由于沒有實作執行緒安全,所以效率要比StringBuffer高;

17.2 繼承結構

在這里插入圖片描述

17.3 使用場景選擇

  • 操作少量的資料使用 String,
  • 單執行緒操作大量資料使用 StringBuilder(大多數情況推薦使用),
  • 多執行緒操作大量資料使用 StringBuffer,
public class StringTest {

    public static void main(String[] args) {
        StringBuilder sbd = new StringBuilder();
        StringBuffer sbf = new StringBuffer();
        String str1 ="xiezhr個人資訊:";
        String str2 ="博客:www.xiezhrspace.cn";
        String str3 ="公眾號:XiezhrSpace";


        String str =str1+str2+str3;

        sbd.append(str1);
        sbd.append(str2);
        sbd.append(str3);

        sbf.append(str1);
        sbf.append(str2);
        sbf.append(str3);

        System.out.println("String拼接字串:");
        System.out.println(str);
        System.out.println("StringBuilder拼接字串:");
        System.out.println(sbd.toString());
        System.out.println("StringBuffer拼接字串:");
        System.out.println(sbf.toString());

    }
}

//輸出
String拼接字串:
xiezhr個人資訊:博客:www.xiezhrspace.cn公眾號:XiezhrSpace
StringBuilder拼接字串:
xiezhr個人資訊:博客:www.xiezhrspace.cn公眾號:XiezhrSpace
StringBuffer拼接字串:
xiezhr個人資訊:博客:www.xiezhrspace.cn公眾號:XiezhrSpace

17.4 StringBuffer 常用函式

append(String s) //追加一個字串
reverse() //將字串反轉
delete(int start, int end) //洗掉指定位置字串
insert(int offset, String str) //在指定位置插入字串
replace(int start, int end, String str) //將指定位置字串替換為新字串

public class StringTest {

    public static void main(String[] args) {
        StringBuffer sb = new StringBuffer();
        sb.append("XiezhrSpace!!!");
        System.out.println(sb);
        sb.append("m");
        System.out.println(sb);
        sb.insert(0,"公眾號:");
        System.out.println(sb);
        sb.delete(16,19);
        System.out.println(sb);
        sb.replace(15,16,"**");
        System.out.println(sb);
        sb.reverse();
        System.out.println(sb);
    }
}
//輸出
XiezhrSpace!!!
XiezhrSpace!!!m
公眾號:XiezhrSpace!!!m
公眾號:XiezhrSpace!
公眾號:XiezhrSpace**
**ecapSrhzeiX:號眾公

在這里插入圖片描述

本期到此結束,我們下期再見~(●'?'●)

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/552767.html

標籤:Java

上一篇:都說 C++ 沒有 GC,RAII: 那么我算個啥?(贈書福利)

下一篇:返回列表

標籤雲
其他(159252) Python(38148) JavaScript(25433) Java(18056) C(15228) 區塊鏈(8267) C#(7972) AI(7469) 爪哇(7425) MySQL(7197) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5871) 数组(5741) R(5409) Linux(5340) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4573) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2433) ASP.NET(2403) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1975) 功能(1967) Web開發(1951) HtmlCss(1938) python-3.x(1918) C++(1917) 弹簧靴(1913) xml(1889) PostgreSQL(1878) .NETCore(1861) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Java中的字串

    (java中的字串) 一、簡介 Java字串就是Unicode字符序列。Java里沒有內置的字串型別,而是在標準的類別庫中提供了一個預定義類,String。每個用雙引號""括起來的都是String類的一個實體。 字串是日常開發中最常用, Java字串的一個重要特點就是字串不可變 二、字串 ......

    uj5u.com 2023-05-18 09:12:24 more
  • 都說 C++ 沒有 GC,RAII: 那么我算個啥?(贈書福利)

    學過 Java、C# 或者其他托管語言(managed languages)的同學,回過頭來看 C++ 的時候,第一反應就是 C++ 沒有自動垃圾回收器(GC),而不能充分利用的資源被稱為垃圾。 ......

    uj5u.com 2023-05-18 07:44:39 more
  • Spring Cloud開發實踐(五): Consul - 服務注冊的另一個選擇

    Consul 是微服務網路解決方案之一, 用于管理跨網路和多云環境服務之間的安全網路連接, 提供服務發現, 服務網格, 流量管理和自動更新. 可以單獨部署, 也可以分布式部署. Consul 內建安全通信選項, 使用 Go 語言撰寫, 啟動資源消耗小, 腳本化配置, 對容器部署方式更友好 ......

    uj5u.com 2023-05-18 07:44:32 more
  • 解決xorm逆向工程問題

    解決xorm逆向工程問題 問題 xorm : 無法將“xorm”項識別為 cmdlet、函式、腳本檔案或可運行程式的名稱。請檢查名稱的拼寫,如果包括路徑,請確保路徑正確,然后再試一次。 今天在用xorm做逆向工程的時候碰到了一個普遍問題,xorm : 無法將“xorm”項識別為 cmdlet、函式、 ......

    uj5u.com 2023-05-18 07:44:27 more
  • 我的第二次博客作業

    AZ-1的第二次博客作業 AZ-1 - 博客園 (cnblogs.com) 前言 題量 題目集4題量較小。 題目集5題量較小。 期中考試題量中等。 難度 題目集4雖然只有一道題,但是題目很長,難度很大,讓人在看到的時就心生畏懼。選單4在選單3的基礎上增加了大量的錯誤輸入,大大增加了程式的代碼量,很考 ......

    uj5u.com 2023-05-18 07:43:49 more
  • SpringBoot+MyBatis+MySQL電腦商城專案實戰(四)用戶注冊—控制層

    5 注冊-控制層 5.1 創建回應 狀態碼、狀態碼描述資訊、資料。這部分功能封裝到一個類中,將這類作為方法回傳值,回傳給前端瀏覽器。 package com.cy.store.util; import java.io.Serializable; /** * Json格式的資料進行回應 */ publ ......

    uj5u.com 2023-05-18 07:43:19 more
  • ThreadLocal 的原理講述 + 基于ThreadLocal實作MVC中的M層的事務

    ThreadLocal 的原理講述 + 基于ThreadLocal實作MVC中的M層的事務控制 每博一文案 生活不是努力了就可以變好的,喜歡做的事情也不是輕易就可以做的。以前總聽別人說, 堅持就好了,努力就好了,都會好的,可是真的做起來壓根就不是這樣。這種時候要怎么辦? 這種時候還能輕易地相信時間嗎 ......

    uj5u.com 2023-05-18 07:42:13 more
  • 認識Java

    Java的產生和發展 產生與發展歷程 1991年,由Sun公司開發Oak,最初為家用消費電子產品進行編程,是Java前身。 1994年,使用Oak語言撰寫了Web瀏覽器 1995年,改名為Java,96年發布JDK1.1 … 1998年,發布JDK1.2,從語言發展為平臺 … 2004年,發布JDK ......

    uj5u.com 2023-05-18 07:41:35 more
  • 位段/位域 的使用

    在一些特定的應用場景中,需要對一個整數型別的變數中的每個位進行單獨的控制或訪問。例如,硬體暫存器常常包含一些特定的位用于表示設備的狀態、配置選項或標志位。使用位段區可以使程式員更方便地訪問和控制這些位,而無需進行位運算或掩碼操作。(類似于位尋址?) 位段區使用特定的語法來定義和操作位段。在C語言中, ......

    uj5u.com 2023-05-18 07:41:30 more
  • Java中列印物件輸出的字串到底是什么

    列印輸出的Java物件是一知半解的字串,那么這個字串是怎么來的?代表什么?我們如何列印出物件中的資料呢? ......

    uj5u.com 2023-05-18 07:41:27 more