質問する
Map オブジェクトの単純なコピーの問題ですか? ? ? ?
問題の解決
例 1: 単純な参照であるマップ オブジェクト参照のコピーでは問題は解決できません
[code]package com.evada.de; import java.util.HashMap; import java.util.Map; /** * Created by Ay on 2016/5/11. */ public class RedisTest { public static void main(String[] args) { Map<String,String> mapAA = new HashMap<>(); mapAA.put("A", "A"); mapAA.put("AA","AA"); mapAA.put("AAA","AAA"); System.out.println(mapAA); //用mapBB对象去引用mapAA Map<String,String> mapBB = mapAA; mapBB.put("B","B"); System.out.println(mapBB); } }
結果:
[code]{AA=AA, A=A, AAA=AAA} {AA=AA, A=A, AAA=AAA, B=B}
例 2: PutAll in Map は単純な型の copy
[code]package com.evada.de; import java.util.HashMap; import java.util.Map; /** * Created by Ay on 2016/5/11. */ public class RedisTest { public static void main(String[] args) { Map<String,String> mapAA = new HashMap<>(); mapAA.put("A", "A"); mapAA.put("AA","AA"); mapAA.put("AAA","AAA"); System.out.println(mapAA); Map<String,String> mapBB = new HashMap<>(); //把mapAA的元素复制到mapBB中 mapBB.putAll(mapAA); mapBB.put("B","B"); //打印出的mapAA应该不受影响 System.out.println(mapAA); //打印出的mapBB应该多了元素B System.out.println(mapBB); } }
結果:
[code]{AA=AA, A=A, AAA=AAA} {AA=AA, A=A, AAA=AAA} {AA=AA, A=A, AAA=AAA, B=B}
例 3: マップ内の putAll は単なる浅いコピーです
[code]package com.evada.de; import java.util.HashMap; import java.util.Map; class Person{ private String id,name; Person(String id,String name){ this.id = id; this.name = name; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } } /** * Created by Ay on 2016/5/11. */ public class RedisTest { public static void main(String[] args) { Map<String,Person> mapAA = new HashMap<>(); mapAA.put("A",new Person("AID","AY")); mapAA.put("B",new Person("BID","AL")); System.out.println(mapAA); Map<String,Person> mapBB = new HashMap<>(); /** 把mapAA中的元素复制到mapBB中 **/ mapBB.putAll(mapAA); /** 修改mapBB中A元素值,如果mapAA中的元素A受影响,说明是浅复制 **/ Person person = mapBB.get("A"); person.setName("Ay_New"); System.out.println(mapBB); System.out.println("mapAA 的A元素value值:" + mapAA.get("A").getName()); } }
結果: 結果から、mapAA と mapBB を印刷するときの結果は同じであることがわかります。これは、putAll のコピーが単純な浅いコピーであることを示しています。
最後の結果から、もう一度繰り返すことができます。検証、mapBBのA要素の値が変更されるため、mapAAの要素の値に直接影響します
[code]{A=com.evada.de.Person@71bc1ae4, B=com.evada.de.Person@6ed3ef1} {A=com.evada.de.Person@71bc1ae4, B=com.evada.de.Person@6ed3ef1} mapAA 的A元素value值:Ay_New