使用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 若被引用,那么后续的清空、修改、增加等操作,仍会影响到原本的引用
使用的时候要注意这一点!

  • 30
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
graphicsLayer.clear()是用来清空图层上的所有标记的点、线和面的方法。这个方法会将图层上的所有要素都移除掉,使得图层变为空。你可以通过以下步骤来清空图层: 1. 首先,创建一个GraphicsLayer对象并设置一个唯一的id,比如'id'。 var graphicsLayer = new GraphicsLayer({id:'layer_id'}); 2. 然后,使用clear()方法清空图层。 graphicsLayer.clear(); 这样就可以清空图层上的所有要素了。如果你想要重新添加要素到图层上,你可以使用add()方法将新的要素添加到图层中。如果你想要获取已经存在的图层对象,你可以使用getLayer()方法,传入图层的id来获取对应的图层对象。比如,你可以使用以下代码获取已经存在的图层对象: var layer = map.getLayer('layer_id'); 请注意,这里的'map'是你的地图对象,'layer_id'是你之前为图层设置的唯一id。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Arcgis Javascript(四)图层相关操作(获取、层级、添加、删除、清空)](https://blog.csdn.net/yiyueqinghui/article/details/102669438)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值