日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 人文社科 > 生活经验 >内容正文

生活经验

java string对象创建_String对象创建个数

發(fā)布時(shí)間:2023/11/27 生活经验 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java string对象创建_String对象创建个数 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

s = new String("xyz");創(chuàng)建了幾個(gè)String Object?兩個(gè)對(duì)象,一個(gè)是“xyx”,一個(gè)是指向“xyx”的引用對(duì)象s。

String s="你好";int i=3; s=i+s; 這個(gè)表達(dá)式對(duì)嗎?在java中會(huì)提示數(shù)據(jù)類型不匹配。因?yàn)閟tring是類!正確做法: s+="3" 或者 s+='3'或者 s+=(char)i;

我們要引入另外一種創(chuàng)建String對(duì)象的方式的討論——引號(hào)內(nèi)包含文本。這種方式是String特有的,并且它與new的方式存在很大區(qū)別。

在JAVA虛擬機(jī)(JVM)中存在著一個(gè)字符串池,其中保存著很多String對(duì)象,并且可以被共享使用,因此它提高了效率。String a="abc";,這行代碼被執(zhí)行的時(shí)候,JAVA虛擬機(jī)首先在字符串池中查找是否已經(jīng)存在了值為"abc"的這么一個(gè)對(duì)象,判斷依據(jù)是String類equals(Object obj)方法的返回值。如果有,則不再創(chuàng)建新的對(duì)象,直接返回已存在對(duì)象的引用;如果沒有,則先創(chuàng)建這個(gè)對(duì)象,然后把它加入到字符串池中,再將它的引用返回。

字符串對(duì)象的創(chuàng)建:由于字符串對(duì)象的大量使用[它是一個(gè)對(duì)象,一般而言對(duì)象總是在heap分配內(nèi)存],Java中為了節(jié)省內(nèi)存空間和運(yùn)行時(shí)間[如比較字符串時(shí),==比equals()快],在編譯階段就把所有的字符串文字放到一個(gè)文字池中,而運(yùn)行時(shí)文字池成為常量池的一部分。文字池的好處,就是該池中所有相同的字符串常量被合并,只占用一個(gè)空間。我們知道,對(duì)兩個(gè)引用變量,使用==判斷它們的值[引用]是否相等,即指向同一個(gè)對(duì)象:

現(xiàn)在看String s = new String("abc");語(yǔ)句,這里"abc"本身就是pool中的一個(gè)對(duì)象,而在運(yùn)行時(shí)執(zhí)行new String()時(shí),將pool中的對(duì)象復(fù)制一份放到heap中,并且把heap中的這個(gè)對(duì)象的引用交給s持有。ok,這條語(yǔ)句就創(chuàng)建了2個(gè)String對(duì)象。

String s1 = new String("abc") ;String s2 = new String("abc") ;if( s1 == s2 ){ //不會(huì)執(zhí)行的語(yǔ)句}

//創(chuàng)建了幾個(gè)String Object? [三個(gè),pool中一個(gè),heap中2個(gè)。]

只有使用引號(hào)包含文本的方式創(chuàng)建的String對(duì)象之間使用“+”連接產(chǎn)生的新對(duì)象才會(huì)被加入字符串池中。對(duì)于所有包含new方式新建對(duì)象(包括null)的“+”連接表達(dá)式,它所產(chǎn)生的新對(duì)象都不會(huì)被加入字符串池中。

1.==表示引用自同一對(duì)象,equals()表示值相等。

String str1 = "abc";引用的對(duì)象在棧(或者叫String池)中。

String str1 =new String ("abc"); 引用的對(duì)象在內(nèi)存/堆中。

2.String str1 =??"string";在棧中

String str3 =??"str";在棧中

String str4 = "ing";在棧中

String str2 = str3+str4; 在堆中,因?yàn)?#43;號(hào)的作用是返回另外一個(gè)新建的String對(duì)象,而不是在棧中找string這個(gè)值。如果是String str2 = "str"+"ing";那最后的結(jié)果就在棧中。str1==str2為true。

但是有一種情況需要引起我們的注意。請(qǐng)看下面的代碼:

