【问题标题】:Why does ArrayList print the actual value and not the memory address?为什么 ArrayList 打印实际值而不是内存地址?
【发布时间】:2021-04-12 03:44:41
【问题描述】:
在 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);
}
【问题讨论】:
标签:
java
arraylist
reference
【解决方案1】:
两个原因
- 因为
Object.toString() 方法已被覆盖。
- 因为javadocs 表示任何扩展
AbstractCollection 类的类型的toString() 方法将显示集合的内容,而不是它的“地址”。
除此之外Object.toString() 并没有实际显示地址。它显示身份哈希码,可能与对象的地址相关,也可能不相关。 (并且两个不同的对象可以具有相同的身份哈希码,因此不能可靠地指示对象是否相同。)
如果您想测试两个对象引用(任何类型)是否引用同一个对象,请使用==。
您不需要查看地址,即使您知道如何获取对象的真实地址...对象地址在 GC 移动它们时会发生变化,因此这可能不是 100% 可靠的方法测试对象。
【解决方案2】:
您可以自己发现原因。只需按照文档操作即可。
println 方法采用 String 对象。见its Javadoc。引用:
打印一个对象,然后终止该行。此方法首先调用 String.valueOf(x) 以获取打印对象的字符串值,然后表现得好像它调用 print(String) 然后调用 println()。
这意味着对您传递给println 的集合对象上的toString 方法进行了调用。
因此请查看ArrayList 继承的toString 方法的Javadoc。引用:
返回此集合的字符串表示形式。字符串表示由集合元素的列表组成,按其迭代器返回的顺序排列,用方括号 ("[]") 括起来。相邻元素由字符“、”(逗号和空格)分隔。通过 String.valueOf(Object) 将元素转换为字符串。