Java從入門到“放棄”(精通)之旅——String類⑩

Java從入門到“放棄”(精通)之旅🚀——String類⑩

前言

在這里插入圖片描述

在Java編程中,String類是最常用也是最重要的類之一。無論是日常開發還是面試,對String類的深入理解都是必不可少的。

1. String類的重要性

在C語言中,字符串只能使用字符數組或字符指針表示,操作字符串需要依賴標準庫函數。這種方式將數據和操作分離,不符合面向對象思想。Java專門提供了String類來解決這個問題。

String類在開發中無處不在,例如:

  • 字符串轉數字
  • 字符串拼接
  • 數據校驗等

面試中也經常被問到String相關的問題,如String、StringBuffer和StringBuilder的區別等。

2. 常用方法

2.1 字符串構造

String類提供了多種構造方式,常用的有三種:

public static void main(String[] args) {// 使用常量串構造String s1 = "hello bit";System.out.println(s1);// 直接new String對象String s2 = new String("hello bit");System.out.println(s2);// 使用字符數組進行構造char[] array = {'h','e','l','l','o',' ','b','i','t'};String s3 = new String(array);System.out.println(s3);
}

注意:String是引用類型,并不是直接保存字符串內容,而是內部通過字符數組存儲字符串內容。

代碼示例:

public static void main(String[] args) {// s1和s2引用的是不同對象 s1和s3引用的是同一對象String s1 = new String("hello");String s2 = new String("world");String s3 = s1;System.out.println(s1.length());   // 獲取字符串長度---輸出5System.out.println(s1.isEmpty());  // 如果字符串長度為0,返回true,否則返回false
}

在這里插入圖片描述

2.2 String對象的比較

Java提供了4種字符串比較方式:

  1. ==比較引用地址
public static void main(String[] args) {String s1 = new String("hello");String s2 = new String("hello");String s3 = new String("world");String s4 = s1;System.out.println(s1 == s2); // falseSystem.out.println(s2 == s3); // falseSystem.out.println(s1 == s4); // true
}
  1. equals()方法:按字典序比較
public static void main(String[] args) {String s1 = new String("hello");String s2 = new String("hello");String s3 = new String("Hello");System.out.println(s1.equals(s2)); // trueSystem.out.println(s1.equals(s3)); // false
}
  1. compareTo()方法:按字典序比較并返回差值
public static void main(String[] args) {String s1 = new String("abc");String s2 = new String("ac");String s3 = new String("abc");String s4 = new String("abcdef");System.out.println(s1.compareTo(s2)); // -1System.out.println(s1.compareTo(s3)); // 0System.out.println(s1.compareTo(s4)); // -3
}
  1. compareToIgnoreCase()方法:忽略大小寫的compareTo
public static void main(String[] args) {String s1 = new String("abc");String s2 = new String("ac");String s3 = new String("ABC");String s4 = new String("abcdef");System.out.println(s1.compareToIgnoreCase(s2)); // -1System.out.println(s1.compareToIgnoreCase(s3)); // 0System.out.println(s1.compareToIgnoreCase(s4)); // -3
}

2.3 字符串查找

常用查找方法:

方法功能
char charAt(int index)返回index位置上字符,如果index為負數或者越界,拋出IndexOutOfBoundsException異常
int indexOf(int ch)返回ch第一次出現的位置,沒有返回-1
int indexOf(int ch, int fromIndex)從fromIndex位置開始找ch第一次出現的位置,沒有返回-1
int indexOf(String str)返回str第一次出現的位置,沒有返回-1
int indexOf(String str, int fromIndex)從fromIndex位置開始找str第一次出現的位置,沒有返回-1
int lastIndexOf(int ch)從后往前找,返回ch第一次出現的位置,沒有返回-1
int lastIndexOf(int ch, int fromIndex)從fromIndex位置開始找,從后往前找ch第一次出現的位置,沒有返回-1
int lastIndexOf(String str)從后往前找,返回str第一次出現的位置,沒有返回-1
int lastIndexOf(String str, int fromIndex)從fromIndex位置開始找,從后往前找str第一次出現的位置,沒有返回-1
public static void main(String[] args) {String s = "aaabbbcccaaabbbccc";System.out.println(s.charAt(3)); // 'b'System.out.println(s.indexOf('c')); // 6System.out.println(s.lastIndexOf('c')); // 17
}

