问题
I have
char c1 = 'S'; // S as a character
char c2 = '\u0068'; // h in Unicode
char c3 = 0x0065; // e in hexadecimal
char c4 = 0154; // l in octal
char c5 = (char) 131170; // b, casted (131170-131072=121)
char c6 = (char) 131193; // y, casted (131193-131072=121)
char c7 = '\''; // ' apostrophe special character
char c8 = 's'; // s as a character
char[] autoDesignerArray = {c1, c2, c3, c4, c5, c6, c7, c8};
And
System.out.println(autoDesignerArray + "Mustang");
Output: [C@c17164Mustang
System.out.println(autoDesignerArray);
Output: Shelby's
I'm not understanding why I get the weird output when I concatenate the char array with a string. What is the "[C@c17164"? The location in memory? And why do I get that when I concatenate with a string, but I get what I would expect when I print it alone?
回答1:
The expression System.out.println(X + Y) is equal to the expression
System.out.println(X.toString() + Y.toString()).
When you call System.out.println(autoDesignerArray + "Mustang") autoDesignerArray.toString() (which is "[C@c17164") is concatenated with "Mustang" and the result is printed.
回答2:
Since every has array has a class the string you get is the object representation of its object i.e. [C@c17164Mustang where
[Cis a class name ([represent 1d array)@concates the the stringc17164some hash codeMustangyour string
to check the class name of array do System.out.println(yourArray.getClass().getName());
For ex if you do System.out.println(new Object()); you will get something like java.lang.Object@25154f the string representation of object created.
And to print the actual values of array do System.out.println((java.util.Arrays.toString(autoDesignerArray))); which gives
[S, h, e, l, b, y, ', s]
Demo
回答3:
Arrays in java don't have overwritten toString() method, which means that:
System.out.println(autoDesignerArray + "Mustang");- will print default
toString()of array and concatenate it with the string - the default implementation of
toString()will print the binary name followed byhashCode()(char array will print [C followed by it's hash code)
- will print default
System.out.println(autoDesignerArray);- will actually call Arrays.toString() or similar functionality handling the
toString()of arrays correctly
- will actually call Arrays.toString() or similar functionality handling the
回答4:
This has to do with Arrays and why the fact that they don't implicitly inherit Object - For more information feel free to check out this SO question (have an answer there).
println(char[] s) does somewhat confuse me in the Oracle Doc - In C you would generally iterate through every element within the array and print each element follow by a \n to break the line.
However the jist of it all is that autoDesignerArray.toString() won't really work as you wish it would (Which is why it returns [C@c17164).
来源:https://stackoverflow.com/questions/29415075/java-printlnchararray-string-vs-printlnchararray