Java中"="的用法


Java中"="等號作用是賦值,優先級很低,就是把等號右邊的值賦值給左邊。但你先看下面的一塊代碼。

基本類型使用等號

String a = "123";
String b;
System.out.println((b = a) == null);//打印1
System.out.println(b);//打印2
a = "234";
System.out.println("a:" + a + ",b=" + b);//打印3

那么它們的打印結果分別是什么?

正確結果是:

false
123
234,123

打印1的執行順序:首先把字符串a的首地址賦值給b,那么a和b都指向同一地址,也就是b的值也是123。此時小括號里面的代碼已經執行完成,(b=a)相當於就是b,那么b當然不等於null,結果是false。

在打印2的后面,臨時改變了a的值,也就改變了a的首地址,指向了另一個地址快,而此時b還是指向原來的地址。故a的值發生了變化,b的值未發生變化。原因是String是基本數據類型,等號賦值指向的都是地址值。

故對於基本數據類型,這種賦值不會影響其他變量。

引用數據類型使用等號

來看下面的代碼:

Map<String, String> map = new HashMap<>();
map.put("name", "123");
Map<String, String> map2 = map;
System.out.println((map2 = map) == null);//打印4
System.out.println(map2);//打印5
map.put("name", "444");
System.out.println(map2);//打印6

那么其打印結果又是怎樣?會和上面的一樣嗎?

正確結果是:

false
{name=123}
{name=444}

打印4的執行順序:首先把對象map的地址賦值給map2,那么map2就引用的是map的地址。此時小括號里面的代碼已經執行完成,(map2=map)相當於就是map2,那么map2當然不等於null,結果是false。

在打印5的后面,修改了map中name的值,由於是對象,使用的地址引用,那么map的變化就會導致map2發生變化,也就是兩者的值一致的。原因是Map是引用數據類型,等號賦值使用的是對象的引用地址。

那么針對這種現象,如果想修改map的值而不影響map2的值的變化,就不能再使用等號進行賦值,可以使用對象的復制。

Map map = new HashMap();
map.put("name", 111);
Map map2 = new HashMap();
BeanUtil.copyProperties(map, map2);

這里使用 HuTool 包的BeanUtil的方法進行復制,可以實現對象的復制。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM