Java使用類-String

来源:https://www.cnblogs.com/xiaoqigui/archive/2022/06/16/16383071.html
-Advertisement-
Play Games

大佬的理解->《深入理解Java中的String》 1、String 1.1 String 實例化 String str1 = "xxx"; String string1 = "hello KH96"; System.out.println(string1); //hello KH96 String ...


大佬的理解->《深入理解Java中的String》

1、String

1.1 String 實例化

String str1 = "xxx";

String string1 = "hello KH96";
System.out.println(string1); //hello KH96

String str1 = new String("xxx");

String string2 = "hello KH96";
System.out.println(string2); //hello KH96

String底層實現 private final char value[];

​ String底層是由私有final的數組實現的,對外沒有提供修改的方法,字元串多次賦值,不是修改字元串的內容,而是改變字元串的引用地址

源碼

1.2 String常用方法

方法 說明
length() 字元串的長度
equals() 比較的是字元串的內容
equalsIgnoreCase(String str) 忽略大小比較
toUpperCase() 轉大寫
toLowerCase() 轉小寫
concat(String str) 返回拼接後的字元串

length()

字元串的長度:length()方法,返回的是字元串的長度,即字元串的長度(不是位元組數),區別去數組的length

String string1 = "hello KH96";
System.out.println(string1+"的長度:"+string1.length()); //hello KH96的長度:10

equals()

重寫了Object類的equals方法,比較的是字元串的內容,不是對象

String string2 = "KH96";
String string3 = "KH97";
System.out.println(string2.equals(string3)); //false

equalsIgnoreCase(String str)

忽略大小比較

String string7 = "kh96";
String string8 = "KH96";
System.out.println("不忽略大小寫比較:"+string7.equals(string8)); //false
System.out.println("忽略大小寫比:"+string7.equalsIgnoreCase(string8)); //true

toUpperCase() 轉大寫 toLowerCase() 轉小寫

String string9 = "abCD";
System.out.println(string9.toUpperCase()); //ABCD
System.out.println(string9.toLowerCase());//abcd

concat(String str) 返回拼接後的字元串

"+"號也可以進行字元串拼接

concat(String str)

拼接字元串都創建了新的對象,在迴圈中儘量不要拼接字元串,會造成棧溢出;

String strig10 = "abc";
System.out.println(strig10.concat("bcd").concat("def"));//abcbcddef

1.3 String 字元查找/提取相關方法

方法 說明
indexOf(String str) 返回str首次出現的下標
lastIndexOf(String str) 返回str最後一次出現的下標
substring(int index1) 截取下標index1,及以後的所有字元
substring(int index1,int index2) 截取下標index1到index2之間的字元串,包括index1,不包括index2
trim() 去除字元串的首尾空格
startsWith(String str) 是否以str開頭
endsWith(String str) 是否以str結尾
contains(String str) 是否包含str
split(String str) 根據指定分割字元,將字元串拆分成字元串數組返回
toCharArray() 將字元串轉為字元數組
replace(String str1,String str2) 用 str2 替換 str1
getBytes() 字元串轉換為位元組數組
getBytes("UTF-8") 字元串轉換為位元組數組,可指定編碼
new String(byte[] bytes) 將位元組數組轉換為字元串

indexOf(String str)

返回str首次出現的下標,沒有查到就返回-1

String string11 = "I am a good student in kh96";
System.out.println("good首次出現的位置:"+string11.indexOf("good")); //7

還可以通過ascii碼值查詢

String string11 = "I am a good student in kh96";
char char1 = 97;
System.out.println(char1); //a
System.out.println("參數支持int assic碼值:"+string11.indexOf(97)); //2

lastIndexOf(String str)

返回str最後一次出現的下標,沒有就返回-1

String string11 = "I am a good student in kh96";
System.out.println(string11);
System.out.println("t最後一次出現的下標:"+string11.lastIndexOf("t")); //18

substring(int index1)

截取下標index1,及以後的所有字元

index的範圍[0,string.length()]

String string12 = "abcdefghijklmn";
System.out.println(string12.substring(5)); //fghijklmn

substring(int index1,int index2)

截取下標index1到index2之間的字元串,包括index1,不包括index2

index的範圍[0,string.length()]

String string12 = "abcdefghijklmn";
System.out.println(string12.substring(5,8)); //fgh

小應用

String string14 = "KH90,KH91,KH92,KH93,KH94,KH95,";
System.out.println(string14.substring(0,string14.lastIndexOf(",")));//KH90,KH91,KH92,KH93,KH94,KH95

