英文:
A trap of remove and size of hashmap in Java?
问题
根据代码显示:
我不理解为什么在第一个映射中,大小是100(在remove()之后),但在第二个映射中,大小是1而不是2。这是因为哈希映射中存储的数据类型之间的差异吗?
public class test {
public static void main(String[] args) {
Map<Short, String> map = new HashMap<Short, String>();
for (short i = 0; i < 100; i++) {
map.put(i, String.valueOf(i));
map.remove(i - 1);
}
Map<Integer, Integer> hashmap = new HashMap<>();
hashmap.put(3, 4);
hashmap.put(4, 5);
hashmap.remove(3);
System.out.println(hashmap.size());
System.out.println(map.size());
}
}
帮助我!
英文:
As the code shows:
I don't understand why in the first map, the size is 100(after remove()), but in the second map, the size is 1 instead of 2. Is that because of the difference between data type stored in hashmap or?
public class test {
public static void main(String[] args) {
Map<Short, String> map = new HashMap<Short, String>();
for (short i = 0; i < 100; i++) {
map.put(i, String.valueOf(i));
map.remove(i - 1);
}
Map<Integer, Integer> hashmap = new HashMap<>();
hashmap.put(3,4);
hashmap.put(4,5);
hashmap.remove(3);
System.out.println(hashmap.size());
System.out.println(map.size());
}
}
Help me!
答案1
得分: 8
i-1
是一个 int
表达式,即使 i
是一个 short
。
这意味着实际上你在调用 map.remove(Integer.valueOf(i - 1))
。
一个 Integer
对象永远不会等于一个 Short
对象,即使它们有相同的值,所以 remove
调用会失败(即不会移除任何内容)。
相反,你应该写成 map.remove((short) (i-1));
。
为什么 map.remove()
甚至接受不是键类型的对象是 一个不同的问题。
英文:
i-1
is an int
expression, even if i
is a short
.
That means you effectively call map.remove(Integer.valueOf(i - 1))
.
An Integer
object is never equal to a Short
object, even if they have the same value, so the remove
call will fail (i.e. not remove anything).
Instead you should write map.remove((short) (i-1));
.
Why map.remove()
even accepts objects that are not of the type of the key is a different question.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论