簡體   English   中英

在哈希圖中使用double作為值的問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM