使用Map.clear()、List.clear()方法,清空时注意!

对 Map、List 对象进行清空操作时,常常会使用 clear() 方法。
例如,清空 Map

	Map map = new HashMap();
	map.put("key1","value1");
	map.put("key2","value2");
	System.out.println(map.size()); //2
	map.clear();
	System.out.println(map.size()); //0

换做 List 也是同样的用法

	List list = new ArrayList<>();
	list.add("1");
	list.add("2");
	System.out.println(list.size()); //2
	list.clear();
	System.out.println(list.size()); //0

但是!!!

本文想要说的是,需要注意,如果使用clear()方法, Map被清空的同时,原本对Map的引用会一起被清空!!!
代码举例:

	List list = new ArrayList<>();
	Map map = new HashMap();
	List listTemp = new ArrayList<>();
	for(int i=0; i<3; i++){
   
	    map.clear();
	    for(int j=0; j<3; j++){
   
	        listTemp.add("i="+i+";j="+j);
	    }
	    map.put(""+i,listTemp);
	    list.add(map);
	}
	System.out.println(list);

这段代码也很简单,两层循环。
最里层向 listTemp 中添加数据,循环三次;
外层向 map 中添加 listTemp,key 值为循环次数的值;
每一次外层的循环都会清空之前循环的 map;
每一次外层的循环将 map 添加到外层 list 中。
根据这段代码,我们期待的结果是:

[{
0 = [i = 0;j = 0, i = 0;j = 1, i = 0;j = 2, i = 1;j = 0, i = 1;j = 1, i = 1;j = 2, i = 2;j = 0, i = 2;j = 1, i = 2;j = 2]
}, {
1 = [i = 0;j = 0, i = 0;j = 1, i = 0;j = 2, i = 1;j = 0, i = 1;j = 1, i = 1;j = 2, i = 2;j = 0, i = 2;j = 1, i = 2;j = 2]
}, {
2 = [i = 0;j = 0, i = 0;j = 1, i = 0;j = 2, i = 1;j = 0, i = 1;j = 1, i = 1;j = 2, i = 2;j = 0, i = 2;j = 1, i = 2;j = 2]
}]

而实际上,我们能够得到的结果是:

[{
2 = [i = 0;j = 0, i = 0;j = 1, i = 0;j = 2, i = 1;j = 0, i = 1;j = 1, i = 1;j = 2, i = 2;j = 0, i = 2;j = 1, i = 2;j = 2]
}, {
2 = [i = 0;j = 0, i = 0;j = 1, i = 0;j = 2, i = 1;j = 0, i = 1;j = 1, i = 1;j = 2, i = 2;j = 0, i = 2;j = 1, i = 2;j = 2]
}, {
2 = [i = 0;j = 0, i = 0;j = 1, i = 0;j = 2, i = 1;j = 0, i = 1;j = 1, i = 1;j = 2, i = 2;j = 0, i = 2;j = 1, i = 2;j = 2]
}]

可以看到,三条数据完全相同。
而这意味着,我们在使用clear()清空了Map之后,再次对Map进行赋值的时候,添加了原Map的List,其中元素随之发生变化。
另写部分代码验证:

	Map map = new HashMap();
	map.put("1","11");
	map.put("2","22");
	List<Map> list = new ArrayList<>();
	list.add(map);
	System.out.println(list);
	map.clear();
	map.put("3","33");
	System.out.println(list);
	map.put("2","22");
    System.out.println(list);

控制台输出为

[{1=11, 2=22}]
[{3=33}]
[{2=22, 3=33}]

由此,验证了我们的想法。

Map 是这样,List 也不例外。
将上述例子稍作改动,如下:

	List<Map> list = new ArrayList<>();
    List listTemp = new ArrayList<>();
    for(int i=0; i<3; i++){
   
        listTemp.clear();
        for(int j=0; j<3; j++){
   
            listTemp.add("i="+i+";j="+j);
        }
        Map map = new HashMap();
        map.put(""+i,listTemp);
        list.add(map);
    }
    System.out.println(list);

这一次的执行结果如下:

[{
0 = [i = 2;j = 0, i = 2;j = 1, i = 2;j = 2]
}, {
1 = [i = 2;j = 0, i = 2;j = 1, i = 2;j = 2]
}, {
2 = [i = 2;j = 0, i = 2;j = 1, i = 2;j = 2]
}]

可以看到在外层 list中,每个map元素内部的 listTemp 都是相同的,说明同样被更新了。

总结

我们也总结得出:Map、List 若被引用,那么后续的清空、修改、增加等操作,仍会影响到原本的引用
使用的时候要注意这一点!

相关推荐

  1. 使用Map.clear()、List.clear()方法注意

    2024-01-19 17:48:05       48 阅读
  2. MySQL所有表的数据的方法

    2024-01-19 17:48:05       26 阅读
  3. 关于c++中vector的使用(声明、、追加)

    2024-01-19 17:48:05       64 阅读
  4. Kafka Topic

    2024-01-19 17:48:05       56 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-19 17:48:05       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-19 17:48:05       106 阅读
  3. 在Django里面运行非项目文件

    2024-01-19 17:48:05       87 阅读
  4. Python语言-面向对象

    2024-01-19 17:48:05       96 阅读

热门阅读

  1. mysql limit

    2024-01-19 17:48:05       57 阅读
  2. 要在Linux上安装Docker Compose和nginx

    2024-01-19 17:48:05       62 阅读
  3. python中json的用法(详细)

    2024-01-19 17:48:05       53 阅读
  4. js indexOf方法的使用

    2024-01-19 17:48:05       49 阅读
  5. 一道使用LinkedList和Stack解决的算法题

    2024-01-19 17:48:05       45 阅读
  6. 6、机器学习之随机森林

    2024-01-19 17:48:05       58 阅读
  7. 1818:红与黑【解析】-------深度优先搜索

    2024-01-19 17:48:05       43 阅读
  8. springboot项目引入onlyoffice多人协同编辑文档

    2024-01-19 17:48:05       63 阅读