作为一名新的Java程序员,在处理Euler问题时,我遇到了一些与打印数组有关的特殊内容。
我不明白为什么会发生这种情况 - 个别值在单独打印时看起来是正确的,但toString()
显然正在创建一个不符合我预期的字符串。
我原本期望编译错误,或者将数组放入连接列表中。这些都没有发生。
注意:我对"如何打印数组不感兴趣?"而是理解为什么toString()
不打印数组。网上有大量资源可供查找。
public class example {
public static void main(String[] args) {
/* Setup a string/int array converion*/
int i=0;
String nums = "123456";
char[] splitNums = nums.toCharArray();
int[] ints = new int[nums.length()];
for (char c : splitNums) {
ints[i++] = Character.digit(c,10);
}
//Print using the string/char[]
System.out.println(nums);
System.out.println(splitNums);
//Values are clearly there
for (int j : ints){
System.out.println(j);
}
//What is toString() doing?
System.out.println(ints.toString());
}
}
输出:
123456
123456
1
2
3
4
5
6
[I@4b71bbc9
答案 0 :(得分:3)
您看到的输出[I@4b71bbc9
是方法Object.toString()
的输出。数组是Java中的对象,但它们没有自己的toString()
方法实现 - 所以调用java.lang.Object
的版本,打印出这种输出(参见{ {3}})。
要打印数组,请改为:
System.out.println(Arrays.toString(ints));
答案 1 :(得分:2)
toString()
。由于ints
是一个数组(被视为对象)而不是原始数据。
当ints
置于println
语句中时,将调用从类对象继承的toString()
方法,打印您在屏幕上看到的内容。
那为什么它继承自Class Object?
这是因为Java中的每个类都隐式地从Class Object扩展。
要使用println语句打印数组,可以执行以下操作:
System.out.println(Arrays.toString(arrayName));
它会很好地打印出格式化的数组:
示例:强>
[0, 1, 2, 3, 4]
toString()方法返回对象的字符串表示形式。通常,toString方法返回一个“文本表示”此对象的字符串。结果应该是一个简洁但信息丰富的表示,便于人们阅读。
- 来自toString的API -
因此,通常,toString()
方法使打印对象有意义且可在文本上理解对象所代表的内容。但是,在打印String对象和char数组等对象时会有一些例外。原因是不言自明的(String已经在String中)