java基礎(chǔ)之String知識(shí)總結(jié)
一、概念
String代表字符串,java語言中所有雙引號(hào)的字符串都是String的對(duì)象,不管是否是new出來的對(duì)象。
二、特點(diǎn)
1.String類由于被final修飾,因此其不能被繼承,注意一下哈,我開始也以為字符串不能夠改變是因?yàn)槠浔籪inal修飾,事實(shí)上并不是這樣,String底層是用char數(shù)組保存,它被final修飾只是不能夠改變地址指向,但是其內(nèi)容是可以改變的。因此字符串不能改變和其是否被final修飾沒有關(guān)系。
2.字符串由于不能被改變,因此其能共享使用。
3.字符串底層使用char[]數(shù)組存儲(chǔ)。
三、三種構(gòu)造方式:
1.public String():創(chuàng)建空字符串對(duì)象
2.public String(char[] array):使用char數(shù)組創(chuàng)建字符串
3.public String(byte[] array):使用byte數(shù)組創(chuàng)建字符串,這種方式將對(duì)應(yīng)數(shù)字按照ASCII碼轉(zhuǎn)成字符,如97代表字符a
一種直接創(chuàng)建:String str = “abc”
四、字符串常量池
在jdk1.6及之前,字符串常量池是在方法區(qū)內(nèi),jdk1.7及之后字符串常量池從方法區(qū)分離出來,存儲(chǔ)在堆中。
jdk1.6和jdk1.7的相同點(diǎn):
1.用雙引號(hào)創(chuàng)建字符串在JVM運(yùn)行時(shí)都直接在字符串常量池中創(chuàng)建字符串對(duì)象,但是不會(huì)在堆中創(chuàng)建對(duì)象;
2.new一個(gè)字符串對(duì)象(String s = new String(“abc”)),這里面涉及兩個(gè)對(duì)象的創(chuàng)建,一個(gè)是堆對(duì)象,一個(gè)是字符串常量池中的對(duì)象(“abc”是用雙引號(hào)的),如果字符串常量池存在與該字符串相同的對(duì)象(這里是指內(nèi)容相同,而不是地址)則只需要?jiǎng)?chuàng)建一個(gè)堆對(duì)象,如果字符串常量池沒有相同的對(duì)象,那么需要在字符串常量池和堆內(nèi)都要?jiǎng)?chuàng)建對(duì)象,注意一點(diǎn):這兩個(gè)對(duì)象之間不存在引用,即其中一個(gè)對(duì)象保存的值是另一個(gè)對(duì)象的地址。
String test1 = "test"; String test3 = "test"; String test2 = new String("test"); System.out.println(test1 == test2);//false System.out.println(test1 == test3);//true
第一個(gè)輸出是false是因?yàn)閠est1是字符串常量池中的對(duì)象,而test2是堆中的對(duì)象,因此他們的地址是不相等,故結(jié)果是false;第二個(gè)輸出為true是因?yàn)楫?dāng)用雙引號(hào)創(chuàng)建字符串時(shí),首先會(huì)去字符串常量池中查找是否存在值相同得到對(duì)象,如果存在就直接返回引用地址,如果不存在才創(chuàng)建對(duì)象,因此test1和test3指向的是同一個(gè)地址。
jdk1.6和jdk1.7的不同點(diǎn):
jdk1.6的字符創(chuàng)常量池存儲(chǔ)是對(duì)象,jdk1.7字符常量池中既可以存儲(chǔ)對(duì)象,又可以存儲(chǔ)對(duì)象的引用。
還需要明確一點(diǎn):
使用引號(hào)包含文本的方式創(chuàng)建的String對(duì)象之間使用“+”連接產(chǎn)生的新對(duì)象才會(huì)被加入字符串池中,對(duì)于所有包含new方式新建對(duì)象(包括null)的“+”連接表達(dá)式,它所產(chǎn)生的新對(duì)象都不會(huì)被加入字符串池中
String s6 = new String("go") +new String("od"); String s7 = s6.intern(); String s8 = "good"; System.out.println(s6 == s7);//true System.out.println(s7 == s8);//true System.out.println(s6 == s8);//true
右上面的介紹可知,s6指向的是堆中字符串good對(duì)象的地址,且這個(gè)對(duì)象沒有在字符串常量池中被創(chuàng)建,當(dāng)執(zhí)行到 String s7 = s6.intern();時(shí)由于字符創(chuàng)常量池沒有這個(gè)對(duì)象,且堆中存在該對(duì)象,因此在字符串常量池中創(chuàng)建一個(gè)引用指向堆中的對(duì)象,所以s6和s7指向同一個(gè)對(duì)象,如果是jdk1.6,會(huì)直接在字符串常量池創(chuàng)建一個(gè)對(duì)象然后返回這個(gè)對(duì)象的引用,此時(shí)s6和s7指向的是不同的對(duì)象。
String s2 = new String("lo") + new String("ng"); String s3 = s2.intern(); System.out.println(s2 == s3);//false
這里按照上面的分析應(yīng)該返回true,但是這里返回false,原因如下:
到此這篇關(guān)于java基礎(chǔ)之String知識(shí)總結(jié)的文章就介紹到這了,更多相關(guān)Java String內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java BeanMap實(shí)現(xiàn)Bean與Map的相互轉(zhuǎn)換
這篇文章主要介紹了利用BeanMap進(jìn)行對(duì)象與Map的相互轉(zhuǎn)換,通過net.sf.cglib.beans.BeanMap類中的方法來轉(zhuǎn)換,效率極高,本文給大家分享實(shí)現(xiàn)代碼,感興趣的朋友一起看看吧2022-11-11idea配置連接數(shù)據(jù)庫的超詳細(xì)步驟
這篇文章主要介紹了idea配置連接數(shù)據(jù)庫的超詳細(xì)步驟,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12Druid基本配置及內(nèi)置監(jiān)控使用_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了Druid基本配置及內(nèi)置監(jiān)控使用,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-08-08java中基本數(shù)據(jù)類型與Object的關(guān)系說明
這篇文章主要介紹了java基本數(shù)據(jù)類型與Object的關(guān)系說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03Java替換中使用正則表達(dá)式實(shí)現(xiàn)中間模糊匹配的方法
今天小編就為大家分享一篇Java替換中使用正則表達(dá)式實(shí)現(xiàn)中間模糊匹配的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-07-07idea 多模塊項(xiàng)目依賴父工程class找不到問題的方法
這篇文章主要介紹了idea 多模塊項(xiàng)目依賴父工程class找不到問題的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-01-01java 中的static關(guān)鍵字和final關(guān)鍵字的不同之處
java 中的static關(guān)鍵字和final關(guān)鍵字的不同之處,需要的朋友可以參考一下2013-03-03