2.4 字符串轉化

  1. 數值和字符串互轉
public static void main(String[] args) {// 數字轉字符串String s1 = String.valueOf(1234);String s2 = String.valueOf(12.34);// 字符串轉數字int data1 = Integer.parseInt("1234");double data2 = Double.parseDouble("12.34");
}
  1. 大小寫轉換
public static void main(String[] args) {String s1 = "hello";String s2 = "HELLO";System.out.println(s1.toUpperCase()); // HELLOSystem.out.println(s2.toLowerCase()); // hello
}
  1. 字符串與數組互轉
public static void main(String[] args) {String s = "hello";// 字符串轉數組char[] ch = s.toCharArray();// 數組轉字符串String s2 = new String(ch);
}

2.5 字符串替換

public static void main(String[] args) {String str = "helloworld";System.out.println(str.replaceAll("l", "_")); // he__owor_dSystem.out.println(str.replaceFirst("l", "_")); // he_loworld
}

注意:字符串是不可變對象,替換操作會創建新對象。

2.6 字符串拆分

public static void main(String[] args) {// 基本拆分String str = "hello world hello bit";String[] result = str.split(" ");// 部分拆分String[] result2 = str.split(" ", 2);// 拆分IP地址String ip = "192.168.1.1";String[] ipParts = ip.split("\\.");
}

2.7 字符串截取

public static void main(String[] args) {String str = "helloworld";System.out.println(str.substring(5)); // worldSystem.out.println(str.substring(0, 5)); // hello
}

2.8 其他操作方法

public static void main(String[] args) {// 去除首尾空格String str = " hello world ";System.out.println(str.trim());// 大小寫轉換String mixed = "Hello%$$%@#$%World";System.out.println(mixed.toUpperCase());System.out.println(mixed.toLowerCase());
}

3. 字符串的不可變性

String類被設計為不可變類,主要原因有:

  1. 方便實現字符串常量池
  2. 線程安全
  3. 便于緩存hash code

注意:String不可變不是因為final修飾,而是因為其設計如此。

public final class String {private final char value[];// ...
}

4. 字符串修改

由于String不可變,頻繁修改會產生大量臨時對象,效率低下:

public static void main(String[] args) {// 不推薦的寫法String s = "";for(int i = 0; i < 10000; ++i){s += i;}// 推薦使用StringBuilderStringBuilder sb = new StringBuilder();for(int i = 0; i < 10000; ++i){sb.append(i);}
}

5. StringBuilder和StringBuffer

5.1 StringBuilder介紹

StringBuilder是可變的字符串類,方法表:

方法說明
StringBuffer append(String str)在尾部追加,相當于String的+=,可以追加:boolean、char、char[]、double、float、int、long、Object、String、StringBuffer的變量
char charAt(int index)獲取index位置的字符
int length()獲取字符串的長度
int capacity()獲取底層保存字符串空間總的大小
void ensureCapacity(int minimumCapacity)擴容
void setCharAt(int index, char ch)將index位置的字符設置為ch
int indexOf(String str)返回str第一次出現的位置
int indexOf(String str, int fromIndex)從fromIndex位置開始查找str第一次出現的位置
int lastIndexOf(String str)返回最后一次出現str的位置
int lastIndexOf(String str, int fromIndex)從fromIndex位置開始找str最后一次出現的位置
StringBuffer insert(int offset, String str)在offset位置插入:八種基類類型 & String類型 & Object類型數據
StringBuffer deleteCharAt(int index)刪除index位置字符
StringBuffer delete(int start, int end)刪除[start, end)區間內的字符
StringBuffer replace(int start, int end, String str)將[start, end)位置的字符替換為str
String substring(int start)從start開始一直到末尾的字符以String的方式返回
String substring(int start, int end)將[start, end)范圍內的字符以String的方式返回
StringBuffer reverse()反轉字符串
String toString()將所有字符按照String的方式返回

