2

我想存储项目的 ID 及其相应的坐标。为此,我使用了一个 TreeMap,其中 Coordinates 是一个包含 int x 和 int y 的类。现在,为了将数据插入地图,我可以写:

treeMapObject.put(5,new BasicRow(30,90));

还是我必须写:

treeMapObject.put(new Integer(5),new BasicRow(30,90));

我猜只有第二个是正确的,因为地图处理对象。但现在的问题是,假设我有以下代码:

treeMapObject.put(new Integer(5),new BasicRow(30,90));
treeMapObject.put(new Integer(5),new BasicRow(45,85));

在这种情况下会发生什么?

4

3 回答 3

7

实际上这两个版本都是正确的,因为您的 Java 编译器将为您执行所谓的“自动装箱”:如果您提供一个 int,其中需要一个 Integer,java 会自动为您将该 int 包装在一个 Integer 对象中。反之亦然(已在 Java 5 中引入。如果您使用甚至不应该编译的旧 Java 版本。)。

对于您的第二个问题:您首先添加的条目将被覆盖。

于 2011-06-28T06:53:12.183 回答
1

yankee是对的,两者都可以工作,因为 Java 会将整数值自动装箱到一个Integer对象中。

请注意,如果您想显式执行此操作,最好编写:

Integer a = Integer.valueOf(5);

代替:

Integer a = new Integer(5);

如果使用valueOf,则类Integer可以避免创建新Integer对象,它将Integer从其内部缓存中返回一个预先存在的对象,这比创建新对象更有效。

于 2011-06-28T07:04:40.840 回答
0

存在细微差别,不会影响地图的行为。在这两种情况下,如果您尝试获取整数 5 的值,则映射将返回该基本行。

The difference: the second line will always create a new instance of Integer while the first one may insert an existing instance. But maps compare by equality, not by identity, so it actually doesn't matter. Just that the first line has a (very) small postive impact on memory consumption.

于 2011-06-28T07:07:47.590 回答