Java中的字符串String

目錄

一、常用方法

1、字符串構造

2、String對象的比較

(1)、equals方法

(2)、compareTo方法

(3)、compareToIgnoreCase方法(忽略大小寫進行比較)

3、字符串查找

4、轉化

(1)數值和字符串轉化

?編輯

(2)大小寫轉換

(3)字符串轉數組

(4)格式化

5、字符串替換

6、字符串拆分

7、字符串截取

8、其他操作方法

二、String的不可變性

三、StringBuffer和StingBuilder

1、方法:

2、String、StringBuffer、StringBuilder的區別


一、常用方法

1、字符串構造

三種構造方法

(1)、直接賦值

String s1 = "hello world";
System.out.println(s1);

(2)、創建出新的對象

String s2 = new String("hello");
System.out.println(s2);

(3)、使用字符數組進行構造

char[] ch = {'h','e','l','l','o'};
String s3 = new String(ch);
System.out.println(s3);

三個輸出效果如下:

2、String對象的比較

對于基本變量,可以直接用 “==,?<,??>,??<=, >=?”來進行比較,但對于引用類型變量,不可以直接使用上面的表達式來比較,如圖:

代碼:

String s1 = new String("hello");
String s2 = new String("hello");
System.out.println(s1 == s2);

s1和s2的內容都是一樣的,為啥下面輸出false呢?

原因是s1和s2是引用類型,使用上述表達式進行比較,比較的是兩個對象的地址,兩個對象是不同的,地址自然也是不同的。

那么怎么可以比較引用對象的內容呢?有以下方法:

(1)、equals方法

? ? ? ? 按照字典序比較,字典序:字符大小。

Object的equals默認是按 “==” 進行比較的,如圖:

所以類都默認繼承Object類,String繼承Object類,重寫了equals方法,如圖:

方法的使用:

代碼:

        String s1 = new String("hello");String s2 = new String("hello");System.out.println(s1.equals(s2));String s3 = new String("Hello");System.out.println(s1.equals(s3));

執行效果:

(2)、compareTo方法

按照字典序比較,和equals方法不同的是:equals返回的是boolean類型,而compareTo返回的是int類型,具體比較方式:

? ? ? ? 1、先按照字典序大小比較,如果出現不相等的字符,直接返回這兩個字符的大小差值。

? ? ? ? 2、如果前k個字符相同,返回兩個字符串長度差值。

方法內部:

public int compareTo(String anotherString) {int len1 = value.length;int len2 = anotherString.value.length;int lim = Math.min(len1, len2);char v1[] = value;char v2[] = anotherString.value;int k = 0;while (k < lim) {char c1 = v1[k];char c2 = v2[k];if (c1 != c2) {return c1 - c2;}k++;}return len1 - len2;}

方法使用:

代碼:

        String s1 = new String("ab");String s2 = new String("ac");String s3 = new String("ab");String s4 = new String("abcdef");System.out.println(s1.compareTo(s2)); // 不同輸出字符差值-1System.out.println(s1.compareTo(s3)); // 相同輸出 0System.out.println(s1.compareTo(s4)); // 前k個字符完全相同,輸出長度差值 -3

執行效果:

(3)、compareToIgnoreCase方法(忽略大小寫進行比較)

與compareTo方法一樣,不過忽略大小寫

方法內部:

