【问题标题】:How to print address of a variable in Java如何在Java中打印变量的地址
【发布时间】:2016-01-23 17:57:26
【问题描述】:

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

如何在 Java 中做到这一点?例如。链表的元素是不连续的。我们如何打印使用 Collections Framework 创建的链表的元素地址?

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

【问题讨论】:

  • 这在 Java 中没有意义,因为垃圾收集器可以移动对象。

标签: java collections linked-list


【解决方案1】:

此数据取自 JAVA 文档>

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

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

公共布尔加法(E e) 将指定元素附加到此列表的末尾。 此方法等效于 addLast(E)。 指定者: 加入接口Collection 指定者: 添加接口 Deque 指定者: 添加接口列表 指定者: 添加接口队列

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

但在使用 DEQUE 和 QUEUE 接口的 LINKEDLIST 案例中,这意味着 java 在内部实际上是在创建一个节点,并且不连续地插入它。

希望你能得到答案。

【讨论】:

    【解决方案2】:

    Java 语言中没有任何元素可以让您获取任何东西的地址,更重要的是没有任何语言元素需要任何东西的地址。这就是为什么java中没有地址运算符的原因。整个语言的设计都是为了在没有的情况下工作。

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

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

    【讨论】:

      【解决方案3】:

      在 Java 中无法获取任何东西的内存地址。 JVM 隐藏的所有内容,您无需担心。
      即使你能得到它,你也无能为力......

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-25
          • 1970-01-01
          • 2016-07-06
          • 1970-01-01
          • 2019-07-30
          • 2022-11-09
          相关资源
          最近更新 更多