常用方法部分代碼示例:

public static void main(String[] args) {StringBuilder sb = new StringBuilder("hello");sb.append(" world"); // 追加sb.insert(5, ","); // 插入sb.delete(5, 6); // 刪除sb.reverse(); // 反轉String result = sb.toString(); // 轉為String
}

5.2 面試題

  1. String、StringBuffer、StringBuilder的區別

    • String不可變,后兩者可變
    • StringBuffer線程安全,StringBuilder非線程安全
    • StringBuilder性能更高
  2. 創建了多少個String對象

String str = new String("ab"); // 2個(常量池1個,堆1個)
String str = new String("a") + new String("b"); // 6個

6. String類OJ題解

6.1 第一個只出現一次的字符

class Solution {public int firstUniqChar(String s) {int[] count = new int[256];for(int i = 0; i < s.length(); ++i){count[s.charAt(i)]++;}for(int i = 0; i < s.length(); ++i){if(1 == count[s.charAt(i)]){return i;}}return -1;}
}

6.2 最后一個單詞的長度

import java.util.Scanner;public class Main {public static void main(String[] args){Scanner sc = new Scanner(System.in);while(sc.hasNext()){String s = sc.nextLine();int len = s.substring(s.lastIndexOf(" ")+1).length();System.out.println(len);}sc.close();}
}

6.3 檢測字符串是否為回文

class Solution {public static boolean isValidChar(char ch){return (ch >= 'a' && ch <= 'z') || (ch >= '0' && ch <= '9');}public boolean isPalindrome(String s) {s = s.toLowerCase();int left = 0, right = s.length()-1;while(left < right){while(left < right && !isValidChar(s.charAt(left))) left++;while(left < right && !isValidChar(s.charAt(right))) right--;if(s.charAt(left) != s.charAt(right)) return false;left++;right--;}return true;}
}

總結

String類是Java中最重要的類之一,理解其不可變特性、掌握常用方法以及了解StringBuilder/StringBuffer的區別,對于編寫高效Java程序至關重要。希望本文能幫助大家全面掌握String類的使用!

在這里插入圖片描述
JavaSE往期專欄

  • Java從入門到“放棄”(精通)之旅——啟航①
  • Java從入門到“放棄”(精通)之旅——數據類型與變量②
  • Java從入門到“放棄”(精通)之旅——運算符③
  • Java從入門到“放棄”(精通)之旅——程序邏輯控制④
  • Java從入門到“放棄”(精通)之旅——方法的使用⑤
  • Java從入門到“放棄”(精通)之旅——數組的定義與使用⑥
  • Java從入門到“放棄”(精通)之旅——類和對象全面解析⑦
  • Java從入門到“放棄”(精通)之旅——繼承與多態⑧
  • Java從入門到“放棄”(精通)之旅——抽象類和接口⑨
    在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/902566.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/902566.shtml
英文地址,請注明出處:http://en.pswp.cn/news/902566.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

抓取淘寶數據RPA--影刀

最近用了一下RPA軟件&#xff0c;挑了影刀&#xff0c;發現很無腦也很簡單&#xff0c;其語法大概是JAVA和PYTHON的混合體&#xff0c;如果懂爬蟲的話&#xff0c;學這個軟件就快的很&#xff0c;看了一下官方的教程&#xff0c;對于有基礎的人來說很有點枯燥&#xff0c;但又不…

docker部署seafile修改默認端口并安裝配置onlyoffice實現在線編輯

