1.字串在記憶體裡面到底是怎麼樣存在的?
以string型別的物件在堆區申請到一塊記憶體區,一共24個位元組,其中mark_word佔8個位元組,_klass指標4個位元組,value4個位元組,hash4個位元組,coder1個位元組,對齊3個位元組,value指向存放真正字元的byte陣列物件。當然這個大小跟hotspot是32位還是64位有關,以及64位情況,是否開啟指標壓縮有關。
-xx:+usecompressedoops:針對oop指標壓縮,-xx:+usecompressedclasspointers:針對klass指標壓縮
以上24個位元組是針對64位預設,也就是開啟oop指標壓縮和klass指標壓縮的情況下。
2.string的 intern 方法到底幹了什麼?
如果常量池中已經有了這個字串,那麼直接返回常量池中它的引用,如果沒有,那就將它的引用儲存乙份到字串常量池,然後直接返回這個引用。
3.s1.intern(); 和 s1 = s1.intern();一樣嗎?
不一樣。
s1.intern(); 將s1的引用儲存乙份到字串常量池。如果常量池中已經有了這個字串,相對於什麼都沒做。
s1 = s1.intern(); 將s1的引用儲存乙份到字串常量池,如果常量池中已經有了這個字串,返回常量池中的引用賦值給s1,那麼也就是說s1的引用變了,如果常量池中沒有這個字串,那就將它的引用儲存乙份到字串常量池。
區別在於:s1=s1.intern(); s1的引用值可能會發生變化,但是s1.intern(); 對s1的引用值不產生任何改變。
4.string s = 「hello」;和string s = new string(「hello」);還有string s = 「he」+」llo」;以及string s = new string(「he」)+new string(「llo」);的區別是什麼?
(1).string s = 「hello」;
s指向堆區的乙個string物件,並且該物件引用儲存在字串常量池裡面。
(2).string s = new string(「hello」);
s指向堆區的乙個string物件,並且該物件引用沒有儲存在字串常量池裡面。執行s=s.intern(); 後,s的引用值改變,指向字串常量池存在的引用值。
(3).string s = 「he」+」llo」;
和string s = 「hello」;一樣,在編譯階段就會合併為乙個字串。所以跟(1)是一樣的。
(4).string s = new string(「he」)+new string(「llo」);
每日總結7
html3種列表 列表有3種 有序列表 無序列表和定義列表。有序列表和無序列表都比較常用,而定義列表比較少用。在實際應用中,最常用的是無序列表,請大家重點掌握。目錄列表和選單列表已經被廢除,大家可以直接忽略這兩種列表。有序列表 有序列表項 有序列表項 有序列表項 有序列表列表項符號由list sty...
每日練習7
jquery 中有哪些方法可以遍歷節點?children 取得匹配元素的子元素集合 next 取得匹配元素後面緊鄰的同輩元素 prev 取得匹配元素前面緊鄰的同輩元素 siblings 取得匹配元素前後的所有同輩元素 closest 取得最近的匹配元素 find 取得匹配元素中的元素集合,包括直接子...
每日思考記錄(7)
1 禪 禪,是一種基於 靜 的行為,源於人類本能,經過古代先民開發,形成各種系統的修行方法,並存在於各種教派。先秦時期就有關於此種行為的記載,但是未有固定稱呼。直至印度詞彙jana傳入,漢語音譯為 禪那 後世便以 禪 字稱謂此類行為。禪的定義 禪那,漢譯靜慮,即於一所緣境繫念寂靜 正審思慮。人生中的...