public static final Comparator<String> CASE_INSENSITIVE_ORDER= new CaseInsensitiveComparator();private static class CaseInsensitiveComparatorimplements Comparator<String>, java.io.Serializable {// use serialVersionUID from JDK 1.2.2 for interoperabilityprivate static final long serialVersionUID = 8575799808933029326L;public int compare(String s1, String s2) {int n1 = s1.length();int n2 = s2.length();int min = Math.min(n1, n2);for (int i = 0; i < min; i++) {char c1 = s1.charAt(i);char c2 = s2.charAt(i);if (c1 != c2) {c1 = Character.toUpperCase(c1);c2 = Character.toUpperCase(c2);if (c1 != c2) {c1 = Character.toLowerCase(c1);c2 = Character.toLowerCase(c2);if (c1 != c2) {// No overflow because of numeric promotionreturn c1 - c2;}}}}return n1 - n2;}

方法的使用:

代碼:

String s1 = new String("hello");String s2 = new String("Hello");System.out.println(s1.compareToIgnoreCase(s2));

執行效果:

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

4、轉化

(1)數值和字符串轉化

數值轉字符串:

        String s1 = String.valueOf(1234);String s2 = String.valueOf(12.34);System.out.println(s1);System.out.println(s2);System.out.println("==============");String s3 = String.valueOf(true);String s4 = String.valueOf(new Student("Hanmeimei", 18));System.out.println(s3);System.out.println(s4);

整型轉換為字符串型的內部代碼:

    public static String valueOf(int i) {return Integer.toString(i);}

double類型轉換為字符串型代碼:

    public static String valueOf(double d) {return Double.toString(d);}

boolean轉換為字符串的內部代碼:

    public static String valueOf(boolean b) {return b ? "true" : "false";}

引用類型轉換為字符串型的內部代碼:

    public static String valueOf(Object obj) {return (obj == null) ? "null" : obj.toString();}

字符串轉換為整型 / double類型:

代碼:

int data1 = Integer.parseInt("1234");
Double data2 = Double.parseDouble("12.34");

如圖,執行效果:


(2)大小寫轉換

代碼:

        String s1 = "hello";String s2 = "HELLO";//小寫轉大寫System.out.println(s1.toUpperCase());//大寫轉小寫System.out.println(s2.toLowerCase());

執行效果:

(3)字符串轉數組

代碼:

//字符串轉數組
char[] ch = s1.toCharArray();
//數組轉字符串
String s2 = new String(ch);

執行效果

(4)格式化

代碼:

String s = String.format("%d-%d-%d", 2023, 11, 21);

執行效果:

5、字符串替換

使用一個新的字符串替換舊的字符串,方法如下:

方法功能
String replaceAll(String regex, String replacement)替換所有的指定內容
String replaceFirst(String regex, String replacement)替換首個內容

代碼:

String str = "hello world";
System.out.println(str.replaceAll("l", "-"));
System.out.println(str.replaceFirst("l", "-"));

執行效果:

6、字符串拆分

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

方法功能
String[] split(String regex)將字符串全部拆分
String[] split(String regex, int limit)將字符串以指定的格式,拆分為limit組

代碼:

        String s1 = "hello world hello bit";String[] result = s1.split(" ");for(String x : result) {System.out.println(x);}

執行效果:

字符串的部分拆分代碼:
?

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

拆分IP地址:
?

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

執行效果:

注意:要寫劃分ip地址,在字符串里寫進轉義字符,在字符串里,兩個 “ \\ ” 代表一個 “ \ ”?

1. 字符"|","*","+"都得加上轉義字符,前面加上 "\\" .
2. 而如果是 "\" ,那么就得寫成 "\\\\" .
3. 如果一個字符串中有多個分隔符,可以用"|"作為連字符.

如下:

        String s1 = "192.16-8.1.1";String[] result = s1.split("\\.|-");for(String x : result) {System.out.println(x);}

代碼示例: 多次拆分
?

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]);
}

7、字符串截取

從一個完整的字符串截取出部分內容,方法如下:

方法功能
String substring(int beginIndex)從指定索引截取到結尾
String substring(int beginIndex, int endIndex)截取部分內容

代碼:

        String s = "helloworld";System.out.println(s.substring(5));System.out.println(s.substring(0, 5));

執行效果:

注意:區間是是前閉后開的規則,上面的第二個substring語句,是 [0,5)。所以不包含5下標。

8、其他操作方法

方法功能
String trim()去掉字符串中的左右空格,保留中間空格
String toUpperCase()字符串轉大寫
String toLowerCase()字符串轉小寫

trim 會去掉字符串開頭和結尾的空白字符(空格, 換行, 制表符等).
后面兩個函數只轉換字母


二、String的不可變性

String是一種不可變對象. 字符串中的內容是不可改變。字符串不可被修改,是因為:
1. String類在設計時就是不可改變的,String類實現描述中已經說明了

String類中的字符實際保存在內部維護的value字符數組中,該圖還可以看出:
1. String類被final修飾,表明該類不能被繼承。
2. value被修飾被final修飾,表明value自身的值不能改變,即不能引用其它字符數組,但是其引用空間中的內容可以修改。

2. 所有涉及到可能修改字符串內容的操作都是創建一個新對象,改變的是新對象
比如 replace 方法:

原因不是final,

final修飾類表明該類不想被繼承,final修飾引用類型表明該引用變量不能引用其他對象,但是其引用對象中的內容是可以修改的
代碼驗證如下:

final int array[] = {1,2,3,4,5};
array[0] = 100;
System.out.println(Arrays.toString(array));
//array = new int[]{4,5,6}; //java: 無法為最終變量array分配值

執行效果:

注意:盡量避免直接對String類型對象進行修改,因為String類是不能修改的,所有的修改都會創建新對象,效率非常低下,盡量避免對String的直接修改,如果要修改建議盡量使用StringBuffer或者StringBuilder。


三、StringBuffer和StingBuilder

1、方法:

方法說明
StringBuff append(String
str)
在尾部追加,相當于String的+=,可以追加:boolean、char、char[]、
double、float、int、long、Object、String、StringBuff的變量
char charAt(int index)獲取index位置的字符
int length()獲取字符串的長度
int capacity()獲取底層保存字符串空間總的大小
void ensureCapacity(int
mininmumCapacity)
擴容
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最后一次出現的位置
StringBuff 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的方式返回

String和StringBuilder最大的區別在于String的內容無法修改,而StringBuilder的內容可以修改。

和StringBuffer的區別也是。頻繁修改字符串的情況考慮使用StringBuilder /?StringBuffer

2、String、StringBuffer、StringBuilder的區別

(1)String的內容不可修改,StringBuffer和StringBuilder的內容可修改。

(2)StringBuffer和StringBuilder的大部分功能一樣。

(3)StringBuffer采用同步處理,屬于線程安全操作,StringBuilder未采用同步處理,不屬于線程安全操作。


都看到這了,點個贊再走吧,謝謝謝謝謝!!

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

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

相關文章

4.3 實時陰影

一、基于圖像的陰影技術&#xff08;Shadow Map&#xff09; 什么是陰影 當來自光源的至少一個點在空間中被遮擋時&#xff0c;就產生了陰影區域。 陰影的前提 直接光照不透明物體 陰影的實現方式 陰影體&#xff08;Shadow Volumes&#xff09;——空間中黑暗部分的幾何…

Springboot集成swagger之knife4j

knife4j的最終效果&#xff1a; 支持直觀的入參介紹、在線調試及離線各種API文檔下載。 1 引入pom <dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId><version>3.0.2</ver…

python 3.7安裝并配置 pytorch(torch 1.8.2 + cuda 11.1 + torchaudio 0.8.2 + torchvision 0.9.2)

文章目錄 前言一、安裝 python二、安裝 cuda cudnn二、安裝 pytorch2.1 版本匹配2.1.1 方法一2.1.2 方法二2.2 安裝 .tar.bz2 三、驗證是否安裝成功總結 前言 本篇文章主要介紹在Windows下 python 3.7 配置 pytorch&#xff0c;幫助需要的朋友避坑 安裝 pytorch 需要多個版本適…

內建組件和模塊

討論 Vue.js 中幾個非常重要的內建組件和模塊&#xff0c;例如 KeepAlive 組件、Teleport 組件、Transition 組件等&#xff0c;它們都需要渲染器級別的底層支持。另外&#xff0c;這些內建組件所帶來的能力&#xff0c;對開發者而言非常重要且實用&#xff0c;理解它們的工作原…

Word中如何實現 圖片 | 表格 自動編號與文中引用編號對應

當我們在進行大篇幅word文檔的編寫時&#xff0c;為了節約修改文章中圖片或表格所花費的大量時間&#xff0c;可以將圖片自動編號&#xff0c;且讓文中引用的順序跟著圖片順序的變化而變化&#xff0c;具體操作如下&#xff1a; 1. 將鼠標定位在圖片或者表格欲加編號的下方或上…

Banana Pi [BPi-R3-Mini] 回顧和主線 ImmortalWrt 固件支持

BananaPi BPi-R3 Mini 采用 MediaTek 830&#xff08;4 個 A53&#xff0c;最高 2.0 GHz&#xff09;&#xff0c;具有 2 個 2.5 GbE、AX4200 2.4G/5G 無線和 USB 2.0 端口。它還具有兩個 M.2 連接器&#xff0c;可用于 NVMe SSD 和 5G 模塊&#xff08;板上包含 Nano SIM 插槽…

ELK企業級日志分析平臺——kibana數據可視化

部署 新建虛擬機server5&#xff0c;部署kibana [rootelk5 ~]# rpm -ivh kibana-7.6.1-x86_64.rpm [rootelk5 ~]# cd /etc/kibana/[rootelk5 kibana]# vim kibana.ymlserver.host: "0.0.0.0"elasticsearch.hosts: ["http://192.168.56.11:9200"]i18n.local…

微服務學習(十二):安裝Minio

微服務學習&#xff08;十二&#xff09;&#xff1a;安裝Minio 一、簡介 MinIO 是一款基于Go語言發開的高性能、分布式的對象存儲系統。客戶端支持Java,Net,Python,Javacript, Golang語言。MinIO系統&#xff0c;非常適合于存儲大容量非結構化的數據&#xff0c;例如圖片、視…

2023亞太杯數學建模C題:我國新能源電動汽車的發展趨勢,思路模型代碼

問題C 我國新能源電動汽車的發展趨勢 賽題思路&#xff1a;獲取思路見文末名片&#xff0c;第一時間更新 新能源汽車是指以先進技術原理、新技術、新結構的非常規汽車燃料為動力來源( 非常規汽車燃料指汽油、柴油以外的燃料&#xff09;&#xff0c;將先進技術進行汽車動力控制…

Qt 軟件開發框架(主要部分)

