我的代码(下面)一个代码段中运行时,将(理想地)填充一个应用程序阵列看起来像这样:为什么HashMap似乎使用引用变量而不是真值?
部首1:
应用1
应用2
标题2:
应用3
应用4
等
然而,当我在仿真器运行它,它会产生这样的:
部首1:
应用1
应用2
应用3
App 4
...
标题2:
应用1
...
我不知道为什么会这样,因为我已经看过了默认值,并到处看,人说Java默认为按值传递,而不是通过引用。如果这是真的,它如何将每个应用程序添加到每个类别?
前提条件:
存储被定义为级“应用程序”,包含标题和标题,除其他事项外的每个元素的列表。
ListDataChild是一个空的散列映射,其类型>将由循环填充,然后通过可展开列表视图输出。我会发布视图的代码,但它非常庞大而且很长,所以我只在最后添加一个简单的测试算法。
的emptyList就是这样,类型的列表里面没有什么(至少与开始难道会改变?)
代码:
listDataChild = new HashMap<String, List<App>>();
List<App> emptylist = new ArrayList<>();
List<App> Store = synced.getAppStore();
Boolean juststarted = true;
for (App el : Store)
{
if (juststarted)
{
juststarted = false;
listDataChild.put(el.getHeader(), emptylist);
listDataChild.get(el.getHeader()).add(el);
} else {
if (listDataChild.containsKey(el.getHeader())) {
listDataChild.get(el.getHeader()).add(el);
} else {
listDataChild.put(el.getHeader(), emptylist);
listDataChild.get(el.getHeader()).add(el);
}
}
}
//TESTING
for (String header : listDataChild.keySet())
{
for (int j = 0; j < listDataChild.get(header).size(); j++)
{
System.out.println("HashMap at " + header + ", " + j + ": " + listDataChild.get(header).get(j).getTitle());
}
}
App.Java:
public class App {
public String header,title,link,url,redirect,icon;
public Double order;
public Boolean selected;
public App() {
header = "";
title = "";
link = "";
url = "";
redirect = "";
icon = "";
order = 0.0;
selected = false;
}
public int compareTo(App another) {
if (this.getOrder()<another.getOrder()){
return -1;
}else{
return 1;
}
}
public void setHeader(String h) {
header = h;
return;
}
public void setTitle(String t) {
title = t;
return;
}
public void setLink(String l) {
link = l;
return;
}
public void setUrl(String u) {
url = u;
return;
}
public void setRedirect(String r) {
redirect = r;
return;
}
public void setIcon(String i) {
icon = i;
return;
}
public void setOrder(Double o) {
order = o;
return;
}
public void setSelected(Boolean s) {
selected = s;
return;
}
public String getTitle()
{
return title;
}
public String getHeader()
{
return header;
}
public Double getOrder()
{
return order;
}
}
在此先感谢!
*“如果你有修改建议,请只是否决之前发表评论。” *是不是建设性的,并可能有预期的效果相反。 –
你没有引用足够多的代码,也没有告诉我们什么是'listDataChild',或者它与你指定的输出有什么关系。请参阅:[mcve] –
*“我在任何地方看,人们都说Java默认通过值传递,而不是通过引用。如果这是真的,它如何将每个应用程序添加到每个类别?”* Java不会“默认”通过价值传递,这是**所有它**。请注意,当您处理对象时,传递的值是对对象的引用,而不是对象的副本。这可能与你遇到的问题有关,不可能从你引用的内容中知道。更多:http://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass-by-value?rq=1 –