如何在 Java 中打印变量地址

How to print address of a variable in Java

作为C中变量(即int a)的地址可以通过&a获取。

如何在 Java 中完成此操作?对于例如。链表的元素是不连续的。我们如何打印使用集合框架创建的链表元素的地址?

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

无法获取Java中任何原始变量或对象的地址。您所能做的就是使用 System.identityHashCode(a).

获取默认对象哈希码(通常与其地址相关,但不能保证)

无法获取 Java 中任何内容的内存地址。所有这些都被 JVM 隐藏,您永远不必担心。
就算得到了,也无能为力...

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

java 语言中没有任何元素允许您获取任何内容的地址,更重要的是 没有任何语言元素需要任何地址.这就是为什么 java 中没有寻址运算符的原因。整个语言被设计成没有工作。

内存地址的整个概念在java中被抽象出来;您可以获得的 closestreference,但这仅限于实际对象。虽然引用的值实际上是一个内存地址(或者至少是一些可以轻松转换为内存地址的东西,请参阅压缩的 OOPS),但没有办法将该值转换为其他任何内容。再一次,没有必要这样做,除非是为了满足你的好奇心。

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

此数据取自 JAVA DOC>

此 add() 功能与 ARRAYLIST 一起使用时 public 布尔加法(E e) 将指定的元素附加到此列表的末尾。 指定者: 在接口Collection中添加 指定者: 加入界面列表 覆盖: 添加 class AbstractList

此 add() 功能与 LINKEDLIST 一起使用时的功能

public 布尔加法(E e) 将指定的元素附加到此列表的末尾。 此方法等同于 addLast(E)。 指定者: 在接口Collection中添加 指定者: 在接口Deque中添加 指定者: 加入界面列表 指定者: 加入接口Queue

在这两种情况下,您都可以看到 add() 的工作方式不同。 在 ARRAYLIST 中,它仅使用列表和集合接口。

但在 LINKEDLIST 情况下,它使用 DEQUE 和 QUEUE 接口意味着在内部 java 实际上是在创建一个节点并非连续地插入它。

希望你能得到答案。