第一章
我們知道字元有兩種初始化方式:
string s1 = 「abc」;
string s2 = new string("def");
這兩種有什麼區別呢?這時就需要我們看看string的在記憶體中是怎麼儲存的了。我們先看下面的圖了解其在內存在是怎麼儲存的:
首先是 string s1 = 「abc」;它首先會去常量池去檢查是否存在「abc「,如果存在就返回,否則就建立。「abc」的位址給了s1,s1指向了它。而string s2 = new string("def");它會去堆記憶體中去建立乙個new string()物件,然後去常量池檢查是否存在"def" 如果存在就返回,否則建立。「def」的位址給了new string(),而new string()自給有乙個位址給了s2。這就是字串的基本儲存過程。
接下來我們看看字串的乙個重要特性:字串是常量,它們的值在建立之後不能更改。
如下面一段**
根據上面的分析我們可以知道 s 最開始是指向"abc",後面 s+="def"做個乙個字串拼接,而在記憶體中並沒有直接把"def」拼接在「abc」上,而是先開闢了空間儲存「def」,最後把abcdef拼接在一起,開闢了第三塊空間。通過這個例子我們可以知道不能變的是字串的值,即「abc」不能改變,而引用是可以改變的。所以最後 s列印出來的值變了,並不是「abc」發生了變化,而是s指向了新的物件「abcdef」。
接下來我們可以通過1個例子看看
public首先我們要知道==和equals的區別,==比較的是位址,而equals預設比較也是位址,而string重寫了equals()方法,比較的是值是否相同。根據上面的理解我們畫出記憶體圖class teststring
}
根據上圖我們知道了 string s1 = "abc";首先會在常量池中建立「abc」,s1指向此物件,而 string s2 = "abc"首先會在常量池中檢查發現存在「abc」,所以s2並不會再建立而是直接指向「abc」,而 string s3 = new string("abc");首先會在堆記憶體new 乙個string物件,然後指向常量池中已經存在的「abc」 (不會再建立「abc」),但是new string()給s3是自己的位址,並不是「abc」的位址。所以輸出結果為true false true
現在丟擲乙個問題 string s = 「abc」和 string s = new string("abc")有什麼區別?
知了堂學習筆記 執行緒2
1.執行緒的狀態 new thread 執行緒被建立 執行緒可執行狀態,搶到cpu才是真正的執行狀態 執行過程中cpu被搶 sleep wait 阻塞 結束 執行緒自動執行完 推薦 標誌位 2.執行緒的常用方法 sleep 執行緒休眠 讓出cpu,不讓出鎖 interrupt 打斷執行緒的sleep...
知了堂學習筆記 執行緒同步
鎖 保護資源 資源 衛生間 執行緒 上衛生間的人 鎖 衛生間的門 一把鎖只有一把鑰匙 只有執行完被鎖住的程式塊鑰匙才能被釋放 鎖保護誰 成員屬性 靜態成員屬性 鎖有幾種 this 當前物件的鎖 package thread public class thread 6 thread t2 new th...
知了堂學習筆記 CSS樣式整理(一)
height width 在height width屬性中使用 值,需要對包含它的塊級物件設定寬高,否則height width屬性設定無效。因為 是基於包含它的塊級物件的百分比高度。無效 有效 paading margin 1.使用paading margin外補白在已知單個子元素寬高情況下實現居...