2012-01-06 40 views

回答

2

第二个问题的答案是肯定的,你在Eclipse的调试器中看到的“id”唯一标识一个对象,所以其中的变化意味着创建了一个新对象。因此,例如:

Integer i = 55; 
Integer j = new Integer(55); 
Integer k = Integer.valueOf(55); 

这里我和k会有相同的id,因为它们指的是同一个对象; j会有所不同。

由于对象在内存中移动,这些对象之一的内存地址并不是真正有用的信息。所有你能知道的是,如果我== K,他们是同一个对象。 (所以在这里,我== K,但我!= J)。

6

为什么你需要在Java中的任何对象的内存地址?你只能说Integer实例在堆中。你找不到确切的地址。

第二个问题:是的,Integer对象是不可变的,所以当Integer类型的变量的值发生改变时,它意味着它指向Integer的不同实例。然而,这并不一定意味着新实例是创建的new Integer(42)总是会创建一个新实例,而Integer.valueOf(42)将在每次调用时创建相同的实例。

+2

除此之外,由于垃圾收集会移动物体以合并空闲空间,因此地址可能会随时间而变化。 – 9000 2012-01-06 21:31:02

+0

我有一个问题,它如何指向不带'Integer'的第一个被创建的'Integer'的不同实例? – JAM 2012-01-06 21:35:44

+0

'Integer x = 42'实际上被转换为'Integer x = Integer.valueOf(42)' - 它可以*创建一个新的实例或使用缓存的实例。 – 2012-01-06 21:38:06

0

除非你有一个离JVM开发团队非常近的人,否则你不能找出引用变量中存储了什么类型的数据/地址。我们需要的只是访问驻留在该引用中的对象并对其进行操作/执行。

我不确定你的问题的第二部分。另外,我无法确认ID(在调试器中)是否指Java堆内存位置。

相关问题