我们是否可以直接或间接地访问Java中的内存位置?
如果我们尝试打印一个对象,它将打印哈希码。哈希码是否间接表示内存位置?
对于两个位于不同内存位置的对象,它们的哈希码仍然可能不同。
-阿比舍克
我们是否可以直接或间接地访问Java中的内存位置?
如果我们尝试打印一个对象,它将打印哈希码。哈希码是否间接表示内存位置?
对于两个位于不同内存位置的对象,它们的哈希码仍然可能不同。
-阿比舍克
在Java中,我们是否可以直接或间接地访问内存地址?
不行。
不,一般情况下,哈希码与内存位置无关。对象的内存位置是对象本身的引用。
然而,也许并不完全不可能挤出实际位置。根据Java文档,Java Object
的哈希码通常是通过将对象的内部地址转换为整数来实现的,但这种实现技术并不是Java编程语言所必需的。并且有一个 System#identityHashCode(Object)
方法,它将返回与默认方法hashCode()(即Object
的hashCode())返回相同的给定对象的哈希码。因此,通过这种方式,您确实可以获得实际的内存位置。但是,是否有效取决于具体实现。而且,即使您知道了位置,您绝对无法直接读写内存,那么您会怎么做呢?
对于基本数据类型可能不适用。但是对于引用类型,可以通过Java本机接口获取用于对象存储的数据区域的地址,从C++或C中获取内存位置。
然而这样做有点毫无意义。由于垃圾回收,任何Java对象都可能在任何线程创建新对象时随时移动到内存中的其他位置。
如果提供了某些API,您可以读取/写入内存地址。在Sun / Oracle JRE上,sun.misc.Unsafe
允许您执行此操作,尽管故意使您必须通过一些步骤才能获得实例。