Java-String類最全匯總(下篇)
字符, 字節(jié)與字符串
字符與字符串
字符串內(nèi)部包含一個字符數(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);//第一個參數(shù)是開始變得字符下標 第二個參數(shù)是要變的字符個數(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);//第一個參數(shù)是開始變得字符下標 第二個參數(shù)是要變的字符個數(shù)
System.out.println(str);
}
獲取指定位置的字符:
public static void main(String[] args) {
String str = "hello" ;
System.out.println(str.charAt(0)); // 下標從 0 開始
}
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指向的字符串對象變?yōu)樽址麛?shù)組
System.out.println(Arrays.toString(chars));
}
代碼示例: 給定字符串一個字符串, 判斷其是否全部由數(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);//第一個參數(shù)是開始變得字符下標 第二個參數(shù)是要變的字符個數(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);//第一個參數(shù)是開始變得字符下標 第二個參數(shù)是要變的字符個數(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é)
那么何時使用 byte[], 何時使用 char[] 呢?
- byte[] 是把 String 按照一個字節(jié)一個字節(jié)的方式處理, 這種適合在網(wǎng)絡傳輸, 數(shù)據(jù)存儲這樣的場景下使用. 更適合針對二進制數(shù)據(jù)來操作.
- char[] 是吧 String 按照一個字符一個字符的方式處理, 更適合針對文本數(shù)據(jù)來操作, 尤其是包含中文的時候.
回憶概念: 文本數(shù)據(jù) vs 二進制數(shù)據(jù)
一個簡單粗暴的區(qū)分方式就是用記事本打開能不能看懂里面的內(nèi)容.
如果看的懂, 就是文本數(shù)據(jù)(例如 .java 文件), 如果看不懂, 就是二進制數(shù)據(jù)(例如 .class 文件).
字符串常見操作
字符串比較
上面使用過String類提供的equals()方法,該方法本身是可以進行區(qū)分大小寫的相等判斷
。除了這個方法之外,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()方法是一個非常重要的方法,該方法返回一個整型,該數(shù)據(jù)會根據(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()是一個可以區(qū)分大小關(guān)系的方法,是String方法里是一個非常重要的方法。這里的返回值就是前面字符對應的數(shù)值減去后面的字符所對應的數(shù)值。

字符串的比較大小規(guī)則, 總結(jié)成三個字 “字典序” 相當于判定兩個字符串在一本詞典的前面還是后面. 先比較第一個字符的大小(根據(jù) unicode 的值來判定), 如果不分勝負, 就依次比較后面的內(nèi)容
字符串查找
從一個完整的字符串之中可以判斷指定內(nèi)容是否存在,對于查找方法有如下定義:

代碼示例: 字符串查找,最好用最方便的就是contains() ——(類似于C語言的strstr)
String str = "helloworld" ;
System.out.println(str.contains("world")); // true 該判斷形式是從JDK1.5之后開始追加的,在JDK1.5以前要想實現(xiàn)與之類似的功能,就必須借助、indexOf()方法完成。

代碼示例: 使用indexOf()方法進行位置查找(找到之后返回我們查找元素的第一個位置)
String str = "helloworld" ;
System.out.println(str.indexOf("world")); // 5,w開始的索引
System.out.println(str.indexOf("bit")); // -1,沒有查到
if (str.indexOf("hello") != -1) {
System.out.println("可以查到指定字符串!");
}現(xiàn)在基本都是用contains()方法完成。

使用indexOf()需要注意的是,如果內(nèi)容重復,它只能返回查找的第一個位置
代碼示例: 使用indexOf()的注意點
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
在進行查找的時候往往會判斷開頭或結(jié)尾。
代碼示例: 判斷開頭或結(jié)尾
String str = "**@@helloworld!!" ;
System.out.println(str.startsWith("**")); // true
System.out.println(str.startsWith("@@",2)); // ture
System.out.println(str.endsWith("!!")); // true
字符串替換
使用一個指定的新的字符串替換掉已有的字符串數(shù)據(jù),可用的方法如下:

代碼示例: 字符串的替換處理
String str = "helloworld" ;
System.out.println(str.replaceAll("l", "_"));
System.out.println(str.replaceFirst("l", "_"));注意事項: 由于字符串是不可變對象 , 替換不修改當前字符串, 而是產(chǎn)生一個新的字符串.

字符串拆分
可以將一個完整的字符串按照指定的分隔符劃分為若干個子字符串。
可用方法如下:

代碼示例: 實現(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);
}拆分是特別常用的操作. 一定要重點掌握. 另外有些特殊字符作為分割符可能無法正確切分, 需要加上轉(zhuǎn)義.

