2016-07-25 64 views
0

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


} 

在此先感謝!

+0

*「如果你有修改建議,請只是否決之前發表評論。」 *是不是建設性的,並可能有預期的效果相反。 –

+0

你沒有引用足夠多的代碼,也沒有告訴我們什麼是'listDataChild',或者它與你指定的輸出有什麼關係。請參閱:[mcve] –

+1

*「我在任何地方看,人們都說Java默認通過值傳遞,而不是通過引用。如果這是真的,它如何將每個應用程序添加到每個類別?」* Java不會「默認」通過價值傳遞,這是**所有它**。請注意,當您處理對象時,傳遞的值是對對象的引用,而不是對象的副本。這可能與你遇到的問題有關,不可能從你引用的內容中知道。更多:http://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass-by-value?rq=1 –

回答

1

是的,你是對的,Java沒有路過值但也有棘手的情況:

  1. ,如果你使用的是原始數據類型:按值傳遞工作正常。

  2. 如果使用對象而不是原始數據類型:按值傳遞作品,但傳遞對象的地址爲。所以它看起來像傳遞參考。 我知道概念幾乎看起來一樣,但從技術上講,它是通過價值。

看一看這個link

+0

好的,那麼我怎麼確定這個值以後不會改變呢? –

+0

創建一個新對象並分配給hashmap。 – chandil03

相關問題