哈希表中关于doublevalue()的混淆

时间:2012-05-09 04:48:42

标签: java casting hashtable type-conversion unboxing

// Demonstrate a Hashtable
import java.util.*;
class HTDemo {
    public static void main(String args[]) {
        Hashtable balance = new Hashtable();
        Enumeration names;
        String str;
        double bal;
        balance.put("John Doe", new Double(3434.34));
        balance.put("Tom Smith", new Double(123.22));
        balance.put("Jane Baker", new Double(1378.00));
        balance.put("Todd Hall", new Double(99.22));
        balance.put("Ralph Smith", new Double(-19.08));

        // Show all balances in hash table.
        names = balance.keys();
        while(names.hasMoreElements()) {
            str = (String) names.nextElement();
            System.out.println(str + ": " +
            balance.get(str));
        }
        System.out.println();

        // Deposit 1,000 into John Doe's account
        ***bal = ((Double)balance.get("John Doe")).doubleValue();***
        balance.put("John Doe", new Double(bal+1000));
        System.out.println("John Doe's new balance: " +
        balance.get("John Doe"));
    }
}
  1. 排队bal = ((Double)balance.get("John Doe")).doubleValue(); doubleValue有什么用? (我知道它会将对象转换为double值)但如果没有这个运行程序,程序运行正常。
  2. (纠正我,如果我错了)balance.get在这里得到一个值为3434.34的双重对象,并在它前面的(双)进行拆箱并将其转换为double值的double对象然后如何和为什么doubleValue()将此双3434.34视为对象?????

3 个答案:

答案 0 :(得分:2)

我不确定我的问题是否正确。我会尝试从我理解你的问题的角度来解释。

  1. 是的,你是对的,你不需要 doubleValue()。这只是一种明确告诉Java解包的方法。如果您不使用doubleValue(),Java将自动取消装箱。因此,如果Java不支持将原始类型自动[un]装入相应的Object类型,那么您将需要doubleValue(),因为(Double)balance.get("John Doe")将返回一个Object而bal是一个原始类型的变量。
  2. 对于问题的第二部分,Java double是原始数据类型,Double是对象类型。 Java集合API因此Hashtable仅存储对象。它们不存储基本类型。因此,balance.get()返回一个对象。您将其转换为Double类型的另一个对象。由于Java提供了自动装箱/取消装箱,doubleValue()方法在这里是可选的。
  3. 希望这有帮助!

答案 1 :(得分:0)

集合只适用于OBJECT类型而不是原始类型,创建包装类的原因之一是,您不能存储3.4但是您可以存储new Double(3.4),是的,如您所说,你可以使用没有doubleValue的值,但它是一种标准的处理方式。对于隐式调用和转换,存在jvms / jre的不同版本在这种情况下表现略有不同的风险,为了避免它们,您希望以标准方式执行它,以便它不会受到影响

答案 2 :(得分:0)

  
      
  1. 符合bal =((Double)balance.get(“John Doe”))。doubleValue(); doubleValue有什么用(知道它将对象转换为double值)   但如果我没有这个,程序运行正常。
  2.   

正确。

  
      
  1. (如果我错了,请纠正我)balance.get()获取值为3434.34的双重对象,并且(双)在它前面取消装箱
  2.   

没有。没有(double)。有(Double)。它将其从Object转换为Double

  

并将其转换为双重对象

  

双值

没有。这是一个对象而不是一个价值。这句话毫无意义。

  

然后doubleValue()如何以及为什么将此双3434.34视为对象?

没有。它调用Double.doubleValue(),返回double

此代码根本不使用自动装箱。自Java 1.5大约5年前问世以来,此代码中的doublevalue()调用已经过时。它也不使用泛型。我怀疑你正在看一些非常古老的代码。