代碼示例: 拆分IP地址
String str = "192.168.1.1" ;
String[] result = str.split("\\.") ;
for(String s: result) {
System.out.println(s);
}
? 注意事項:
- 字符"|“,”*“,”+“,”.“都得加上轉(zhuǎn)義字符,前面加上”"
- .而如果是"“,那么就得寫成”\\".(\等于一個,而\本身又需要一個\來進行轉(zhuǎn)義)
- 如果一個字符串中有多個分隔符,可以用"|"作為連字符.代碼示例: 多次拆分
代碼示例: 多次拆分
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]);
}這種代碼在以后的開發(fā)之中會經(jīng)常出現(xiàn)

字符串截取
從一個完整的字符串之中截取出部分內(nèi)容。可用方法如下:

代碼示例: 觀察字符串截取
String str = "helloworld" ; System.out.println(str.substring(5));//從第5個字符位置的位置開始截取到結(jié)尾 System.out.println(str.substring(0, 5));//從0位置開始截取到第5位置的元素
注意事項:
- 索引從0開始
- 注意前閉后開區(qū)間(左閉右開)的寫法, substring(0, 5) 表示包含 0 號下標的字符, 不包含 5 號下標,所以下圖不包含’w’字符

其他操作方法

代碼示例: 觀察trim()方法的使用
String str = " hello world " ;
System.out.println("["+str+"]");
System.out.println("["+str.trim()+"]");trim 會去掉字符串開頭和結(jié)尾的空白字符(空格, 換行, 制表符等).

代碼示例: 大小寫轉(zhuǎn)換
String str = " hello%$$%@#$%world 哈哈哈 " ; System.out.println(str.toUpperCase()); System.out.println(str.toLowerCase());
這兩個函數(shù)只轉(zhuǎn)換字母。

代碼示例: 字符串length() —— 取得字符串長度
String str = " hello%$$%@#$%world 哈哈哈 " ; System.out.println(str.length());
注意:數(shù)組長度使用數(shù)組名稱.length屬性,而String中使用的是length()方法

代碼示例: 觀察isEmpty()方法 —— 判斷是否為空字符串(不是null,而是長度為0)
System.out.println("hello".isEmpty());
System.out.println("".isEmpty());
System.out.println(new String().isEmpty());String類并沒有提供首字母大寫操作,需要自己實現(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
首先來回顧下String類的特點:
任何的字符串常量都是String對象,而且String的常量一旦聲明不可改變,如果改變對象內(nèi)容,改變的是其引用的指向而已。
通常來講String的操作比較簡單,但是由于String的不可更改特性,為了方便字符串的修改,提供了其兩大類。
這兩大類大部分功能是相同的,我們主要介紹
StringBuffer
在String中使用"+"來進行字符串連接,但是這個操作在
StringBuffer
類中需要更改為append()方法:
public synchronized StringBuffer append(各種數(shù)據(jù)類型 b)
我們來看這類的繼承結(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é)
字符串操作是我們以后工作中非常常用的操作. 使用起來都非常簡單方便, 一定要使用熟練.
補充
1.什么是哈希表:數(shù)據(jù)結(jié)構(gòu)–>描述和組織數(shù)據(jù)的一種方式。
12 45 2 7 15 92
問題:如何去查找到一個關(guān)鍵字
1、順序查找:通過關(guān)鍵字的一個一個的比較,才能找到O(n)
2、排序+二分查找

哈希表時間效率非常高 效率可以高到O(1)。
2.數(shù)組的賦值 只有1次機會 就是在定義的時候
array不可以直接進行二次賦值,如下圖所示:

我們在new了一個新的array后,我們就可以對array進行二次賦值了

但是我們的數(shù)組array用了final修飾后就不可以改變了

若array被final修飾后,還想修改array的值,那我們便需要通過反射修改array
到此這篇關(guān)于Java-String類最全匯總(下篇)的文章就介紹到這了,其他的內(nèi)容(上篇)請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺談SpringMVC中的session用法及細節(jié)記錄
下面小編就為大家?guī)硪黄獪\談SpringMVC中的session用法及細節(jié)記錄。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-05-05
Hadoop 使用IntelliJ IDEA 進行遠程調(diào)試代碼的配置方法
這篇文章主要介紹了Hadoop 使用IntelliJ IDEA 進行遠程調(diào)試代碼的配置方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-04-04
關(guān)于spring.factories失效原因分析及解決
這篇文章主要介紹了關(guān)于spring.factories失效原因分析及解決,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07