目錄 1、 一個軟件基本要素 &#xff08;1&#xff09;UI模塊 &#xff08;2&#xff09;網絡模塊 &#xff08;3&#xff09;業務邏輯模塊 &#xff08;4&#xff09;中間層 &#xff08;5&#xff09;獨立模塊&#xff08;守護進程、更新模塊、日志收集模塊…&#xff…

【spring(三)】AOP總結

&#x1f308;鍵盤敲爛&#xff0c;年薪30萬&#x1f308; 目錄 一、AOP相關概念 ① AOP核心思想思想&#xff1a; ② AOP專業術語&#xff1a; 二、AOP快速如入門 三、AOP工作流程 四、切入點表達式 ① 語法格式 ②支持通配符 ③書寫技巧 五、通知類型 ①?環繞通知…

nodejs 如何將 Buffer 數據轉為 String

問題說明 使用webSocket的時候出現了一個問題&#xff0c;前端小程序和nodejs后端建立websocket連接后&#xff0c;使用send方法發送到后端為buffer格式&#xff0c;以下為我前后端代碼 1、前端小程序代碼 //創建webSocket連接 const socket uni.connectSocket({url: wss…

[架構之路-249]:目標系統 - 設計方法 - 軟件工程 - 需求工程- 需求開發:如何用圖形表達需求,結構化方法的需求分析

目錄 一、概述 二、數據模型&#xff1a;E-R圖/實體關系圖&#xff08;數據單元之間的結構關系&#xff09; 三、功能模型&#xff1a;數據流圖DFD&#xff08;邏輯運算&#xff0c;包括輸入和輸出&#xff0c;實體之間的關系&#xff09;&#xff1a;輸入》處理 》 輸出 四…

【科技素養】藍橋杯STEMA 科技素養組模擬練習試卷5

1、隨著對新冠肺炎研究的深入&#xff0c;多個國家都已經開始了針對新冠肺炎病毒的疫苗的開發。以下關于疫苗的描述中&#xff0c;不正確的是 A、滅活疫苗的基本原理是將經過處理的病原體注射進入人體內 B、大規模接種疫苗可以幫助達成“群體免疫“&#xff0c;阻斷病毒傳播 …

【VSCode】VSCode 使用

目錄 文章目錄 目錄插件配置設置代碼不顯示 git 提示 "xxx months ago | 1 author"設置打開項目不自動選擇 CMakeLists 插件 以下插件為 C 開發偏好設置。 C/CCMakeCMake ToolsGitLensRemote DevelopmentRemote Explorer 配置 設置代碼不顯示 git 提示 “xxx mon…

絕地求生:PGC 2023 賽事直播期間最高可獲:2000萬G-Coins,你還不來嗎?

今年PGC直播期間將有最高2000萬G-Coin掉落&#xff0c;究竟花落誰家咱們拭目以待 公告原文&#xff1a;Watch PGC 2023 Live And Earn G-Coins! 如何賺取高額G-Coin&#xff1f; Throughout the PGC 2023, an astounding 20,000,000 G-Coins will be up for grabs as part of …

一致性 Hash 算法 Hash 環發生偏移怎么解決

本篇是對文章《一文徹底讀懂一致性哈希算法》的重寫&#xff0c;圖文并茂&#xff0c;篇幅較長&#xff0c;歡迎閱讀完提供寶貴的建議&#xff0c;一起提升文章質量。如果感覺不錯不要忘記點贊、關注、轉發哦。原文鏈接&#xff1a; 《一文徹底讀懂一致性Hash 算法》 通過閱讀本…

【OpenCV實現圖像:可視化目標檢測框】

文章目錄 概要畫框函數代碼實現標簽美化角點美化透明效果小結 概要 目標檢測框的可視化在計算機視覺和機器學習領域中是一項重要的任務&#xff0c;有助于直觀地理解和評估目標檢測算法的性能。通過使用Python和相關的圖像處理庫&#xff0c;可以輕松實現目標檢測框的可視化。…

C++二分算法:最多可以參加的會議數目 II

本文涉及的基礎知識點 二分查找算法合集 本題其它解法 C二分向量算法&#xff1a;最多可以參加的會議數目 II 題目 給你一個 events 數組&#xff0c;其中 events[i] [startDayi, endDayi, valuei] &#xff0c;表示第 i 個會議在 startDayi 天開始&#xff0c;第 endDay…

如何在Ubuntu 20.04.6 LTS系統上運行Selenium自動化測試

文章目錄 寫在前面一、 環境準備1.1 安裝python31.1.1 使用APT安裝Python31.1.2 使用PPA安裝較新版本的Python31.1.3 從源代碼編譯安裝Python31.2 安裝pip31.3 安裝jdk1.4 安裝運行所需瀏覽器1.4 使用Git拉取自動化測試代碼/復制自動化測試代碼到Ubuntu 20.04.6 LTS二、安裝pip…