Scala中如何获取并打印List类型对象的内存地址引用
Scala 获取List实例内存地址的实现方法
Scala 运行在JVM平台之上,标准库没有直接提供获取对象内存地址的原生API,你可以通过以下两种方案实现需求:
方案1:使用JDK自带的System.identityHashCode()(无第三方依赖)
该方法返回的是对象的身份哈希值,默认与对象的内存地址强关联,可以作为内存地址的近似标识使用,适合普通场景快速验证实例是否为同一个对象。
代码示例:
val fruits: List[String] = List("apple", "orange", "pear") // 转换为十六进制输出更符合常规内存地址的展示格式 println(s"fruits实例的近似内存地址标识:0x${System.identityHashCode(fruits).toHexString}")
注意:该结果和
fruits.hashCode()的返回值完全不同。Scala的List重写了hashCode()方法,会基于集合内的元素内容计算哈希值,两个内容完全相同的不同List实例会返回相同的hashCode(),但System.identityHashCode()是基于实例本身生成的,不同实例返回的结果一定不同。
验证示例:
val fruits1: List[String] = List("apple", "orange", "pear") val fruits2: List[String] = List("apple", "orange", "pear") // 内容相同,hashCode一致 println(s"fruits1的内容哈希值:${fruits1.hashCode()}") println(s"fruits2的内容哈希值:${fruits2.hashCode()}") // 实例不同,identityHashCode不一致 println(s"fruits1的实例标识:0x${System.identityHashCode(fruits1).toHexString}") println(s"fruits2的实例标识:0x${System.identityHashCode(fruits2).toHexString}")
方案2:使用JOL工具获取精确内存地址
如果你需要获取对象的真实精确内存地址、查看对象内存布局,可以使用OpenJDK的JOL(Java Object Layout)工具,适合底层内存分析、性能调优场景使用。
代码示例:
import org.openjdk.jol.info.ClassLayout import org.openjdk.jol.util.VMSupport val fruits: List[String] = List("apple", "orange", "pear") // 打印对象完整内存布局 println(ClassLayout.parseInstance(fruits).toPrintable()) // 直接输出精确内存地址 println(s"fruits实例的精确内存地址:0x${VMSupport.addressOf(fruits).toHexString}")
使用该方案需要先在项目中引入JOL的相关依赖即可。
内容的提问来源于stack exchange,提问作者sahar karimzadeh
相关产品推荐
相关产品推荐

