国产成人精品18p,天天干成人网,无码专区狠狠躁天天躁,美女脱精光隐私扒开免费观看

java基礎之String知識總結

發(fā)布時(shí)間:2021-07-05 18:40 來(lái)源:腳本之家 閱讀:0 作者:F13253524870 欄目: 開(kāi)發(fā)技術(shù) 歡迎投稿:712375056

目錄

一、概念

String代表字符串,java語(yǔ)言中所有雙引號的字符串都是String的對象,不管是否是new出來(lái)的對象。

二、特點(diǎn)

1.String類(lèi)由于被final修飾,因此其不能被繼承,注意一下哈,我開(kāi)始也以為字符串不能夠改變是因為其被final修飾,事實(shí)上并不是這樣,String底層是用char數組保存,它被final修飾只是不能夠改變地址指向,但是其內容是可以改變的。因此字符串不能改變和其是否被final修飾沒(méi)有關(guān)系。

2.字符串由于不能被改變,因此其能共享使用。

3.字符串底層使用char[]數組存儲。

三、三種構造方式:

1.public String():創(chuàng )建空字符串對象

2.public String(char[] array):使用char數組創(chuàng )建字符串

3.public String(byte[] array):使用byte數組創(chuàng )建字符串,這種方式將對應數字按照ASCII碼轉成字符,如97代表字符a
一種直接創(chuàng )建:String str = “abc”

四、字符串常量池

在jdk1.6及之前,字符串常量池是在方法區內,jdk1.7及之后字符串常量池從方法區分離出來(lái),存儲在堆中。

jdk1.6和jdk1.7的相同點(diǎn):

1.用雙引號創(chuàng )建字符串在JVM運行時(shí)都直接在字符串常量池中創(chuàng )建字符串對象,但是不會(huì )在堆中創(chuàng )建對象;

2.new一個(gè)字符串對象(String s = new String(“abc”)),這里面涉及兩個(gè)對象的創(chuàng )建,一個(gè)是堆對象,一個(gè)是字符串常量池中的對象(“abc”是用雙引號的),如果字符串常量池存在與該字符串相同的對象(這里是指內容相同,而不是地址)則只需要創(chuàng )建一個(gè)堆對象,如果字符串常量池沒(méi)有相同的對象,那么需要在字符串常量池和堆內都要創(chuàng )建對象,注意一點(diǎn):這兩個(gè)對象之間不存在引用,即其中一個(gè)對象保存的值是另一個(gè)對象的地址。

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是因為test1是字符串常量池中的對象,而test2是堆中的對象,因此他們的地址是不相等,故結果是false;第二個(gè)輸出為true是因為當用雙引號創(chuàng )建字符串時(shí),首先會(huì )去字符串常量池中查找是否存在值相同得到對象,如果存在就直接返回引用地址,如果不存在才創(chuàng )建對象,因此test1和test3指向的是同一個(gè)地址。

jdk1.6和jdk1.7的不同點(diǎn):

jdk1.6的字符創(chuàng )常量池存儲是對象,jdk1.7字符常量池中既可以存儲對象,又可以存儲對象的引用。

還需要明確一點(diǎn):
使用引號包含文本的方式創(chuàng )建的String對象之間使用“+”連接產(chǎn)生的新對象才會(huì )被加入字符串池中,對于所有包含new方式新建對象(包括null)的“+”連接表達式,它所產(chǎn)生的新對象都不會(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對象的地址,且這個(gè)對象沒(méi)有在字符串常量池中被創(chuàng )建,當執行到 String s7 = s6.intern();時(shí)由于字符創(chuàng )常量池沒(méi)有這個(gè)對象,且堆中存在該對象,因此在字符串常量池中創(chuàng )建一個(gè)引用指向堆中的對象,所以s6和s7指向同一個(gè)對象,如果是jdk1.6,會(huì )直接在字符串常量池創(chuàng )建一個(gè)對象然后返回這個(gè)對象的引用,此時(shí)s6和s7指向的是不同的對象。

 String s2 = new String("lo") + new String("ng");
        String s3 =  s2.intern();
        System.out.println(s2 == s3);//false

這里按照上面的分析應該返回true,但是這里返回false,原因如下:

到此這篇關(guān)于java基礎之String知識總結的文章就介紹到這了,更多相關(guān)Java String內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。

国产69囗曝吞精在线视频| 婷婷五月俺也去人妻| 亚洲VA中文字幕无码一区| 人妻系列影片无码专区| 久久久久亚洲AV无码专区导航| 久亚洲一线产区二线产区三线产区|