trim()

去除字元串的首尾空格

String string13 = "  KH  96  ";
System.out.println("原始長度"+string13.length()); //10
System.out.println("取出空格後長度"+string13.trim().length()); //6 "KH  96"

startsWith(String str) endsWith(String str)

startsWith(String str) 是否以str開頭

endsWith(String str) 是否以str結尾

String string15 = "KH96.mp3";
System.out.println("是否是KH開頭?"+ string15.startsWith("KH")); //true
System.out.println("是否是.mp3結尾?"+ string15.endsWith(".mp3")); //true

contains(String str)

判斷字元串是否包含str

String string16 = "aaa bbb cc ddd";
System.out.println("是否包含bbb:"+ string16.contains("bbb")); //true
System.out.println("是否包含eee:"+ string16.contains("eee")); //false

split(String str)

根據指定分割字元,將字元串拆分成字元串數組返回

String string17_1 = "13501020304;15801020304;18901020304";
String[] phoneNumbers1 = string17_1.split(";"); //一種字元分割
System.out.println("手機號數組內容:"+ Arrays.toString(phoneNumbers2));

String string17_2 = "13501020304;15801020304!18901020304";
String[] phoneNumbers2 = string17_2.split(";|!"); //多種字元分割 用 | 隔開
System.out.println("手機號數組內容:"+ Arrays.toString(phoneNumbers2));
//[13501020304, 15801020304, 18901020304]

toCharArray()

將字元串轉為字元數組

char[] chars1 = string18.toCharArray();
System.out.println(Arrays.toString(chars1)); //[K, H, 9, 8, 正, 在, 學, 習, 實, 用, 類]

replace(String str1,String str2)

用 str2 替換 str1

//獲取一個16位的隨機字元串
 String string19 = UUID.randomUUID().toString();
System.out.println(string19); //65c0844a-c437-4a65-89ca-84d4166325ff

//轉換字元串,將-轉換為*
System.out.println(string19.replace("-","*"));//65c0844a*c437*4a65*89ca*84d4166325ff
//去除字元串,將所有的-去除
System.out.println(string19.replace("-",""));//65c0844ac4374a6589ca84d4166325ff
//去16位隨機數
System.out.println(string19.replace("-","").substring(0,16));//65c0844ac4374a65

getBytes() getBytes("UTF-8")

字元串轉換為位元組數組

String string20 = "abcd";
//getBytes() 沒有指定編碼
byte[] bytes = string20.getBytes(); 
try {
    //getBytes("UTF-8") 指定編碼
    byte[] bytes2 = string20.getBytes("UTF-8");
    System.out.println(Arrays.toString(bytes2)); //[97, 98, 99, 100]
} catch (UnsupportedEncodingException e) {
    e.printStackTrace();
}
System.out.println(Arrays.toString(bytes)); //Arrays.toString(bytes)

new String(byte[] bytes)

將位元組數組轉換為字元串

 byte[] bytes3 ={100,101,102}; //ascii碼值
System.out.println(new String(bytes3)); //def
//配合上面getBytes進行轉碼
try {
    System.out.println(new String(bytes3,"utf-8")); //可以指定編碼 def
} catch (UnsupportedEncodingException e) {
    e.printStackTrace();
}

char[] chars3 = {'K','H','9','6'};
System.out.println(new String(chars3));//KH96

2、StringBuffer

可變字元串類:StringBuffer
不同於String類:可以實現動態拼接字元串,而不會創建新的對象;
即:是一個可變字元串的對象,改變的是字元串對象中的內容;
不可以直接賦值,必須通過new創建對象;

2.1 StringBuffer實例化

new StringBuffer()

預設初始容量 16

StringBuffer sbf1 = new StringBuffer();
System.out.println("預設初始容量:"+sbf1.capacity());//16

底層實現

//StringBuffer()
public StringBuffer() {
        super(16); //初始容量16
    }

//AbstractStringBuilder(int capacity)
AbstractStringBuilder(int capacity) {
    value = new char[capacity];
}

new StringBuffer(int capacity)

指定初始容量

StringBuffer sbf2 = new StringBuffer(32);
System.out.println("只定始容量:"+sbf2.capacity()); //32

底層實現

public StringBuffer(int capacity) {
	super(capacity); //指定初始容量
}

StringBuffer(String str)

指定初始字元串,容量為字元串長度+16

