Java String類的性質(zhì)與比較
1.什么是String?
首先,初學(xué)者一定要知道String是一個(gè)類,它是字符串類型,但它不屬于基本數(shù)據(jù)類。 所謂字符串類型,意思就好比將字符(也就是char類型)像烤串一樣串起來(lái),列如' a '和' b '拼接起來(lái)變成"ab"(注意字符串使用雙引號(hào))。' a '和' b'是字符類型也就是char類型,而" ab"則是一個(gè)字符串類型。ps:字符串可以為中文
當(dāng)然以上只是口頭描述,具體的解釋還是看jdk文檔
2.String類的構(gòu)造方法
學(xué)習(xí)一個(gè)類首先需要學(xué)習(xí)它的構(gòu)造方法,掌握了它的所有實(shí)例化方式才能更好的使用它,以下是jdk文檔對(duì)String類構(gòu)造方法的總結(jié)。(ps:jdk文檔對(duì)我們的學(xué)習(xí)具有很大幫助,里面記錄了java所有的包和接口,可以去網(wǎng)上下載一個(gè)中文版的)
通過(guò)jdk文檔中我們可以看出String類的構(gòu)造方法很多,但是我們只要掌握常用的二種即可
1.public String(char[] value)
public String(char[] value)
通過(guò)傳入一個(gè)char[]構(gòu)建一個(gè)String對(duì)象,會(huì)將char[]內(nèi)的數(shù)據(jù)挨個(gè)拼接成一個(gè)字符串。在寫(xiě)代碼的過(guò)程中經(jīng)常會(huì)涉及到char與String的轉(zhuǎn)換,所以該方法需要熟記
下面為代碼演示
public class myString { public static void main(String[] args) { char[] arr={'a','b','c','d'}; String string = new String(arr); System.out.println(string);//abcd } }
2.public String(char[] value, int offset, int count)
public String(char[] value,int offset,int count)
第二種構(gòu)造方法是在第一種的基礎(chǔ)上多了兩個(gè)變量,其中offset是初始的偏移量,count是我們需要復(fù)制的長(zhǎng)度,就是在數(shù)組value上選取一部分成為String對(duì)象。該方法在某些情況下會(huì)使用到,需要記住
下面為代碼演示
public class myString { public static void main(String[] args) { char[] arr={'a','b','c','d','e','f'}; String string = new String(arr,1,4); System.out.println(string);//bcde //offect為開(kāi)始復(fù)制的下標(biāo),count為復(fù)制的長(zhǎng)度 } }
byte類型的數(shù)組轉(zhuǎn)化為String其實(shí)也同理與char,這里也不過(guò)多敘述,我們使用String時(shí)通常是像常用數(shù)據(jù)類型一樣直接使用給它賦值,學(xué)好String最主要還是學(xué)好它的性質(zhì)。
3.String類的性質(zhì)
jdk文檔中可以很清楚的看見(jiàn)在String類的聲明中它被finaly修飾,所以它具有不可變性。
但是這個(gè)不可變性怎么理解呢?
public class myString { public static void main(String[] args) { int b=100; System.out.println(b);//100 b=10; System.out.println(b);//10 String a="aaaa"; System.out.println(a);//aaaa a="bbbb"; System.out.println(a);bbbb } }
有人看到這段代碼打印結(jié)果就會(huì)發(fā)出疑問(wèn),a的值不一樣和b變化了嗎?
但這里我們要搞清楚一個(gè)誤區(qū):a只是一個(gè)String對(duì)象的引用,它保存的是這個(gè)String對(duì)象的地址,并不是String本身,我們通過(guò)訪問(wèn)a去訪問(wèn)到String對(duì)象實(shí)際的內(nèi)容
我們通過(guò)一個(gè)圖來(lái)了解
修改后:
對(duì)圖解析:我們可以發(fā)現(xiàn)我們將對(duì)a賦值"bbbb"時(shí),原來(lái)的字符串常量池中的aaaa并未改變,而是在字符串常量池中重新產(chǎn)生了一個(gè)新的String對(duì)象"bbbb",并讓a指向它。所以我們說(shuō)的不可變性是指String對(duì)象的內(nèi)容一旦確定是無(wú)法更改的。這需要我們時(shí)刻記住
通過(guò)String類的不可變性,就產(chǎn)生了String的最大考點(diǎn)。
4.String之間的相互比較
String類是非常重要且常見(jiàn)的類,我們使用的場(chǎng)景非常多,對(duì)String類之間是否相等的比較情況場(chǎng)景非常多見(jiàn),掌握比較String比較的能力必不可少。
1.
public class myString { public static void main(String[] args) { String a1=new String("AAAA"); String a2=new String("BBBB"); System.out.println(a1==a2);//false System.out.println(a2.equals(a2));//true } }
解析:雖然a1與a2指向的對(duì)象內(nèi)容相同,但地址不同,兩者指向的不是同一個(gè)對(duì)象,==比較的是地址,而equals比較的是內(nèi)容
2.
public class myString { public static void main(String[] args) { String a1=new String("AAAA"); String a2=a1; System.out.println(a1==a2);//true System.out.println(a2.equals(a2));//true } } public static void main(String[] args) { String a1=new String("AAAA"); String a2=new String(a1); System.out.println(a1==a2);//false System.out.println(a2.equals(a2));//true } }
解析:這里將String當(dāng)做基本類型使用,上面將a1賦值給a2的操作,可以理解為a1的地址賦值給a2,所以a1與a2存放的都是"AAAA"的地址。而下面的代碼將a1作為參數(shù)給a2,會(huì)重新開(kāi)辟一片內(nèi)存空間給a2,使其內(nèi)容與a1一致,但地址不一樣。
3、
public class myString { public static void main(String[] args) { String a1="aaaa"; String a2="aaaa"; System.out.println(a1==a2);//true System.out.println(a2.equals(a2));//true } }
解析:當(dāng)做基本數(shù)據(jù)類型使用的String對(duì)象會(huì)保留在字符串常量池中,每一次這樣使用時(shí)jvm會(huì)檢索常量池是否已經(jīng)存在,如果已經(jīng)存在將不會(huì)再創(chuàng)建,而是讓新的引用再次指向已經(jīng)存在的String對(duì)象
總結(jié):對(duì)于String類的比較我們需要使用equals,因?yàn)閑quals單單只考慮字符串的內(nèi)容,而==還需要考慮地址
到此這篇關(guān)于Java String類的性質(zhì)與比較的文章就介紹到這了,更多相關(guān)Java String內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java中String類的常用方法總結(jié)
- Java?String類的理解及字符串常量池介紹
- Java中String類常用方法總結(jié)詳解
- Java基礎(chǔ)之String類使用與字符串比較
- Java中String類常用方法使用詳解
- 帶你一文深入認(rèn)識(shí)Java?String類
- Java String類常用方法梳理總結(jié)
- Java深入淺出講解String類常見(jiàn)方法
- Java詳細(xì)分析String類與StringBuffer和StringBuilder的使用方法
- Java?String類和StringBuffer類的區(qū)別介紹
- Java全面解析string類型的xml字符串
- Java中String類常用類型實(shí)例總結(jié)
- 深入剖析Java中String類的concat方法
- 詳解Java中String類的各種用法
- 一文帶你初識(shí)java中的String類
- 關(guān)于Java中String類字符串的解析
- Java String類字符串的理解與認(rèn)知
- Java-String類最全匯總(上篇)
相關(guān)文章
Java實(shí)現(xiàn)XML與JSON秒級(jí)轉(zhuǎn)換示例詳解
這篇文章主要為大家介紹了Java實(shí)現(xiàn)XML與JSON秒級(jí)轉(zhuǎn)換示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09java使用FFmpeg合成視頻和音頻并獲取視頻中的音頻等操作(實(shí)例代碼詳解)
這篇文章主要介紹了java使用FFmpeg合成視頻和音頻并獲取視頻中的音頻等操作,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-02-02Mybatisplus創(chuàng)建Spring?Boot工程打包錯(cuò)誤的解決方式
最近在實(shí)戰(zhàn)springboot遇到了一些坑,記錄一下,下面這篇文章主要給大家介紹了關(guān)于Mybatisplus創(chuàng)建Spring?Boot工程打包錯(cuò)誤的解決方式,文中通過(guò)圖文介紹的介紹的非常詳細(xì),需要的朋友可以參考下2023-03-03SpringBoot定時(shí)監(jiān)聽(tīng)RocketMQ的NameServer問(wèn)題及解決方案
這篇文章主要介紹了SpringBoot定時(shí)監(jiān)聽(tīng)RocketMQ的NameServer問(wèn)題及解決方案,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2023-12-12Java的DelayQueue延遲隊(duì)列簡(jiǎn)單使用代碼實(shí)例
這篇文章主要介紹了Java的DelayQueue延遲隊(duì)列簡(jiǎn)單使用代碼實(shí)例,DelayQueue是一個(gè)延遲隊(duì)列,插入隊(duì)列的數(shù)據(jù)只有達(dá)到設(shè)置的延遲時(shí)間時(shí)才能被取出,否則線程會(huì)被阻塞,插入隊(duì)列的對(duì)象必須實(shí)現(xiàn)Delayed接口,需要的朋友可以參考下2023-12-12eclipse創(chuàng)建java項(xiàng)目并運(yùn)行的詳細(xì)教程講解
eclipse是java開(kāi)發(fā)的ide工具,是大部分java開(kāi)發(fā)人員的首選開(kāi)發(fā)工具,可是對(duì)于一些新Java人員來(lái)說(shuō),不清楚eclipse怎么運(yùn)行項(xiàng)目?這篇文章主要給大家介紹了關(guān)于eclipse創(chuàng)建java項(xiàng)目并運(yùn)行的相關(guān)資料,需要的朋友可以參考下2023-04-04springboot + mybatis配置多數(shù)據(jù)源示例
本篇文章主要介紹了springboot + mybatis配置多數(shù)據(jù)源示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-03-03