当我得到一个奇怪的输出时,我执行了下面提到的代码。任何人都可以解释为什么我得到这个输出?
代码:
public class Bar {
static void foo( int... x ) {
System.out.println(x);
}
static void foo2( float... x ) {
System.out.println(x);
}
public static void main(String args[])
{
Bar.foo(3,3,3,0);
Bar.foo2(3,3,3,1);
Bar.foo(0);
}
}
输出
[I@7a67f797
[F@3fb01949
[I@424c2849
为什么我们要获取"[I@"
/ "[F@"
前缀和8个字母数字字符,它们是内存地址吗?
答案 0 :(得分:7)
Java数组有toString()
方法,它只显示数组的类型([I
),后跟@
,后跟数组的哈希码({{1} }})。这个值几乎毫无意义。 7a67f797
是调用传递给toString()
的每个对象的方法。
如果要查看数组的内容,请使用System.out.println()
。
答案 1 :(得分:3)
float...
是float[]
的语法糖,所以
System.out.println(x);
...正在尝试输出一个数组。所以你得到default toString
behavior of objects,而不是数组中的值。
要输出数组,要么循环遍历它,要么使用类似Arrays.toString
的内容:
System.out.println(Arrays.toString(x));
...以及要遵循的8个字母数字字符,它们是内存地址吗?
不,它们只是对象的哈希码(the first link above中有这个内容)。
答案 2 :(得分:1)
使用它来查看数组中的值。
System.out.println(x[0]);
System.out.println(x[1]);
....
System.out.println(x[3]);
答案 3 :(得分:1)
1)foo(int ... x)被称为varargs(变量参数)。编译器用实际的Bar.foo替换Bar.foo(3,3,3,0)(new int [] {3,3,3,0})
2)您正在打印float和int数组。它们从Object继承toString:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
[I
和[F
是int []和float []的类名,试试这个
System.out.println(float[].class.getName());
输出
[F