【问题标题】:confusion about doublevalue() in hash tables关于哈希表中的 doublevalue() 的混淆
【发布时间】:2012-05-09 04:48:41
【问题描述】:
// 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有什么用? (我知道它将对象转换为双值)但是如果我没有这个程序运行,程序运行正常。
  2. (如果我错了,请纠正我)balance.get 在这里获取一个值 3434.34 的双对象,并且它前面的 (double ) 进行拆箱并将其转换为双值的双对象,然后如何以及为什么 @987654326 @ 将这个双重 3434.34 视为对象??????

【问题讨论】:

  • 请多花一点时间来格式化你的问题,这样你会得到更好的帮助。
  • 你考虑过使用HashMap()吗?它更快(不同步),泛型可以让你避免类型转换。

标签: java casting hashtable type-conversion unboxing


【解决方案1】:

我不确定我是否正确地回答了您的问题。我将尝试从我对您的问题的理解的角度进行解释。

  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() 方法在这里是可选的。

希望这会有所帮助!

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 不存在不同 JVM 行为不同的风险。装箱和拆箱由 javac 编译器完成,而不是 JIT 编译器。见What code does the compiler generate for autoboxing。方法 doubleValue() 之所以存在,是因为自动装箱和拆箱只是语法糖——它不是进行转换的“标准”方式,而是 实际 方式。
    • 感谢 Greg 的澄清 :)
    【解决方案3】:
    1. 在行 bal = ((Double)b​​alance.get("John Doe")).doubleValue(); doubleValue 的用途是什么(知道它将对象转换为双精度值) 但如果我没有这个程序运行,程序运行正常。

    正确。

    1. (如果我错了,请纠正我)balance.get() 得到一个值为 3434.34 的 double 对象,并且 (double) 在它前面进行拆箱

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

    并将其转换为双对象

    是的。

    双值

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

    那么 doubleValue() 如何以及为什么将这个双精度 3434.34 视为对象?

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

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

    【讨论】:

      猜你喜欢
      • 2013-07-20
      • 2019-03-22
      • 1970-01-01
      • 2019-05-12
      • 2017-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-17
      相关资源
      最近更新 更多