关于哈希表中doublevalue()的混淆 //演示哈希表 导入java.util.*; 类HTDemo{ 公共静态void main(字符串参数[]){ 哈希表余额=新哈希表(); 枚举名称; 字符串str; 双bal; 余额.put(“John Doe”,新双(3434.34)); 平衡。推杆(“汤姆·史密斯”,新双(123.22)); 余额.认沽期权(“Jane Baker”,新双精度(1378.00)); 平衡推杆(“托德霍尔”,新双人(99.22)); 平衡。推杆(“拉尔夫·史密斯”,新双(-19.08)); //在哈希表中显示所有余额。 name=balance.keys(); while(names.hasMoreElements()){ str=(字符串)names.nextElement(); System.out.println(str+“:”+ 平衡。得到(str); } System.out.println(); //把1000英镑存入约翰·多伊的账户 ***bal=((Double)balance.get(“John Doe”).doubleValue()*** 余额。put(“John Doe”,新双精度(bal+1000)); System.out.println(“John Doe的新余额:”+ 平衡。获取(“约翰·多伊”); } } 第行bal=((Double)balance.get(“johndoe”)).doubleValue()双重值的用途是什么?(我知道它会将对象转换为双值)但若我不使用这个,程序运行正常 (如果我错了,请纠正我)平衡。获取在这里获取一个双值对象3434.34,并且(double)在它前面进行解装箱并将其转换为双值对象,那么doubleValue()如何以及为什么将此双值对象3434.34视为对象

关于哈希表中doublevalue()的混淆 //演示哈希表 导入java.util.*; 类HTDemo{ 公共静态void main(字符串参数[]){ 哈希表余额=新哈希表(); 枚举名称; 字符串str; 双bal; 余额.put(“John Doe”,新双(3434.34)); 平衡。推杆(“汤姆·史密斯”,新双(123.22)); 余额.认沽期权(“Jane Baker”,新双精度(1378.00)); 平衡推杆(“托德霍尔”,新双人(99.22)); 平衡。推杆(“拉尔夫·史密斯”,新双(-19.08)); //在哈希表中显示所有余额。 name=balance.keys(); while(names.hasMoreElements()){ str=(字符串)names.nextElement(); System.out.println(str+“:”+ 平衡。得到(str); } System.out.println(); //把1000英镑存入约翰·多伊的账户 ***bal=((Double)balance.get(“John Doe”).doubleValue()*** 余额。put(“John Doe”,新双精度(bal+1000)); System.out.println(“John Doe的新余额:”+ 平衡。获取(“约翰·多伊”); } } 第行bal=((Double)balance.get(“johndoe”)).doubleValue()双重值的用途是什么?(我知道它会将对象转换为双值)但若我不使用这个,程序运行正常 (如果我错了,请纠正我)平衡。获取在这里获取一个双值对象3434.34,并且(double)在它前面进行解装箱并将其转换为双值对象,那么doubleValue()如何以及为什么将此双值对象3434.34视为对象,java,casting,hashtable,type-conversion,unboxing,Java,Casting,Hashtable,Type Conversion,Unboxing,集合只处理对象类型,而不处理原始类型,这是创建包装类的原因之一,您不能存储3.4,但可以存储newdouble(3.4),是的,正如您所说,您可以使用不带doubleValue的值,但这是一种标准的操作方式。对于隐式调用和转换,不同版本的JVM/jre在这种情况下的行为可能略有不同,为了避免它们,您希望以标准方式进行操作,以免受到影响我不确定是否正确回答了您的问题。我将试着从我理解你的问题的角度来解释 是的,您是对的,您不需要doubleValue()。这只是一种显式地告诉Java取消装箱的方法

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

我不确定是否正确回答了您的问题。我将试着从我理解你的问题的角度来解释

  • 是的,您是对的,您不需要doubleValue()。这只是一种显式地告诉Java取消装箱的方法。如果不使用
    doubleValue()
    ,Java将自动取消装箱。因此,如果Java不支持将基本类型自动[取消]装箱到相应的对象类型,那么您将需要
    doubleValue()
    作为
    (Double)balance.get(“John Doe”)
    将返回一个对象,而
    bal
    是基本类型的变量
  • 对于问题的第二部分,在Java中,double是一种基本数据类型,
    double
    是一种对象类型。Java集合API和哈希表只存储对象。它们不存储基元类型。因此,
    balance.get()
    返回一个对象。将其强制转换到另一个类型为
    Double
    的对象中。由于Java提供了自动装箱/拆箱,因此这里的
    doubleValue()
    方法是可选的
  • 希望这有帮助

  • 行内bal=((Double)balance.get(“John Doe”).doubleValue();doubleValue的用途是什么(知道它将对象转换为doubleValue) 但如果我不使用这个,程序运行正常
  • (如果我错了,请纠正我)
    balance.get()
    获取一个值为3434.34的双精度对象,它前面的(双精度)对象执行取消装箱操作
  • 没有。没有
    (双)
    。有
    (双)
    。该类型将其从
    Object
    转换为
    Double

    并将其转换为双对象

    双倍价值

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

    那么doubleValue()如何以及为什么将这个double 3434.34视为对象

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


    这段代码根本不使用自动装箱。这段代码中的
    doublevalue()。它也不使用泛型。我怀疑您正在查看一些非常旧的代码

    请多花点时间格式化您的问题,这样您会得到更好的帮助。您考虑过使用HashMap()吗?它更快(不同步),泛型可以让您避免类型转换。不同的JVM不会有行为不同的风险。装箱和拆箱由javac编译器完成,而不是JIT编译器。看见方法
    doubleValue()
    之所以存在,是因为自动装箱和取消装箱只是语法上的糖分——这不是进行转换的“标准”方式,而是实际的方式。感谢Greg的澄清:)