我的代碼(下面)一個代碼段中運行時,將(理想地)填充一個應用程序陣列看起來像這樣:爲什麼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 –