背景 有很多場景會用到類似seafile功能的需求&#xff0c;比如&#xff1a; 在內網中傳輸和共享文件個人部署私人網盤文檔協同在線編輯寫筆記… 這些功能seafile均有實現&#xff0c;并且社區版提供的功能基本可以滿足個人或者小型團隊的日常需求 問題 由于主機的80和443端…

計算機視覺cv2入門之視頻處理

在我們進行計算機視覺任務時&#xff0c;經常會對視頻中的圖像進行操作&#xff0c;這里我來給大家分享一下&#xff0c;cv2對視頻文件的操作方法。這里我們主要介紹cv2.VideoCapture函數的基本使用方法。 cv2.VideoCapture函數 當我們在使用cv2.VideoCapture函數時&#xff…

Linux之徹底掌握防火墻-----安全管理詳解

—— 小 峰 編 程 目錄&#xff1a; 一、防火墻作用 二、防火墻分類 1、邏輯上劃分&#xff1a;大體分為 主機防火墻 和 網絡防火墻 2、物理上劃分&#xff1a; 硬件防火墻 和 軟件防火墻 三、硬件防火墻 四、軟件防火墻 五、iptables 1、iptables的介紹 2、netfilter/…

python項目實戰-后端個人博客系統

本文分享一個基于 Flask 框架開發的個人博客系統后端項目&#xff0c;涵蓋用戶注冊登錄、文章發布、分類管理、評論功能等核心模塊。適合初學者學習和中小型博客系統開發。 一、項目結構 blog │ app.py │ forms.py │ models.py │ ├───instance │ blog.d…

Unity 接入阿里的全模態大模型Qwen2.5-Omni

1 參考 根據B站up主陰沉的怪咖 開源的項目的基礎上修改接入 AI二次元老婆開源項目地址(unity-AI-Chat-Toolkit): Github地址&#xff1a;https://github.com/zhangliwei7758/unity-AI-Chat-Toolkit Gitee地址&#xff1a;https://gitee.com/DammonSpace/unity-ai-chat-too…

第十五屆藍橋杯 2024 C/C++組 合法密碼

目錄 題目&#xff1a; 題目描述&#xff1a; 題目鏈接&#xff1a; 思路&#xff1a; substr函數&#xff1a; 思路詳解&#xff1a; 代碼&#xff1a; 代碼詳解; 題目&#xff1a; 題目描述&#xff1a; 題目鏈接&#xff1a; P10906 [藍橋杯 2024 國 B] 合法密碼 -…

NoSQL 簡單講解

目錄 1. NoSQL 的背景與意義 1.1 數據庫的演變 1.2 NoSQL 的興起 2. NoSQL 數據庫的分類 2.1 鍵值存儲&#xff08;Key-Value Stores&#xff09; 2.2 文檔數據庫&#xff08;Document Stores&#xff09; 2.3 列族存儲&#xff08;Column-Family Stores&#xff09; 2.…

122.在 Vue3 中使用 OpenLayers 實現圖層層級控制(zIndex)顯示與設置詳解

?? 作者:彭麒 ?? 郵箱:1062470959@qq.com ?? 聲明:本文源碼歸吉檀迦俐所有,歡迎學習借鑒,如用于商業項目請注明出處 ?? ?? 技術棧:Vue 3 + Composition API + OpenLayers 6+ + Element Plus + Tailwind CSS ?? 一、什么是 zIndex(圖層層級)? 在地圖開發中…

車載測試用例開發-如何平衡用例覆蓋度和測試效率的方法論

1 摘要 在進行車載測試用例編寫時&#xff0c;會遇到多個條件導致用例排列組合爆炸的情況&#xff0c;但是為了產品測試質量&#xff0c;我們又不得不保證用例設計的需求覆蓋度&#xff0c;這樣又會使得測試周期非常長。我們如何平衡效率和測試質量&#xff1f;本文進行了一些…

AI——神經網絡以及TensorFlow使用

