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)容??捎梅椒ㄈ缦拢?/p>

代碼示例: 觀察字符串截取
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)文章
SpringBoot自動(dòng)裝配之Condition深入講解
@Conditional表示僅當(dāng)所有指定條件都匹配時(shí),組件才有資格注冊(cè)。該@Conditional注釋可以在以下任一方式使用:作為任何@Bean方法的方法級(jí)注釋、作為任何類的直接或間接注釋的類型級(jí)別注釋@Component,包括@Configuration類、作為元注釋,目的是組成自定義構(gòu)造型注釋2023-01-01
Java這個(gè)名字的來(lái)歷與優(yōu)勢(shì)
Java是Sun公司開(kāi)發(fā)的一種編程語(yǔ)言,Sun公司最初的方向是讓Java來(lái)開(kāi)發(fā)一些電器裝置程序,Java名字的由來(lái),實(shí)際上是一個(gè)有趣的故事。2014-10-10
淺談SpringMVC中的session用法及細(xì)節(jié)記錄
下面小編就為大家?guī)?lái)一篇淺談SpringMVC中的session用法及細(xì)節(jié)記錄。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05
Hadoop 使用IntelliJ IDEA 進(jìn)行遠(yuǎn)程調(diào)試代碼的配置方法
這篇文章主要介紹了Hadoop 使用IntelliJ IDEA 進(jìn)行遠(yuǎn)程調(diào)試代碼的配置方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04
springboot自動(dòng)配置沒(méi)有生效的問(wèn)題定位(條件斷點(diǎn))
這篇文章主要介紹了springboot自動(dòng)配置未生效問(wèn)題定位,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,下面我們來(lái)學(xué)習(xí)一下吧2019-06-06
關(guān)于spring.factories失效原因分析及解決
這篇文章主要介紹了關(guān)于spring.factories失效原因分析及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07

