Java println(charArray + String) vs println(charArray)

ぐ巨炮叔叔 提交于 2019-12-01 18:08:28

问题


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

  • [C is a class name ([ represent 1d array)
  • @ concates the the string
  • c17164 some hash code
  • Mustang your 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:

  1. 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 by hashCode() (char array will print [C followed by it's hash code)
  2. System.out.println(autoDesignerArray);
    • will actually call Arrays.toString() or similar functionality handling the toString() of arrays correctly



回答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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!