我有一段代码(如下所示),在运行时,(理想情况下)将填充app数组看起来像这样:
标题1:
App 1
App 2
标题2:
App 3
App 4
等
然而,当我在我的模拟器中运行它时,它产生了这个:
标题1:
App 1
App 2
App 3
App 4
...
标题2:
App 1
...
我不确定为什么会发生这种情况,因为我查看了默认设置并且在我看的每个地方,人们都说Java默认是通过值传递,而不是通过引用传递。如果这是真的,为什么它会将每个应用程序添加到每个类别?
前提条件:
商店被定义为“App”类的列表,每个元素包含标题和标题等。
ListDataChild是一个空的hashmap,类型为>由循环填充,然后通过可扩展列表视图输出。我会发布视图的代码,但它非常庞大而且很长,所以我最后会添加一个简单的测试算法。
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;
}
}
提前致谢!
答案 0 :(得分:1)
是的,你是对的,java确实通过值但是有一些棘手的情况:
如果您使用原始数据类型:按值传递可以正常工作。
如果您使用对象而不是原始数据类型:按值传递,但对于传递对象的地址。所以它看起来像传递参考。 我知道概念看起来几乎一样,但从技术上讲,它是按价值传递的。
看看这个link