在java中,为什么打印Integer数组对象会给出哈希代码,而char数组对象会给出值?
下面是代码片段在java中,为什么打印Integer数组对象会给出哈希代码,而char数组对象会给出值?,java,arrays,Java,Arrays,下面是代码片段 public class Test1 { public static void main(String[] args) { // TODO Auto-generated method stub char[] a={'a','b','c',97,'a'}; System.out.println(a); int[] a1={8,6,7}; System.out.println(a1);
public class Test1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
char[] a={'a','b','c',97,'a'};
System.out.println(a);
int[] a1={8,6,7};
System.out.println(a1);
Integer[] b={10,20,30};
System.out.println(b);
}
}
这是输出
abcaa
[I@239d5fe6
[Ljava.lang.Integer;@5527f4f9
我知道它必须处理toString()
方法。已在char中重写它以返回值。因此,我们得到了预期的第一个输出
下面是java.lang.Character
的重写toString()
方法
public String toString() {
char buf[] = {value};//The value of the Character.
return String.valueOf(buf);
}
但是看整数,还有被重写的toString()
方法
public String toString() {
return String.valueOf(value); //The value of the Integer.
}
那么为什么打印a1和b代码会调用对象类的默认toString()
实现,即:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
另外,由于valueOf生成另一个对象,但这在两种重写方法中都很常见。因为有一种用于打印字符数组的专用方法:
public void println(char[]x)
打印一个字符数组,然后终止该行。这种方法
其行为就像调用print(char[])
然后调用println()
参数:x
-要打印的字符数组
实施:
它与
toString
实现char[]
类无关。这是因为调用时:
int[] a1={8,6,7};
System.out.println(a1);
您正在调用Integer[].toSTring()
而不是Integer.toSTring()
您需要在元素上的每个元素上循环,或者重写Integer[].toSTring()
以在其每个元素上调用toSTring()
如果你写下:
System.out.println(a1[0]);
System.out.println(a1[1]);
System.out.println(a1[2]);
它将打印您期望的输出。有一个打印char[]的特定方法,但没有打印int[]或其他一些数组的方法,因此在处理非fo-type char[]的数组时,您将调用对象作为参数的方法,该方法将委托给toString()
不在单个元素上迭代的方法
如果希望始终打印阵列的内容,则有一个标准api
System.out.println(array.toString(array))
因为您没有调用int的toString或Integer的toString,所以您调用的是Integer[]toString。这将创建存储在数组中的对象的文本表示,而不是存储的单个对象的值的文本表示 这是因为在
java.io.PrintSream
类中,您有一个char[]
/**
* Prints an array of characters and then terminate the line. This method
* behaves as though it invokes <code>{@link #print(char[])}</code> and
* then <code>{@link #println()}</code>.
*
* @param x an array of chars to print.
*/
public void println(char x[]) {
synchronized (this) {
print(x);
newLine();
}
}
最后调用一个内部方法
private void write(char buf[]) {
try {
synchronized (this) {
ensureOpen();
textOut.write(buf);
textOut.flushBuffer();
charOut.flushBuffer();
if (autoFlush) {
for (int i = 0; i < buf.length; i++)
if (buf[i] == '\n')
out.flush();
}
}
}
catch (InterruptedIOException x) {
Thread.currentThread().interrupt();
}
catch (IOException x) {
trouble = true;
}
}
因为您正在将这些对象转换为字符串。您应该使用java.util.array的toString()方法 比如: “阵列.toString(a1);
toString(b)”。尝试实际添加您正在谈论的文本部分,而不是仅仅让链接代码>在打印时,它被传递到
println(Object o)
方法的对象参数中,因此调用默认对象toString()
方法,从而将hashCode作为输出。而如果我写整数a=新的整数(10)
和print a,它被传递到println(Object o)
的对象参数中,但由于Integer已重写toString()
方法,因此它将10作为输出,而不是哈希代码。正确的?如果我误解了这一点,请告诉我,为什么char[]
打印正确,这个答案没有解释。因为上面已经给出了答案。再加一个是多余的。嗯,下层选民的想法不同。也许他们会在你的评论后恢复投票。这个答案没有解释为什么char[]
打印正确。@Tom你是对的,我编辑了我的回答。可能下层选民现在会恢复投票。你为什么要添加两个答案。您已经回答了,您可以编辑此答案。@Loki要跟踪我的错误答案是否有名为Integer[]的内容。toSTring()
?我在任何地方都没有看到过~它没有定义,这就是为什么你会得到默认行为@AnkurAnandi理解这一点。在我对公认答案的评论中也指出了这一点。如果我在那里的任何地方错了,就告诉我@不,我想你明白了。恭喜你!
private void write(char buf[]) {
try {
synchronized (this) {
ensureOpen();
textOut.write(buf);
textOut.flushBuffer();
charOut.flushBuffer();
if (autoFlush) {
for (int i = 0; i < buf.length; i++)
if (buf[i] == '\n')
out.flush();
}
}
}
catch (InterruptedIOException x) {
Thread.currentThread().interrupt();
}
catch (IOException x) {
trouble = true;
}
}
public void println(Object x) {
String s = String.valueOf(x);
synchronized (this) {
print(s);
newLine();
}
}