使用以下代码,脚本仅在方法的第一次调用时才进入if (mySet! = null)
块。
为什么自第二次通话mySet
以来的结果是null
?
Map<Integer, Set<String, String>> mMap;
// ... code to populate the map with correct elements
public String myMethod(int idName)
{
String html = "";
Set<String> mySet = mMap.get(idName);
// Set<String> mySet = new HashSet<>(mMap.get(idName));
if(mySet != null)
{
// the script enters here only at first call?!?!?
for(String name : mySet)
{
html += ", " + name;
}
mySet.clear();
}
return html;
}
myMethod(1); // return some html
myMethod(1); // return empty html...
如果我替换此行:
Set<String> mySet = mMap.get(idName);
有这行:
Set<String> mySet = new HashSet<>(mMap.get(idName));
它在每次通话时都有效。
map
元素已正确设置,每次调用都不会更改活动,也不会旋转设备并且不执行其他可能的操作。
答案 0 :(得分:1)
这里:
Set<String> mySet = new HashSet<>(mMap.get(idName));
创建一个新集合,该集合是您地图中内容的副本。如果直接在存储在地图中的设置对象上工作,则也将更新“地图”内容。
这就是全部:修改“根”数据映射与更新该数据的副本之间的区别。
答案 1 :(得分:1)
因为Set是Reference类型的对象,所以第一次它与条件匹配时才清除该集合,所以现在该集合为空,因此与1
对应的值变为[]
空集。
假设myMap具有价值:
1, ["1", "2", "3"]
现在,当您第一次执行myMethod(1)
时,它将清除与1
的值相对应的集合
现在,地图值变为:
1, []
因此它再次满足您的条件if(mySet != null)
,但是由于集合html
为空,因此它没有向mySet
变量添加任何内容。因此,它将返回空的html变量。
答案 2 :(得分:0)
我认为您可以通过将mymap.get(idName)克隆为myset来解决此问题
${StrContains} $0 "temp" $INSTDIR