這篇文章主要介紹“Java數(shù)據(jù)結(jié)構(gòu)之字符串怎么用”,在日常操作中,相信很多人在Java數(shù)據(jù)結(jié)構(gòu)之字符串怎么用問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Java數(shù)據(jù)結(jié)構(gòu)之字符串怎么用”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!
創(chuàng)新互聯(lián)是專業(yè)的那坡網(wǎng)站建設(shè)公司,那坡接單;提供成都網(wǎng)站設(shè)計、成都做網(wǎng)站,網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進行那坡網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團隊,希望更多企業(yè)前來合作!
串(string)是由零個或多個字符組成的有限序列,又名字符串。
我們可以從這段段基本概念中知道:
零個或多個字符組成:說明字符串的內(nèi)部元素類型為字符。
有限:說明字符串的內(nèi)容長度是有一定限制的,小于一個最大范圍,但是在該范圍內(nèi),實際的長度是不確定的。
序列:說明字符串中的相鄰字符存在前驅(qū)和后繼的關(guān)系。
在Java中沒有內(nèi)置的字符串類型,每個用雙引號括起來的字符串都是Java中String類的一個實例。
也就是說Java中String并不是數(shù)據(jù)類型,在Java中所有的字符串都是String的實例化對象。
Java中的String
Java中的String類代表字符串,Java 程序中的所有字符串文字(例如“abc”)都為此類的實例。
也就是說,Java程序中所有的雙引號字符串,都是 String 類的對象。String 類在 java.lang 包下,所以使用的時候不需要導(dǎo)包!
在Java中String最重要的特點就是:
String 類是不可改變的,所以你一旦創(chuàng)建了 String 對象,那它的值就無法改變了。我們將這種特性稱為String的不可變性。
字符串的不可變性
不可變性:當(dāng)你給一個字符串重新賦值之后,老值并沒有在內(nèi)存中銷毀,而是重新開辟一塊空間存儲新值。
也就是說一旦一個String對象在內(nèi)存中創(chuàng)建,它將是不可改變的,所有的String類中方法并不是改變String對象自己,而是重新創(chuàng)建一個新的String對象
。
例如:
String s="dcm";String s="ddccmm"
當(dāng)s的值發(fā)生改變之后,ddccmm這個值并沒有覆蓋dcm,只是重新開發(fā)了一個新的空間去儲存ddccmm然后將s指向它。
如果我們在實際開發(fā)中對很含有大量字符的字符串進行遍歷賦值修改,會對內(nèi)存中產(chǎn)生很多無法釋放的字符串對象,造成內(nèi)存垃圾。
正因為String對象的不可變性,如果需要對字符串進行大量的修改、添加字符、刪除字符等操作盡量不要使用String對象,因為這樣會頻繁的創(chuàng)建新的對象導(dǎo)致程序的執(zhí)行效率下降。
這時我們可以使用Java中另外一個字符串類StringBuilder。
我們在做題的時候關(guān)于字符串一般用的都是String類,但是考慮到我們有時候也會用到StringBuilder類這里我就對StringBuilder類進行稍微細致一點的講解。
StringBuilder
是一個可變的字符串類,我們可以把它看成是一個容器,這里的可變指StringBuilde
r對象中的內(nèi)容是可變的。
2.1 StringBuilder類常用的方法
可以看出來,構(gòu)建一個StringBuilder
的對象只能使用它的構(gòu)造方法來構(gòu)造,不像String
一樣可以直接String s= "123"
來創(chuàng)建
因為StringBuilder
類對象是可變的,所以當(dāng)我們對一個字符串需要進行改變比較多的時候一般定義為StringBuilder
類。
2.2 String和StringBuilder的區(qū)別
String
對象是不可改變的。每次使用String
類中的方法之一時,都要在內(nèi)存中創(chuàng)建一個新的字符串對象,這就需要為該新對象分配新的空間。
StringBuilder
對象是動態(tài)對象,允許擴充它所封裝的字符串中字符的數(shù)量,但是您可以為它可容納的最大字符數(shù)指定一個值,當(dāng)修改 StringBuilder
時,在達到容量之前,它不會為其自己重新分配空間。當(dāng)達到容量時,將自動分配新的空間且容量翻倍。也就是說當(dāng)對字符串進行改變時,都是對當(dāng)前對象的狀態(tài)進行更新的。
可以使用重載的構(gòu)造函數(shù)之一來指定 StringBuilder
類的容量。
2.3 String類與StringBuilder類的相互轉(zhuǎn)換
String類轉(zhuǎn)換為StringBuilder類
public class String{ public static void main(String[] args){ String s = "baibai"; StringBuilder s1 = new StringBuilder(s); System.out.println(s1); }}
StringBuilder類轉(zhuǎn)換為String類
public class String { public static void main(String[] args){ StringBuilder s1 = new StringBuilder(); //連續(xù)連接 s1.append("abc").append("efg"); String s = s1.toString(); System.out.println(s); }}
3.1初始化String對象的兩種方法:
//方法一:直接創(chuàng)建 String s1= "大聰明 超牛的"; //方法二:對象創(chuàng)建 String s2 = new String("大聰明 超牛的"); String s3 = new String();//也可以創(chuàng)建一個空串
雖然兩種方法看起來是一樣的但是本質(zhì)上是不一樣的。
String 創(chuàng)建的字符串存儲在公共池中,而 new 創(chuàng)建的字符串對象在堆上。那存放在公共池(常量池)與堆中有什么不一樣嗎?
我們來舉個例子:
String s1 = "大聰明 超牛的"; // String 直接創(chuàng)建 String s2 = "大聰明 超牛的"; // String 直接創(chuàng)建 String s3 = s1; // 相同引用 String s4 = new String("大聰明 超牛的"); // String 對象創(chuàng)建 String s5 = new String("大聰明 超牛的"); // String 對象創(chuàng)建 System.out.println(System.identityHashCode(s1)); System.out.println(System.identityHashCode(s2)); System.out.println(System.identityHashCode(s3)); System.out.println(System.identityHashCode(s4)); System.out.println(System.identityHashCode(s5));
輸出:
可見前三個字符串的地址相同,后兩個各不相同!
這是因為直接創(chuàng)建的字符串時,會先在公共池中找有沒有這樣的字符串,如果有那就將引用直接指向它,而不去開發(fā)新的空間。在這里s1,s2,s3這三個引用指向了公共池中的同一塊內(nèi)存。
對象創(chuàng)建時,每次都會在堆上開新的空間來存放字符串,也就是說s4,s5分別指向在堆上的兩塊不同的內(nèi)存,只不過這兩塊內(nèi)存里面都儲存著相同的東西。
這里再次強調(diào)一下,我們在做題的時候遇到關(guān)于字符串相關(guān)題目我們幾乎都是使用String類來解決問題,除了在字符串進行大量更改時我們可能會暫時用到StringBuilder類。
這里的暫時就是我們在對字符串更改等操作之后一般還是要把字符串轉(zhuǎn)換為String類的。
所以我們要學(xué)習(xí)的API主要還是String類的API。對應(yīng)刷題我StringBuilder的API我們只需要學(xué)習(xí)上面提到的兩個就夠了。
String 類在 java.lang 包下,所以使用的時候不需要導(dǎo)包!
4.1 基本數(shù)據(jù)類型轉(zhuǎn)換成字符串
有三種辦法:
(1)基本類型數(shù)據(jù)的值+“” (最常用,最簡單);
(2)使用包裝類中的靜態(tài)方法static String toString(int i)
返回一個表示指定整數(shù)的String 對象。如:在Integer中:Integer.toString(6)
;
(3)使用String類中的靜態(tài)方法static String valueOf(int i)
返回int 參數(shù)的字符串表示形式。如:String.valueOf(6)
;
String 類別中已經(jīng)提供了將基本數(shù)據(jù)型態(tài)轉(zhuǎn)換成String 的 static 方法也就是 String.valueOf() 這個參數(shù)多載的方法 :
String.valueOf(boolean b) //將 boolean 變量 b 轉(zhuǎn)換成字符串 String.valueOf(char c) //將 char 變量 c 轉(zhuǎn)換成字符串 String.valueOf(char[] data) //將 char 數(shù)組 data 轉(zhuǎn)換成字符串 String.valueOf(char[] data, int offset, int count) //將char數(shù)組data中由data[offset]開始取 count個元素轉(zhuǎn)換成字符串 String.valueOf(double d) //將 double 變量 d 轉(zhuǎn)換成字符串 String.valueOf(float f) //將 float 變量 f 轉(zhuǎn)換成字符串 String.valueOf(int i) //將 int 變量 i 轉(zhuǎn)換成字符串 String.valueOf(long l) //將 long 變量 l 轉(zhuǎn)換成字符串 String.valueOf(Object obj) //將 obj 對象轉(zhuǎn)換成 字符串, 等于 obj.toString()
因為是靜態(tài)方法所以不需要實例化。
4.2 字符串轉(zhuǎn)換為基本數(shù)據(jù)類型
一般使用包裝類的靜態(tài)方法
parseXX("字符串")
要將 String 轉(zhuǎn)換成基本數(shù)據(jù)類型大多需要使用基本數(shù)據(jù)型態(tài)的包裝類別,如:String 轉(zhuǎn)換成 byte可以使用 Byte.parseByte(String s)
Byte.parseByte(String s) //將 s 轉(zhuǎn)換成 byte Byte.parseByte(String s, int radix) //以 radix 為基底 將 s 轉(zhuǎn)換為 byte Double.parseDouble(String s) //將 s 轉(zhuǎn)換成 double Float.parseFloat(String s) //將 s 轉(zhuǎn)換成 float Integer.parseInt(String s) //將 s 轉(zhuǎn)換成 int Long.parseLong(String s) //將 s 轉(zhuǎn)換成 long
注意這里也是靜態(tài)方法,只不過都是對應(yīng)包裝類的靜態(tài)方法
4.3 使用length()
得到一個字符串的字符個數(shù)
int len = String.length();
4.4 使用toCharArray()
將一個字符串轉(zhuǎn)換成字符數(shù)組
Char[] arr = String.toCharArray();
4.5 判斷兩個字符串的內(nèi)容是否相等返回true/false
String1.equals(String2);//區(qū)分大小寫 String1.equalsIgnoreCase(String2);//不區(qū)分大小寫
4.6 與位置相關(guān)的字符串
charAt(int)//得到指定下標位置對應(yīng)的字符 indexOf(String)//得到指定內(nèi)容第一次出現(xiàn)的下標 lastIndexOf(String)//得到指定內(nèi)容最后一次出現(xiàn)的下標
4.7 將一個字符串按照指定內(nèi)容劈開split(String)
,返回字符串?dāng)?shù)組。
String s = "wa,dcm,nb!"; String[] str = s.split(",");//返回結(jié)果中str[1]=dcm
4.8 contains(String)
判斷一個字符串里面是否包含指定的內(nèi)容,返回true/false
Boolean a = String1.contains(String2)
4.9 使用substring()
截取字符串,返回子串
String.substring(int)//從指定下標開始一直截取到字符串的最后 String.substring(int,int)//從下標x截取到下標y-1對應(yīng)的元素
4.10 字符串大小寫轉(zhuǎn)換
String.toUpperCase() //將一個字符串全部轉(zhuǎn)換成大寫 String.toLowerCase()//將一個字符串全部轉(zhuǎn)換成小寫
4.11 使用replace()
進行字符串內(nèi)容替換
String.replace(String,String) //將某個內(nèi)容全部替換成指定內(nèi)容 String.replaceAll(String,String) //將某個內(nèi)容全部替換成指定內(nèi)容,支持正則 String.repalceFirst(String,String) //將第一次出現(xiàn)的某個內(nèi)容替換成指定的內(nèi)容
387. 字符串中的第一個唯一字符
題解:
把字符串的單個字符轉(zhuǎn)化為對應(yīng)數(shù)組下標,遍歷一遍字符串獲得26個字母分別出現(xiàn)幾次。然后在遍歷一遍字符串看哪個字符先出現(xiàn)次數(shù)為1,就輸出對應(yīng)下標。
class Solution { public int firstUniqChar(String s) { int len = s.length(); int[] vis = new int[26]; int temp = -1; for(int i = 0; i < len; i ++) { vis[s.charAt(i) - 'a'] ++; } for(int i = 0; i < len; i ++) { if(vis[s.charAt(i) - 'a'] == 1) { return i; } } return -1; }}
或者我們也可以把字符串先轉(zhuǎn)換為字符數(shù)組來解題,原理都是一樣的!
class Solution { public int firstUniqChar(String s) { int[] arr = new int[26]; char[] chars = s.toCharArray(); for (int i = 0; i < chars.length; i++) { arr[chars[i] - 'a']++; } for (int i = 0; i < chars.length; i++) { if (arr[chars[i] - 'a'] == 1) { return i; } } return -1; }}
到此,關(guān)于“Java數(shù)據(jù)結(jié)構(gòu)之字符串怎么用”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
新聞名稱:Java數(shù)據(jù)結(jié)構(gòu)之字符串怎么用
瀏覽路徑:http://chinadenli.net/article28/jsiocp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信小程序、網(wǎng)站收錄、網(wǎng)站建設(shè)、虛擬主機、定制網(wǎng)站、小程序開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)