在java中擦盾,=號表示賦值的意思。最近在學習AQS時系忙,碰到了下面這個方法诵盼。在分析代碼的過程中,有幾個if語句以及對象間的互相賦值银还,看的有點凌亂拦耐。索性先來了解一下 = 號到底怎么用?
1见剩、首先對于基本類型來說杀糯,比如int,當定義一個int a = 1時苍苞,這個時候1會放進常量池固翰,當又有a=2時狼纬,常量池中會有一個2,。所以基本類型比較的時候都是比較值骂际,那么基本類型的賦值就很好理解了疗琉,當有 int b = a,那么b的值也是a的值歉铝,這個時候b=3時盈简,a和b就不再相等,常量池中有一個3太示。
2柠贤、基本類型的包裝類型,比如 Integer? h = 10000,那么內(nèi)存中會開辟一塊空間存放10000类缤,當這個時候修改h = 20000時臼勉,內(nèi)存中會重新開辟出一塊空間存放20000。因為定義integer時餐弱,執(zhí)行的是Integer.valueOf(i),而Integer.valueOf()如果不在integerCache里的話宴霸,執(zhí)行的是new Integer(i)。當有 Integer j = h膏蚓,此時j和h指向的是同一塊內(nèi)存瓢谢。當j或者h的值修改了,這倆個對象也不再相等驮瞧,這也是為什么當倆個Integer對象的值在-128到127之間用==比較為true恩闻,而不在這個區(qū)間的值用==比較為false。因為不在區(qū)間內(nèi)的倆個Integer是倆個不同的對象剧董,修改了值就是修改對象整體幢尚。當修改了對象整體就相當于開辟了新的對象,內(nèi)存中的地址就改變了翅楼。所以用==號不再相等了尉剩。
3、接下來分析自定義類中的=毅臊,假設有一個類如下理茎,
首先創(chuàng)建一個實例:ComputerTest c1 = new ComputerTest("i7", "500", 10000);
再有一個實例 ComputerTest c2 = c1,此時c2和c1指向的是同一塊地址管嬉,當修改c1或者c2的某一個值時皂林,倆個實例的值會同時修改,這時候c1和c2指向的仍然是同一塊內(nèi)存础倍。而當這個時候有一個ComputerTest c3 = new ComputerTest("i5", "1G", 20000)胎挎。如果有 c2 = c3沟启,這個時候發(fā)生了什么忆家?c2和c3指向了同一塊內(nèi)存(這里相當于將c2的原來指向c1的指針指向了c3,雖然java中沒有指針的概念德迹。java的reference應該類似于指針的概念)芽卿。當又有c3 = c1時肌毅,又將c1和c3指向了同一塊內(nèi)存芽腾。又有c1 = c2,c2和c1指向了同一塊內(nèi)存页衙。這個時候 摊滔,c3就變成了("i7", "500", 10000),這個時候c1 和 c2都指向了ComputerTest("i5", "1G", 20000)店乐,在現(xiàn)實中你可能不會這么用,這里只是為了舉例說明這個問題眨八。這其實也驗證了java中的復制都是淺度復制腺兴,復制過后大家指的都是同一個東西。
這里補充:當ComputerTest c2 = c1時廉侧,c2和c1指向同一塊內(nèi)存页响,置一塊內(nèi)存是c1指向的內(nèi)存。c2 = c3段誊,c2指向了c3所指向的內(nèi)存闰蚕。所以在理解等號時,可以理解為將左邊的指向了右邊的所指向的內(nèi)存连舍。
再回頭去分析開頭的源碼就簡單很多啦没陡!