关于哈希表中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将自动取消装箱。因此,如果Java不支持将基本类型自动[取消]装箱到相应的对象类型,那么您将需要doubleValue()
作为(Double)balance.get(“John Doe”)
将返回一个对象,而bal
是基本类型的变量double
是一种对象类型。Java集合API和哈希表只存储对象。它们不存储基元类型。因此,balance.get()
返回一个对象。将其强制转换到另一个类型为Double
的对象中。由于Java提供了自动装箱/拆箱,因此这里的doubleValue()
方法是可选的balance.get()
获取一个值为3434.34的双精度对象,它前面的(双精度)对象执行取消装箱操作(双)
。有(双)
。该类型将其从Object
转换为Double
并将其转换为双对象
对
双倍价值
不,它是一个对象而不是一个值。这句话毫无意义
那么doubleValue()如何以及为什么将这个double 3434.34视为对象
没有。它调用Double.doubleValue(),返回一个Double
这段代码根本不使用自动装箱。这段代码中的
doublevalue()。它也不使用泛型。我怀疑您正在查看一些非常旧的代码 请多花点时间格式化您的问题,这样您会得到更好的帮助。您考虑过使用HashMap()吗?它更快(不同步),泛型可以让您避免类型转换。不同的JVM不会有行为不同的风险。装箱和拆箱由javac编译器完成,而不是JIT编译器。看见方法doubleValue()
之所以存在,是因为自动装箱和取消装箱只是语法上的糖分——这不是进行转换的“标准”方式,而是实际的方式。感谢Greg的澄清:)