StringBuffer sbf3 = new StringBuffer("Kh96");
System.out.println("指定初始字元串初始容量:"+sbf3.capacity()); //20

底層實現

public StringBuffer(String str) {
    super(str.length() + 16); //容量為字元串長度+16
    append(str);
}

2.2 StringBuffer常用方法

append(String str)

拼接字元串

StringBuffer sbf4 = new StringBuffer("userId=");
sbf4.append("U0001")
            .append(",userName=")
            .append("張三,age=")
            .append("18"); //userId=U0001,userName=張三,age=18

擴容機制

底層擴容,當拼接一個新的字元串,字元串數組長度不夠,會進行動態擴容,
每次擴容都是前一個數組長度的2倍+2
最大擴容長度不能超過Integer的最大值 - 8;

void expandCapacity(int minimumCapacity) {
    int newCapacity = value.length * 2 + 2; //每次擴容都是前一個數組長度的2倍+2
    if (newCapacity - minimumCapacity < 0)
        newCapacity = minimumCapacity;
    if (newCapacity < 0) {
        if (minimumCapacity < 0) // overflow
            throw new OutOfMemoryError();
        newCapacity = Integer.MAX_VALUE;
    }
    value = Arrays.copyOf(value, newCapacity);
}

toString()

獲取動態字元串內容

StringBuffer sbf4 = new StringBuffer("userId=");
sbf4.append("U0001")
            .append(",userName=")
            .append("張三,age=")
            .append("18");
String userInfo = sbf4.toString();
 System.out.println(userInfo); //userId=U0001,userName=張三,age=18

3、StringBuilder

用法和StringBuffer沒有區別,唯一的區別就是StringBuffer是線程安全的,StringBuilder是非線程安全的


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1、前言 單例模式屬於創建型模式,保證一個類僅有一個實例,並提供一個訪問它的全局訪問點。 單例模式確保某一個類只有一個實例,而且自行實例化並向整個系統提供這個實例,這個類稱為單例類,它提供全局訪問的方法。 2、介紹 2.1、主要解決 防止一個系統全局使用的類頻繁地創建與銷毀、解決多線程併發訪問的問題 ...
  • 1 前言 函數調用很好理解,即使剛學沒多久的朋友也知道函數調用是怎麼實現的,即調用一個已經封裝好的函數,實現某個特定的功能。 把一個或者多個功能通過函數的方式封裝起來,對外只提供一個簡單的函數介面,然後在其他地方調用即可 2 函數調用方式 函數調用難道還能怎麼調用?不就封裝好直接調用嗎??? 函數調 ...
  • 目錄 一.簡介 二.效果演示 三.源碼下載 四.猜你喜歡 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 基礎 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 轉場 零基礎 O ...
  • 一、Pycharm軟體簡介 產品簡介 PyCharm是一種Python IDE(Integrated Development Environment,集成開發環境),帶有一整套可以幫助用戶在使用Python語言開發時提高其效率的工具,比如調試、語法高亮、項目管理、代碼跳轉、智能提示、自動完成、單元測 ...
  • 一. 打包參數 1. * 的作用:在函數定義中,收集所有的位置參數到一個新的元組,並將這個元組賦值給變數args >>> def f(*args): print(args) >>> f() () >>> f(1) (1,) >>> f(1, 2, 3, 4) (1, 2, 3, 4) >>> 2. ...
  • 1、Date 1.1 Date實例化 Date date1 = new Date(); System.out.println(date1); //Thu Jun 16 19:18:56 CST 2022 1.2 獲取日期毫秒數 getTime() System.out.println(date1.g ...
  • 大家好!我們是阿裡云云效智能代碼天團!旨在用人工智慧解放各位開發者的生產力!或許你們關註過我們的話會知道,我們有一個超酷的產品它叫Alibaba Cloud AI Coding Assistant,小名兒叫Cosy。說起這代碼補全和代碼搜索那可是樣樣精通٩(˃̶͈̀௰˂̶͈́)و 我們不僅把文檔搬進 ...
  • 今天來點特別的~ 不僅把好看的視頻全部pa下來,咱們還要實現自動評論、點贊、關註三連~ 寶,你也可以順手給我個三連嗎?給你個摸摸大~ 抓包分析流程 我寫成了文檔,都在這個PDF裡面了,但是好像不能上傳,所以點一下大家自行下載吧! 點我獲取,提取密碼 qwer 開始代碼 獲取視頻的代碼 import ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...