Java-String類最全匯總(下篇)
字符, 字節(jié)與字符串
字符與字符串
字符串內(nèi)部包含一個(gè)字符數(shù)組,String 可以和 char[] 相互轉(zhuǎn)換.
字符數(shù)組變?yōu)樽址?/h4>
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); System.out.println(str); }
指定字符數(shù)組變?yōu)樽址?/h4>
public static void main(String[] args) {
char[] val = {'a','b','c','d','e'};
String str = new String(val,1,3);//第一個(gè)參數(shù)是開(kāi)始變得字符下標(biāo) 第二個(gè)參數(shù)是要變的字符個(gè)數(shù)
System.out.println(str);
}
public static void main(String[] args) { char[] val = {'a','b','c','d','e'}; String str = new String(val,1,3);//第一個(gè)參數(shù)是開(kāi)始變得字符下標(biāo) 第二個(gè)參數(shù)是要變的字符個(gè)數(shù) System.out.println(str); }
獲取指定位置的字符:
public static void main(String[] args) { String str = "hello" ; System.out.println(str.charAt(0)); // 下標(biāo)從 0 開(kāi)始 }
public static void main(String[] args) { String str = "hello" ; System.out.println(str.charAt(10)); }
將字符串變?yōu)樽址麛?shù)組:
public static void main(String[] args) { String str = "helloworld" ; char[] chars =str.toCharArray();//把str指向的字符串對(duì)象變?yōu)樽址麛?shù)組 System.out.println(Arrays.toString(chars)); }
代碼示例: 給定字符串一個(gè)字符串, 判斷其是否全部由數(shù)字所組成.
思路: 將字符串變?yōu)樽址麛?shù)組而后判斷每一位字符是否是" 0 “~”‘9’"之間的內(nèi)容,如果是則為數(shù)字.
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)); }
字節(jié)與字符串
字節(jié)常用于數(shù)據(jù)傳輸以及編碼轉(zhuǎn)換的處理之中,String 也能方便的和 byte[] 相互轉(zhuǎn)換.
將字節(jié)數(shù)組變?yōu)樽址?/h4>
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}; String str = new String(bytes); System.out.println(str); }
將部分字節(jié)數(shù)組中的內(nèi)容變?yōu)樽址?/h4>
public static void main(String[] args) {
byte[] bytes = {97,98,99,100,101,102};
String str = new String(bytes,1,4);//第一個(gè)參數(shù)是開(kāi)始變得字符下標(biāo) 第二個(gè)參數(shù)是要變的字符個(gè)數(shù)
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);//第一個(gè)參數(shù)是開(kāi)始變得字符下標(biāo) 第二個(gè)參數(shù)是要變的字符個(gè)數(shù) System.out.println(str); }
將字符串以字節(jié)數(shù)組的形式返回:
public static void main(String[] args) { String str = "abcd"; byte[] bytes = str.getBytes(); System.out.println(Arrays.toString(bytes)); }
編碼轉(zhuǎn)換處理:
public static void main(String[] args) throws UnsupportedEncodingException { String str = "abcd"; byte[] bytes = str.getBytes("GBK"); System.out.println(Arrays.toString(bytes)); }
小結(jié)
那么何時(shí)使用 byte[], 何時(shí)使用 char[] 呢?
- byte[] 是把 String 按照一個(gè)字節(jié)一個(gè)字節(jié)的方式處理, 這種適合在網(wǎng)絡(luò)傳輸, 數(shù)據(jù)存儲(chǔ)這樣的場(chǎng)景下使用. 更適合針對(duì)二進(jìn)制數(shù)據(jù)來(lái)操作.
- char[] 是吧 String 按照一個(gè)字符一個(gè)字符的方式處理, 更適合針對(duì)文本數(shù)據(jù)來(lái)操作, 尤其是包含中文的時(shí)候.
回憶概念: 文本數(shù)據(jù) vs 二進(jìn)制數(shù)據(jù)
一個(gè)簡(jiǎn)單粗暴的區(qū)分方式就是用記事本打開(kāi)能不能看懂里面的內(nèi)容.
如果看的懂, 就是文本數(shù)據(jù)(例如 .java 文件), 如果看不懂, 就是二進(jìn)制數(shù)據(jù)(例如 .class 文件).
字符串常見(jiàn)操作
字符串比較
上面使用過(guò)String類提供的equals()方法,該方法本身是可以進(jìn)行區(qū)分大小寫的相等判斷
。除了這個(gè)方法之外,String類還提供有如下的比較操作:
代碼示例: 不區(qū)分大小寫比較
String str1 = "hello" ; String str2 = "Hello" ; System.out.println(str1.equals(str2)); // false System.out.println(str1.equalsIgnoreCase(str2)); // true
注意:equalsIgnoreCase是忽略大小寫的意思。
在String類中compareTo()方法是一個(gè)非常重要的方法,該方法返回一個(gè)整型,該數(shù)據(jù)會(huì)根據(jù)大小關(guān)系返回三類內(nèi)容:
- 相等:返回 0.
- 小于:返回內(nèi)容小于 0.
- 大于:返回內(nèi)容大于 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()是一個(gè)可以區(qū)分大小關(guān)系的方法,是String方法里是一個(gè)非常重要的方法。這里的返回值就是前面字符對(duì)應(yīng)的數(shù)值減去后面的字符所對(duì)應(yīng)的數(shù)值。
字符串的比較大小規(guī)則, 總結(jié)成三個(gè)字 “字典序” 相當(dāng)于判定兩個(gè)字符串在一本詞典的前面還是后面. 先比較第一個(gè)字符的大小(根據(jù) unicode 的值來(lái)判定), 如果不分勝負(fù), 就依次比較后面的內(nèi)容
字符串查找
從一個(gè)完整的字符串之中可以判斷指定內(nèi)容是否存在,對(duì)于查找方法有如下定義:
代碼示例: 字符串查找,最好用最方便的就是contains() ——(類似于C語(yǔ)言的strstr)
String str = "helloworld" ; System.out.println(str.contains("world")); // true
該判斷形式是從JDK1.5之后開(kāi)始追加的,在JDK1.5以前要想實(shí)現(xiàn)與之類似的功能,就必須借助、indexOf()方法完成。
代碼示例: 使用indexOf()方法進(jìn)行位置查找(找到之后返回我們查找元素的第一個(gè)位置)
String str = "helloworld" ; System.out.println(str.indexOf("world")); // 5,w開(kāi)始的索引 System.out.println(str.indexOf("bit")); // -1,沒(méi)有查到 if (str.indexOf("hello") != -1) { System.out.println("可以查到指定字符串!"); }
現(xiàn)在基本都是用contains()方法完成。
使用indexOf()需要注意的是,如果內(nèi)容重復(fù),它只能返回查找的第一個(gè)位置
代碼示例: 使用indexOf()的注意點(diǎn)
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
在進(jìn)行查找的時(shí)候往往會(huì)判斷開(kāi)頭或結(jié)尾。
代碼示例: 判斷開(kāi)頭或結(jié)尾
String str = "**@@helloworld!!" ; System.out.println(str.startsWith("**")); // true System.out.println(str.startsWith("@@",2)); // ture System.out.println(str.endsWith("!!")); // true
字符串替換
使用一個(gè)指定的新的字符串替換掉已有的字符串?dāng)?shù)據(jù),可用的方法如下:
代碼示例: 字符串的替換處理
String str = "helloworld" ; System.out.println(str.replaceAll("l", "_")); System.out.println(str.replaceFirst("l", "_"));
注意事項(xiàng): 由于字符串是不可變對(duì)象 , 替換不修改當(dāng)前字符串, 而是產(chǎn)生一個(gè)新的字符串.
字符串拆分
可以將一個(gè)完整的字符串按照指定的分隔符劃分為若干個(gè)子字符串。
可用方法如下:
代碼示例: 實(shí)現(xiàn)字符串的拆分處理
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); }
拆分是特別常用的操作. 一定要重點(diǎn)掌握. 另外有些特殊字符作為分割符可能無(wú)法正確切分, 需要加上轉(zhuǎn)義.
代碼示例: 拆分IP地址
String str = "192.168.1.1" ; String[] result = str.split("\\.") ; for(String s: result) { System.out.println(s); }
? 注意事項(xiàng):
- 字符"|“,”*“,”+“,”.“都得加上轉(zhuǎn)義字符,前面加上”"
- .而如果是"“,那么就得寫成”\\".(\等于一個(gè),而\本身又需要一個(gè)\來(lái)進(jìn)行轉(zhuǎn)義)
- 如果一個(gè)字符串中有多個(gè)分隔符,可以用"|"作為連字符.代碼示例: 多次拆分
代碼示例: 多次拆分
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]); }
這種代碼在以后的開(kāi)發(fā)之中會(huì)經(jīng)常出現(xiàn)
字符串截取
從一個(gè)完整的字符串之中截取出部分內(nèi)容。可用方法如下:
代碼示例: 觀察字符串截取
String str = "helloworld" ; System.out.println(str.substring(5));//從第5個(gè)字符位置的位置開(kāi)始截取到結(jié)尾 System.out.println(str.substring(0, 5));//從0位置開(kāi)始截取到第5位置的元素
注意事項(xiàng):
- 索引從0開(kāi)始
- 注意前閉后開(kāi)區(qū)間(左閉右開(kāi))的寫法, substring(0, 5) 表示包含 0 號(hào)下標(biāo)的字符, 不包含 5 號(hào)下標(biāo),所以下圖不包含’w’字符
其他操作方法
代碼示例: 觀察trim()方法的使用
String str = " hello world " ; System.out.println("["+str+"]"); System.out.println("["+str.trim()+"]");
trim 會(huì)去掉字符串開(kāi)頭和結(jié)尾的空白字符(空格, 換行, 制表符等).
代碼示例: 大小寫轉(zhuǎn)換
String str = " hello%$$%@#$%world 哈哈哈 " ; System.out.println(str.toUpperCase()); System.out.println(str.toLowerCase());
這兩個(gè)函數(shù)只轉(zhuǎn)換字母。
代碼示例: 字符串length() —— 取得字符串長(zhǎng)度
String str = " hello%$$%@#$%world 哈哈哈 " ; System.out.println(str.length());
注意:數(shù)組長(zhǎng)度使用數(shù)組名稱.length屬性,而String中使用的是length()方法
代碼示例: 觀察isEmpty()方法 —— 判斷是否為空字符串(不是null,而是長(zhǎng)度為0)
System.out.println("hello".isEmpty()); System.out.println("".isEmpty()); System.out.println(new String().isEmpty());
String類并沒(méi)有提供首字母大寫操作,需要自己實(shí)現(xiàn).
代碼示例: 首字母大寫
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
首先來(lái)回顧下String類的特點(diǎn):
任何的字符串常量都是String對(duì)象,而且String的常量一旦聲明不可改變,如果改變對(duì)象內(nèi)容,改變的是其引用的指向而已。
通常來(lái)講String的操作比較簡(jiǎn)單,但是由于String的不可更改特性,為了方便字符串的修改,提供了其兩大類。
這兩大類大部分功能是相同的,我們主要介紹
StringBuffer
在String中使用"+"來(lái)進(jìn)行字符串連接,但是這個(gè)操作在
StringBuffer
類中需要更改為append()方法:
public synchronized StringBuffer append(各種數(shù)據(jù)類型 b)
我們來(lái)看這類的繼承結(jié)構(gòu):
- 字符串反轉(zhuǎn):
public synchronized StringBuffer reverse()
代碼示例: 字符串反轉(zhuǎn)(reverse)
StringBuffer sb = new StringBuffer("helloworld"); System.out.println(sb.reverse());
刪除指定范圍的數(shù)據(jù)(delete):
public synchronized StringBuffer delete(int start, int end)
代碼示例: 觀察刪除操作( delete( , ) )
StringBuffer sb = new StringBuffer("helloworld"); System.out.println(sb.delete(5, 10));
插入數(shù)據(jù)(insert)
public synchronized StringBuffer insert(int offset, 各種數(shù)據(jù)類型 b)
代碼示例: 觀察插入操作( insert( , ) )
StringBuffer sb = new StringBuffer("helloworld"); System.out.println(sb.delete(5, 10).insert(0, "你好"));
小結(jié)
字符串操作是我們以后工作中非常常用的操作. 使用起來(lái)都非常簡(jiǎn)單方便, 一定要使用熟練.
補(bǔ)充
1.什么是哈希表:數(shù)據(jù)結(jié)構(gòu)–>描述和組織數(shù)據(jù)的一種方式。
12 45 2 7 15 92
問(wèn)題:如何去查找到一個(gè)關(guān)鍵字
1、順序查找:通過(guò)關(guān)鍵字的一個(gè)一個(gè)的比較,才能找到O(n)
2、排序+二分查找
哈希表時(shí)間效率非常高 效率可以高到O(1)。
2.數(shù)組的賦值 只有1次機(jī)會(huì) 就是在定義的時(shí)候
array不可以直接進(jìn)行二次賦值,如下圖所示:
我們?cè)趎ew了一個(gè)新的array后,我們就可以對(duì)array進(jìn)行二次賦值了
但是我們的數(shù)組array用了final修飾后就不可以改變了
若array被final修飾后,還想修改array的值,那我們便需要通過(guò)反射修改array
到此這篇關(guān)于Java-String類最全匯總(下篇)的文章就介紹到這了,其他的內(nèi)容(上篇)請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java String、StringBuilder和StringBuffer的區(qū)別詳解
這篇文章主要介紹了java String、StringBuilder和StringBuffer的區(qū)別詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01Mybatis Generator Plugin悲觀鎖實(shí)現(xiàn)示例
本文將從悲觀鎖為例,讓你快速了解如何實(shí)現(xiàn)Mybatis Generator Plugin。文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09SpringBoot實(shí)現(xiàn)redis延遲隊(duì)列的示例代碼
延時(shí)隊(duì)列場(chǎng)景在我們?nèi)粘I(yè)務(wù)開(kāi)發(fā)中經(jīng)常遇到,它是一種特殊類型的消息隊(duì)列,本文就來(lái)介紹一下SpringBoot實(shí)現(xiàn)redis延遲隊(duì)列的示例代碼,具有一定的參考價(jià)值,感興趣的可以了解一下2024-02-02java:程序包javafx.geometry不存在問(wèn)題及解決
這篇文章主要介紹了java:程序包javafx.geometry不存在問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08淺談SpringCloud feign的http請(qǐng)求組件優(yōu)化方案
這篇文章主要介紹了淺談SpringCloud feign的http請(qǐng)求組件優(yōu)化方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-02-02Java?Elastic-Job分布式定時(shí)任務(wù)使用方法介紹
xxl-job?通過(guò)一個(gè)中心式的調(diào)度平臺(tái),調(diào)度多個(gè)執(zhí)行器執(zhí)行任務(wù),調(diào)度中心通過(guò)?DB?鎖保證集群分布式調(diào)度的一致性,這樣擴(kuò)展執(zhí)行器會(huì)增大?DB?的壓力,然而大部分公司的任務(wù)數(shù),執(zhí)行器并不多;xxl-job?提供了非常好用的監(jiān)控頁(yè)面甚至還有任務(wù)失敗的郵件告警功能2023-01-01