如何在Java中打印变量的地址

时间:2015-10-24 06:24:19

标签: java collections linked-list

由于&a可以获得C中变量(即int a)的地址。

如何在Java中完成?对于Eg。链表的元素是不连续的。我们如何打印使用Collections Framework创建的链表的元素地址?

如果上述情况不可能,我们怎样才能证明数组的元素是连续的而链表的元素不是?

4 个答案:

答案 0 :(得分:5)

在Java中获取任何原始变量或对象的地址是不可能的。您所能做的就是使用System.identityHashCode(a)获取默认对象哈希码(通常与其地址相关,但不保证)。

答案 1 :(得分:3)

java语言中没有任何元素允许你获取任何地址,而更重要的是没有语言元素需要任何地址。这就是为什么java中没有address-of运算符的原因。整个语言设计为无需工作。

内存地址的整个概念在java中被抽象出来;您可以获得的最近引用,但这仅限于实际对象。虽然引用的值实际上是一个内存地址(或者至少可以很容易地转换为内存地址,请参阅压缩的OOPS),但无法将该值转换为其他内容。而且,除了可能满足你的好奇心之外,不需要可以做到这一点。

然而,通过使用(注意:不可移植,不适合实际公共使用!)java.sun.misc.Unsafe,这个类允许将引用的值转换为long(表示内存地址) )。可以在此处找到使用它的示例:https://dzone.com/articles/understanding-sunmiscunsafe

答案 2 :(得分:2)

无法获取Java中任何内容的内存地址。所有被JVM隐藏的东西,你永远不必担心它 即使你能得到它,你也无法做任何事情......

相反,您可以通过其他方式识别对象,通常是通过实现equals()和hashCode()方法。

答案 3 :(得分:0)

此数据来自JAVA DOC>

这与使用ARRAYLIST时的功能相加 public boolean add(E e) 将指定的元素追加到此列表的末尾。 具体说明: 添加接口集合 具体说明: 添加接口列表 覆盖: 在类AbstractList

中添加

使用LINKEDLIST时添加()功能

public boolean add(E e) 将指定的元素追加到此列表的末尾。 此方法等同于addLast(E)。 具体说明: 添加接口集合 具体说明: 添加接口Deque 具体说明: 添加接口列表 具体说明: 添加接口队列

在这种情况下你可以看到添加()工作不同。 在ARRAYLIST中它仅使用列表和集合接口。

但是在链接列表中使用DEQUE和QUEUE INTERFACE意味着内部java实际上是在创建一个节点并且非连续地插入它。

希望你得到答案。