字串的建立到底有幾個物件產生

2021-09-25 09:39:46 字數 3187 閱讀 4112

string a =

"98374"

;

這種情況下,在編譯時就對常量池進行判斷是否存在該字串.編譯期的常量池是靜態常量池,如果不存在該字串,則在常量池中建立該字串的物件,並返回給該變數.

所以:

string a =

"98374"

;string b =

"98374"

;

只建立了乙個物件

string a =

newstring

("98374"

);

這種情況下,因為使用了new,所以不能在編譯時期確定.它的流程是,先判斷常量池中是否有該字串,如果不存在該字串,則在常量池中建立該字串的物件.然後,注意,然後是在堆裡面複製乙個這個字串物件,然後把堆裡面的位址返回給該變數而不是常量池中的物件位址.這是由new的特性決定的.

所以對於new方法來說,當常量池中沒有這個字串的時候,建立兩個物件,乙個常量池中的,乙個堆中的.當常量池中有這個字串的時候,只建立乙個物件

所以:

string a =

newstring

("98374");

string b=

newstring

("98374"

);

這種情況下就建立了三個物件.

這個要分兩種情況:

場景1

string a =

"9"+8+

"3"+

"7"+

4;

所有用於連線的都是字面量,所以也就是說可以在編譯時期確定,當字串連線完成以後會判斷是否常量池中有該字串,如果沒有則在常量池中建立乙個字串,然後返回該字串.

string a =

"9"+8+

"3"+

newstring

("7")+

4;

stringbuilder sb =

newstringbuilder

("983");

//乙個物件

sb.(new

string

("7"))

;//兩個物件

sb.(new

string

(string.

valueof(4

)));

//4個物件

return sb.

tostring()

;//5個物件

它的原始碼為:

public

static string valueof

(object obj)

也即是呼叫物件的tostring方法,這個針對不同物件有不同的實現.並不一致.

object的tostring方法

public string tostring()

而integer.tohexstring(hashcode());最終會呼叫

private

static string tounsignedstring0

(int val,

int shift)

所以還是呼叫了new方法建立物件

如果其他的類自己重寫了tostring方法就要看具體實現方式了,並不一致.

/**

* @program: infoalgorithm

* @description: 測試string的建立問題

* @author: zhouzhilong

* @create: 2019-07-10 15:26

**/public

class

stringtest

", m == n)

;//true

/*字面量與new對比*/

m ="89734"

; n =

newstring

("89734");

logger.

debug

("m == n :{}"

, m == n)

;//false

/*new 與new 對比*/

m =newstring

("89734");

n =newstring

("89734");

logger.

debug

("m == n :{}"

, m == n)

;//false

/*string.valueof與字面量對比*/

m ="89734"

; n = string.

valueof

(89734);

logger.

debug

("m == n :{}"

, m == n)

;//false

/* +號 連線符*/

m ="89734"

; n =

"8"+

"9"+7+

"3"+

"4";

logger.

debug

("m == n :{}"

, m == n)

;//true

/* +號 連線符 使用變數*/

m ="89734"

; n =

"8"+

"9"+7+

newstring

("3")+

"4";

logger.

debug

("m == n :{}"

, m == n)

;//false

/* 字面量與tostring()*/

m ="89734"

; n =

newinteger

(89374).

tostring()

; logger.

debug

("m == n :{}"

, m == n)

;//false

}}

物件的 可列舉 到底有啥用?

可列舉屬性有什麼作用?用在什麼場景下,什麼業務下?var god var news methods 然後我們可以這樣訪問 god.extends name news god.name.methods.show 看我們前面的 god是乙個母物件,意思就說我們協作開發,一般由專案組長或技術經理來開發go...

建立執行緒的方式 執行緒建立到底有幾種方式?

在網上搜尋執行緒建立的集中方式,大約都是多的三種或者四種,我們看下jdk的原始碼怎麼說的?原始碼中說的建立執行緒有兩種方式類thread和介面runable 網上第三種 實現callable介面,結合futuretask建立執行緒,這種方式我們檢視原始碼也可以看出它實際上也屬於實現runable介面...

字串的建立

string字串的建立可以通過string str1 hello 或者 string str2 new string hello 兩種形式。使用string str1 hello 這種方式建立字串的時候,jvm首先會檢查字串常量池中是否存在該字串的物件,如果已經存在,那麼就不會在字串常量池中再建立了...