public class StringStaticTest {

public static final String A = "ab"; // 常量A

public static final String B = "cd"; // 常量B

public static void main(String[] args) {

String s = A + B;??// 將兩個(gè)常量用+連接對(duì)s進(jìn)行初始化

String t = "abcd";

if (s == t) {

System.out.println("s等于t,它們是同一個(gè)對(duì)象");

} else {

System.out.println("s不等于t,它們不是同一個(gè)對(duì)象");

}

}

}

這段代碼的運(yùn)行結(jié)果如下:

s等于t,它們是同一個(gè)對(duì)象

原因是在上面的例子中,A和B都是常量,值是固定的,因此s的值也是固定的,它在類被編譯時(shí)就已經(jīng)確定了。也就是說(shuō):String s=A+B;??等同于:String s="ab"+"cd";

我對(duì)上面的例子稍加改變看看會(huì)出現(xiàn)什么情況:

public class StringStaticTest {

public static final String A; // 常量A

public static final String B;????// 常量B

static {

A = "ab";

B = "cd";

}

public static void main(String[] args) {

// 將兩個(gè)常量用+連接對(duì)s進(jìn)行初始化

String s = A + B;

String t = "abcd";

if (s == t) {

System.out.println("s等于t,它們是同一個(gè)對(duì)象");

} else {

System.out.println("s不等于t,它們不是同一個(gè)對(duì)象");

}

}

}

它的運(yùn)行結(jié)果是這樣:

s不等于t,它們不是同一個(gè)對(duì)象

只是做了一點(diǎn)改動(dòng),結(jié)果就和剛剛的例子恰好相反。我們?cè)賮?lái)分析一下。A和B雖然被定義為常量(只能被賦值一次),但是它們都沒有馬上被賦值。在運(yùn)算出s的值之前,他們何時(shí)被賦值,以及被賦予什么樣的值,都是個(gè)變數(shù)。因此A和B在被賦值之前,性質(zhì)類似于一個(gè)變量。那么s就不能在編譯期被確定,而只能在運(yùn)行時(shí)被創(chuàng)建了。

最后我們?cè)賮?lái)說(shuō)說(shuō)String對(duì)象在JAVA虛擬機(jī)(JVM)中的存儲(chǔ),以及字符串池與堆(heap)和棧(stack)的關(guān)系。我們首先回顧一下堆和棧的區(qū)別:

棧(stack):主要保存基本類型(或者叫內(nèi)置類型)(char、byte、short、int、long、float、double、boolean)和對(duì)象的引用,數(shù)據(jù)可以共享,速度僅次于寄存器(register),快于堆。

堆(heap):用于存儲(chǔ)對(duì)象。

我們查看String類的源碼就會(huì)發(fā)現(xiàn),它有一個(gè)value屬性,保存著String對(duì)象的值,類型是char[],這也正說(shuō)明了字符串就是字符的序列。當(dāng)執(zhí)行String a="abc";時(shí),JAVA虛擬機(jī)會(huì)在棧中創(chuàng)建三個(gè)char型的值'a'、'b'和'c',然后在堆中創(chuàng)建一個(gè)String對(duì)象,它的值(value)是剛才在棧中創(chuàng)建的三個(gè)char型值組成的數(shù)組{'a','b','c'},最后這個(gè)新創(chuàng)建的String對(duì)象會(huì)被添加到字符串池中。

如果我們接著執(zhí)行String b=new String("abc");代碼,由于"abc"已經(jīng)被創(chuàng)建并保存于字符串池中,因此JAVA虛擬機(jī)只會(huì)在堆中新創(chuàng)建一個(gè)String對(duì)象,但是它的值(value)是共享前一行代碼執(zhí)行時(shí)在棧中創(chuàng)建的三個(gè)char型值值'a'、'b'和'c'。

說(shuō)到這里,我們對(duì)于篇首提出的String str=new String("abc")為什么是創(chuàng)建了兩個(gè)對(duì)象這個(gè)問題就已經(jīng)相當(dāng)明了了。

本文來(lái)自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/yakihappy/archive/2009/03/10/3977169.aspx

本文來(lái)源:CSDN博客

總結(jié)

以上是生活随笔為你收集整理的java string对象创建_String对象创建个数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。