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首先會檢查字串常量池中是否存在該字串的物件,如果已經存在,那麼就不會在字串常量池中再建立了...