MYChainInformation MyData = CHAIN_INFORMATION.get(0);
MyData
MYChainInformation MyData = CHAIN_INFORMATION.get(0L);
我的Java版本是JDK17。有什么区别?
正如在另一个答案中指出的那样,Java中的地图不能基于索引工作。您正在做的是没有获得“
Index0”中的元素,而是获得与
Key的元素相关联的“ 0”。
HashMap.get()
接收Object
作为键,这意味着您的值0
)需要由编译器auto-boxed。由于
0
是一个int
,因此使用
Integer.valueOf(0)
转换。这导致类的实例
Integer
传递给您的地图。
否,您的地图被定义为Long
键的地图,并且由于定义永远不等于
Integer
,因此找不到任何匹配。通过将您的值指定为
Long
,您将其定义为(原始)0L
,然后将其转换为一个实例,可以成功地将其与现有密钥相比。
.get()方法返回与您通过.get()方法传递的键关联的值,而不是index.
SO,因为您通过0而不是0L,因此在列出了hashmaps grenics中的键时,它会寻找0的整数键。Tl;dr
auto-boxing将原始
long
转换为Long
对象,然后将原始
int
转换为
Integer
对象。对于带有
long
对象键的Long
Map
,
Long
对象将永远不匹配。错误的类型 Auto-Boxing
Integer
0
作为参数时,您正在传递数字文字,一个原始价值。
数字文字是类型的原始值。数字文字是类型的原始值。您将原始值传递给采用
0L
对象而不是原始的方法。您将地图定义为在声明中使用键的对象:0
。
因此,我们有一种期望对象的方法,但是您传递了原始值,而不是对象。那么为什么您的代码编译呢?因为编译器为您提供了帮助。编译器将您的每个数字文字原始值转换为对象。编译器使用auto-boxing
TO:概述原始
int
值0L
long
概述原始
Map#get
值Long
Long
。
HashMap<Long,…
方法。但是您的地图仅包含int
键。一个0
cannot
等于
Integer
对象。即使它们包含与零相同的数字,不同的类也意味着对象是不同的,从不相等。so通过
long
原始0L
永远不会匹配Long
键,而传递Integer
原始
Map#get
Long
获取一个实例
Integer
。
Long
知道Java程序员通常会依靠自动蛋白。这里看到的情况很不寻常,因为自动氧化可能会导致我们的逻辑中的错误。当您创建hashmap时 hashmap链_information = new Hashmap <>();键是长期类型的,当您尝试访问密钥mychaininformation mydata = chain_information.get(0); 上面的语法检查是否存在一个键,其值为零(整数类型),而您创建的键在创建映射时的键为type。因此,它给出无效的值。 但最终添加L时,它将其更改为长时间,这是地图的关键类型。因此,它给出了值