![](/img/trans.png)
[英]find key with highest value in HashMap<String,Double> using lambdaj (java)
[英]Issue with using double as value in hashmap
我在哈希圖中使用鍵作為String的值是double
精度值。 如果我獨立更新作為值添加到哈希圖中的變量,而不是在哈希圖中更新它,則更新后的值不會得到反映。 那就是當我使用鍵獲取值時,我獲取的值是0.0,而不是更新的值。 我不明白為什么會這樣。 請對此加以說明。 另外,還有其他方法可以通過更新變量來更新哈希圖中的值。 下面是我正在談論的示例代碼:
import java.util.HashMap;
public class TestDouble{
public Double d1 = 0.0;
public Double d2 = 0.0;
public Double d3 = 0.0;
private HashMap<String,Double> hm;
public TestDouble(){
hm = new HashMap<String,Double>();
hm.put("D1",d1);
hm.put("D2",d2);
hm.put("D3",d3);
}
public void updateD1(double d){
d1 = d;
}
public void updateD2(double d){
d2 = d;
}
public void updateD3(double d){
d3 = d;
}
public Double getValue(String key){
Double val = (Double)hm.get(key);
return val;
}
public static void main(String args[]){
TestDouble td =new TestDouble();
td.updateD1(10.10);
td.updateD2(20.20);
td.updateD3(30.30);
System.out.println("Value of D1 from HashMap = "+td.getValue("D1")+" from actual variable = "+td.d1);
System.out.println("Value of D2 from HashMap = "+td.getValue("D2")+" from actual variable = "+td.d2);
System.out.println("Value of D3 from HashMap = "+td.getValue("D3")+" from actual variable = "+td.d3);
}
}
我得到的輸出是:
Value of D1 from HashMap = 0.0 from actual variable = 10.1
Value of D2 from HashMap = 0.0 from actual variable = 20.2
Value of D3 from HashMap = 0.0 from actual variable = 30.3
Double
是不可變的。 您無法更新其值。 相反,您可以引用Double
另一個實例
d1
引用了0d
:
Double d1 = 0d;
如果我們執行另一個初始化,它將引用另一個值:
d1 = 1d;
另一方面, HashMap
是可變的,即可以更改其內部狀態:
Map<String, Double> map = new HashMap<String, Double>();
map.put("first", 0d);
map.put("first", 1d);
System.out.println("first = " + map.get("first"));
輸出將是:
first = 1.00
請記住,我們已經替換為鍵關聯的值first
,它不會被更新。
在Java中,變量包含對對象的引用。 最初,d1和D1的HashMap條目指向同一對象(因此它們各自包含相同的引用)。
當您修改變量d1以指向新對象時,該變量的值將更改為對該新對象的引用。 此更改僅針對d1,D1的HashMap條目仍具有原始參考作為其值,因此仍指向Double 0.00。
Java傳遞帶有值的引用,這意味着d1是對值為0.0的Double實例的引用。 將其放在地圖中時,不會將d1放入地圖中,而是d1引用的副本(也指向值為0.0的Double實例)。 因此,不,您有兩個Double引用,一個來自d1,另一個來自地圖。 更改d1時,不會更改Double的值,而是會更改參考d1以指向另一個Double,這不會更改存儲在地圖中的參考。
為了獲得想要的效果,您需要存儲一個對象,並保留引用並更改該對象的值。 例:
import java.util.HashMap;
public class TestDouble {
private static class Holder {
Double value = 0.0;
}
private HashMap<String,Holder> hm = new HashMap<String,Holder>();;
private Holder d1 = new Holder();
public TestDouble(){
hm = new HashMap<String,Holder>();
hm.put("D1",d1);
}
public void updateD1(double d){
d1.value = d;
}
public Double getValue(String key) {
return hm.get(key).value;
}
public static void main(String args[]){
TestDouble td =new TestDouble();
System.out.println("Value of D1 from HashMap = "+td.getValue("D1")+" from actual variable = "+td.d1.value);
td.updateD1(10.10);
System.out.println("Value of D1 from HashMap = "+td.getValue("D1")+" from actual variable = "+td.d1.value);
}
}
就像String一樣, Double
是不可變的數據類型。 因此,當您使用變量幫助設置映射值,然后將其設置為其他Double
值時,兩個Double
值是不同的。 難怪您為什么會觀察到行為。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.