在 Java 中,我理解原始数据类型存储为值,其余存储为引用。那为什么打印ArrayList实例变量时得到的是实际值而不是内存地址呢?我有一个仅用于比较目的的数组变量。
public static void main(String[] args) {
Object[] a = new Object[3];
a[0] = 0;
a[1] = 1;
a[2] = 2;
ArrayList<Object> b = new ArrayList<Object>();
b.add(3);
b.add(4);
System.out.println(a);
System.out.println(b);
}
答案 0 :(得分:1)
两个原因
Object.toString()
方法已被覆盖。toString()
类的任何类型的 AbstractCollection
方法将显示集合的内容,而不是其“地址”。除此之外,Object.toString()
实际上并不显示地址。它显示身份哈希码,可能与对象的地址相关,也可能不相关。 (并且两个不同的对象可以具有相同的身份哈希码,因此对象是否相同并不是一个可靠的指标。)
如果要测试两个对象引用(任何类型)是否引用同一个对象,请使用 ==
。
您不需要查看地址,即使您弄清楚如何获取对象的真实地址...对象地址会在 GC 移动它们时发生变化,因此这可能不是 100% 可靠的方法测试对象。</p>
答案 1 :(得分:1)
你可以自己发现原因。只需按照文档操作即可。
println
方法接受一个 String
对象。见its Javadoc。引用:
打印一个对象,然后终止该行。此方法首先调用 String.valueOf(x) 以获取打印对象的字符串值,然后其行为就像调用 print(String) 和 println() 一样。
这意味着对传递给 toString
的集合对象的 println
方法进行调用。
因此,请查看 ArrayList
继承的 toString
方法的 Javadoc。引用:
返回此集合的字符串表示形式。字符串表示由集合元素的列表组成,按其迭代器返回的顺序排列,括在方括号(“[]”)中。相邻元素由字符“,”(逗号和空格)分隔。元素通过 String.valueOf(Object) 转换为字符串。
答案 2 :(得分:0)
这是因为它实现了 toString()
方法。默认输出是哈希码。 Memory Address of Objects in Java 文档如何获取内存地址