我在HashMap
中收到了这个奇怪的输出。
我有两个ArrayList<String>
一个包含密钥,另一个包含值。
我的HashMap<String,String>
只会将字符串存储为键和值对。但关键本身就是存储在价值中。我检查了我的值arraylist,它打印了值。但是在把它设置为关键时它就是关键。
代码段是:
public HashMap<String,String> getLstBarring()
{
ArrayList<String> temparrLst=setPreParameters(fetchPreDetails, 1);
System.out.println("KEY" + temparrLst);
ArrayList<String> tempArrLstId=setPreParameters(fetchPreDetails, 14);
System.out.println("VALUE" +tempArrLstId);
int length=tempArrLstId.size();
for(int index=0;index<length;index++)
{
System.out.println("VALUE IN KEY" + temparrLst.get(index));
System.out.println("VALUE IN VALUE" + tempArrLstId.get(index));
this.lstBarring.put(temparrLst.get(index), tempArrLstId.get(index));
}
System.out.println("INSIDE ODB....>>>>>>>>>>>>>>" + lstBarring);
return this.lstBarring;
}
问题是:
因此,在迭代之后,我在HashMap
获得了价值,而它应该是关键,价值。
以下是我的方法: -
public ArrayList<String> setPreParameters(HashMap<Integer,String> fetchPreDetails,int index)
{
switch(index)
{
case 1:
{
arrLstData.clear();
splittedString=fetchPreDetails.get(1).split(",");
Collections.addAll(arrLstData, splittedString);
break;
}
return arrLstData;
请指导我哪里出错了。
答案 0 :(得分:3)
我的猜测是fetchPreDetails
是由setPreParameters()
变异的集合,否则setPreParameters()
正在改变其他一些共享状态,以便temparrLst
引用的集合是在第二次拨打setPreParameters()
时被更改。即。
List<String> strings = new ArrayList();
strings.add("a");
strings.add("b");
List<String> otherStrings = strings;
otherStrings.add("c");
我希望您的代码假设strings
包含“a”和“b”,而otherStrings
将包含“a”,“b”和“c”。这不是对象引用在Java中的工作方式。第List<String> otherStrings = strings;
行使strings
和otherStrings
指向同一个集合,因此使用任一名称所做的更改都会影响相同的内容。
编辑:您新发布的代码似乎证明了我的假设。您有一个名为arrLstData
的变量,您可以在每次调用setPreParameters()
时清除,填充和返回。每次调用此方法时,您都会返回相同的集合。因此,您只需要同一个集合的多个句柄而不是多个集合。您需要创建一个新集合并在每次调用setPreParameters()
时返回它。
再次编辑:也许这会让它更清晰。这是你正在做的事情:
public static void main(String[] args) {
Foo f = new Foo();
List<String> list1 = f.getList("a", "b");
System.out.println(list1);
List<String> list2 = f.getList("c", "d");
System.out.println(list2);
System.out.println(list1);
}
static class Foo {
private List<String> myList = new ArrayList<String>();
public List<String> getList(String... strings) {
myList.clear();
myList.addAll(Arrays.asList(strings));
return myList;
}
}
请注意,这恰好表现了您所描述的行为,解决问题的正确方法是这样的:
public static void main(String[] args) {
Foo f = new Foo();
List<String> list1 = f.getList("a", "b");
System.out.println(list1);
List<String> list2 = f.getList("c", "d");
System.out.println(list2);
System.out.println(list1);
}
static class Foo {
public List<String> getList(String... strings) {
List<String> result = new ArrayList<String>();
result.addAll(Arrays.asList(strings));
return result;
}
}
答案 1 :(得分:0)
您正在setPreParameters
方法一遍又一遍地重复使用相同的列表
arrLstData
中的列表会被返回并存储在temparrLst
中,现在您要清除列表内容,在其中添加新内容并将其存储到tempArrLstId
。
现在这三个变量都包含相同的列表(它们不等于,它们是相同的!)
整个示例中只有一个List对象!
就像你有一个盒子并标记它“A”在一侧放入其中的东西,在另一侧标记为“B”并且想知道为什么盒子“B”在你转动盒子“A”时是空的 - 下来。
答案 2 :(得分:0)
你可能意味着这样的事情吗?
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class GlobalsMess {
private Map<String, String> lstBarring = new HashMap<String, String>();
private Map<Integer, String> fetchPreDetails = new HashMap<Integer, String>();
public GlobalsMess() {
fetchPreDetails.put(1, "john,vikam,david");
fetchPreDetails.put(14, "1,2,3");
}
public Map<String, String> getLstBarring() {
List<String> tempKeys = setPreParameters(fetchPreDetails.get(1));
System.out.println("KEY" + tempKeys);
List<String> tempIds = setPreParameters(fetchPreDetails.get(14));
System.out.println("VALUE" + tempIds);
for (int index = 0; index < tempIds.size(); index++) {
System.out.println("VALUE IN KEY" + tempKeys.get(index));
System.out.println("VALUE IN VALUE" + tempIds.get(index));
this.lstBarring.put(tempKeys.get(index), tempIds.get(index));
}
System.out.println("INSIDE ODB....>>>>>>>>>>>>>>" + lstBarring);
return this.lstBarring;
}
public List<String> setPreParameters(String fetchPreDetailsValue) {
List<String> arrLstData = new ArrayList<String>();
Collections.addAll(arrLstData, fetchPreDetailsValue.split(","));
return arrLstData;
}
public static void main(String[] args) {
new GlobalsMess().getLstBarring();
}
}
输出:
KEY[john, vikam, david]
VALUE[1, 2, 3]
VALUE IN KEYjohn
VALUE IN VALUE1
VALUE IN KEYvikam
VALUE IN VALUE2
VALUE IN KEYdavid
VALUE IN VALUE3
INSIDE ODB....>>>>>>>>>>>>>>{david=3, vikam=2, john=1}