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的方法進行復制,可以實現對象的復制。
