问题导向
HashMap的get(key)方法返回key对应的value的值
那么如果选择一个变量接收该值,并修改该变量,原哈希表中的value的值是否会受到影响呢?
代码尝试
@Test
/*
* 测试哈希表HashMap的get(key)的注意点
*/
public void testHashMapGet() {
// 1. 哈希表的value为String
// HashMap<Integer,String> myMap = new HashMap<Integer, String>();
// myMap.put(1,"一");
// myMap.put(2,"二");
// String str = myMap.get(1);
// str = null;
// System.out.println(myMap); //一,不影响
// 2. 哈希表的value为HashSet
HashMap<Integer,HashSet<Integer>> myMap2 = new HashMap<Integer, HashSet<Integer>>();
HashSet<Integer> set1 = new HashSet<Integer>();
set1.add(1);
set1.add(2);
myMap2.put(1,set1);
HashSet<Integer> mySet = myMap2.get(1);//此时返回的mySet相当于指向myMap中的集合set,修改mySet,会影响myMap中的集合set
//mySet.clear();
mySet.add(10);
System.out.println(myMap2);//清空和更改都会影响
// 3. 哈希表的value为数组
// HashMap<Integer, Integer[]> myMap3 = new HashMap<Integer, Integer[]>();
// Integer[] arr = { 1, 2, 3 };
// myMap3.put(1, arr);
// Integer[] myArr = myMap3.get(1);// 此时返回的mySet相当于指向myMap中的集合set,修改mySet,会影响myMap中的集合set
// myArr[0] = 10;
// for (int n : myMap3.get(1)) {
// System.out.println(n);// 会影响
// }
//4. 使用迭代器Iterator遍历同样会影响value值
//5. 如果value是类的话应该也会影响
}
分析结果
- 从代码执行结果来看,如果value类型为基本数据类型,不会影响到原值
- 如果是String类型,也不会影响原值
- 如果是数组或集合等会影响到原值
- 使用迭代器Iterator同样也会影响
原理分析
应该和HashMap的API设计有关,还没有详细分析研究