如果Integer i = 88
,内存地址i
位于什么位置?
此外,如果作为调试器的一部分,id
号码更改,是否表示创建了新对象?
答案 0 :(得分:6)
为什么需要Java中任何对象的内存地址?你只能说Integer
实例位于堆中。你找不到确切的地址。
第二个问题:是的,Integer
个对象是不可变的,所以当Integer
类型的变量的值发生变化时,它意味着它指向Integer
的不同实例。但是,这并不一定意味着创建的新实例。 new Integer(42)
始终创建一个新实例,而Integer.valueOf(42)
每次调用时都会创建相同的实例。
答案 1 :(得分:2)
你的第二个问题的答案是肯定的,你在Eclipse的调试器中看到的“id”唯一地标识了一个对象,因此它的变化意味着创建了一个新对象。所以,例如:
Integer i = 55;
Integer j = new Integer(55);
Integer k = Integer.valueOf(55);
这里我和k将具有相同的id,因为它们引用相同的对象; j会有所不同。
其中一个对象的内存地址实际上并不是一个有用的信息,因为对象在内存中移动。你可以知道的是,如果i == k,它们就是同一个对象。 (所以在这里,我= = k但是我!= j)。
答案 2 :(得分:0)
除非你有一个非常接近JVM开发团队的人,否则你无法找到参考变量中存储的数据/地址类型:)。我们所需要的只是访问驻留在该引用中的对象并操纵/执行它。
我不确定你问题的第二部分。另外,我无法确认ID(在调试器中)是否引用了Java堆内存位置。