文章目錄 一、TensorFlow安裝二、張量、變量及其操作1、張量Tensor2、變量 三、tf.keras介紹1、使用tf.keras構建我們的模型2、激活函數1、sigmoid/logistics函數2、tanh函數3、RELU函數4、LeakReLu5、SoftMax6、如何選擇激活函數 3、參數初始化1、bias偏置初始化2、weight權重…

Kubernetes (k8s) 日常運維命令總結

一、資源查看 查看所有命名空間的 Pod kubectl get pod --all-namespaces查看指定命名空間的 Pod kubectl get pod --namespace <命名空間>查看所有部署&#xff08;Deployments&#xff09; kubectl get deployments.apps --all-namespaces查看所有守護進程集&#xff0…

【PostgreSQL教程】PostgreSQL 特別篇之 語言接口連接Perl

博主介紹:?全網粉絲22W+,CSDN博客專家、Java領域優質創作者,掘金/華為云/阿里云/InfoQ等平臺優質作者、專注于Java技術領域? 技術范圍:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大數據、物聯網、機器學習等設計與開發。 感興趣的可…

07-IDEA企業開發工具-開發入門程序

1. IDEA創建Java項目的代碼結構 項目結構: IDEA中的Java項目包含四種主要結構&#xff1a;工程(Project)、模塊(Module)、包(Package)、類(Class)。 工程(Project): 代表整個項目&#xff0c;通常是一個磁盤目錄或文件夾。模塊(Module): 工程下的子單元&#xff0c;用于劃分項…

深度解析云計算:概念、優勢與分類全覽

以下是對云計算概念、優點和分類更詳細的介紹&#xff1a; 一、云計算的概念 云計算是一種通過互聯網提供計算服務的模式&#xff0c;它基于虛擬化、分布式計算、網絡存儲等一系列先進技術&#xff0c;將計算資源進行整合和管理&#xff0c;形成一個龐大的資源池。這些資源包…

高并發系統的通用設計方法是什么?

背景 高并發系統的通用設計方法是解決系統在面對大量用戶訪問時的性能瓶頸問題。當系統遇到性能瓶頸時&#xff0c;通常是因為某個單點資源&#xff08;如數據庫、后端云服務器、網絡帶寬等&#xff09;達到了極限。 為了提升整個系統的容量&#xff0c;需要找到這個瓶頸資源…

【手機】vivo手機應用聲音分離方案

文章目錄 前言方案 前言 嘗試分離vivo手機音樂與其他應用的聲音 方案 最佳方案&#xff1a;網易云音樂設置內關閉音量均衡 上傳不同的白噪音&#xff0c;成功 goodlock&#xff0c;主要適用于三星手機&#xff0c;vivo不一定適用 app volume control &#xff0c;可行

一個報錯說函數為私有函數

你遇到的警告信息&#xff1a; warning: declaration of struct Zero2TenVDrv will not be visible outside of this function [-Wvisibility]這是編譯器提示你在某個函數內部聲明了一個結構體 struct Zero2TenVDrv&#xff0c;但這個結構體的聲明作用域僅限于該函數內部&…

3.2 Agent核心能力:感知、規劃、決策與執行

智能代理&#xff08;Agent&#xff09;是一種能夠在復雜環境中自主運作的計算實體&#xff0c;其智能行為依賴于四大核心能力&#xff1a;感知&#xff08;Perception&#xff09;、規劃&#xff08;Planning&#xff09;、決策&#xff08;Decision-making&#xff09;和執行…

圖解Mysql原理:深入理解事務的特性以及它的實現機制

前言 大家好&#xff0c;我是程序蛇玩編程。 Mysql中事務大家不陌生吧&#xff0c;事務就是要保證一組數據庫操作&#xff0c;要么全部成功&#xff0c;要么全部失敗。那它具有哪些特性&#xff0c;如何實現的呢?接著往下看。 正文 事務的特性: 事務的基本特性主要為四種…