hashmap.get(0)和hashmap.get(0l)之间有什么区别? 我有: hashmap

问题描述 投票:0回答:3
当我使用此模式在索引0中获取元素时:

MYChainInformation MyData = CHAIN_INFORMATION.get(0);

MyData

是无效的,但是通过这个电话,我会得到我的元素:
MYChainInformation MyData = CHAIN_INFORMATION.get(0L);

我的Java版本是JDK17。有什么区别?

    

正如在另一个答案中指出的那样,Java中的地图不能基于索引工作。您正在做的是没有获得“
Index
0”中的元素,而是获得与

Key的元素相关联的“ 0”。

java collections hashmap
3个回答
9
投票
HashMap.get()

接收Object作为键,这意味着您的值0

(这是一个typetype

)需要由编译器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

2
投票
Map

Long

对象将永远不匹配。错误的类型 Auto-Boxing


2
投票
Integer

0

作为参数时,您正在传递数字文字,一个原始价值。

数字文字是类型的原始值。
数字文字是类型的原始值。
您将原始值传递给采用
0L
对象而不是原始的方法。您将地图定义为在声明中使用键的对象:
0

因此,我们有一种期望对象的方法,但是您传递了原始值,而不是对象。那么为什么您的代码编译呢?因为编译器为您提供了帮助。编译器将您的每个数字文字原始值转换为对象。编译器使用

auto-boxing

TO:
概述原始
int

0L

to其包装类别的对象

long

概述原始
Map#get

    Long
  • to其包装类别的对象
    Long
  • 在第一种情况下,您有效地将一个对象传递给了
    HashMap<Long,…
    方法。但是您的地图仅包含
    int
    键。一个
  • 0
对象

cannot

等于
Integer
对象。即使它们包含与零相同的数字,不同的类也意味着对象是不同的,从不相等。
so通过
long
原始
0L
永远不会匹配

Long

键,而传递Integer原始

Map#get希望它有帮助!!

	
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.