黑马程序员技术交流社区
标题:
关于char[]的提问
[打印本页]
作者:
ㄗ灬Night|K
时间:
2013-10-17 09:34
标题:
关于char[]的提问
本帖最后由 ㄗ灬Night|K 于 2013-10-17 11:11 编辑
为什么char[]打印的是ABC,而int[]打印的是哈希值呢?
package itcast;
public class CharInt {
public static void main(String[] args) {
char[] ch = {'A','B','C'};
int[] arr = {1,2,3};
System.out.println(ch);
System.out.println(arr);
}
}
复制代码
打印结果: ABC
[I@18a992f
作者:
ixiangfeng
时间:
2013-10-17 10:08
[code]public class Array
{
public static void main(String [] args)
{
String s = "printString";
int [] i = {1,3,5,};
char [] c = {'a', 'e', 'd'};
System.out.println(i);
System.out.println(c);
System.out.println(s);
}
}
结果:
[code][I@119dc16
aed
printString
先从字符串讲起。String是java中的一个类,所以一定会重载toString()函数,故toString()会返回其本身。所以直接打印String类的对象会输出具体字符串(就像其他所有类一样)。而字符型数组在内存中的储存方式同String类一样,故输出数组名并不是输出数组首地址,而是直接输出数组内容直到/0;而整形数组只是整形的集合,所以其数组名仅仅是其首地址,我们必须要用for循环才能完整的输出整个整形数组
作者:
ixiangfeng
时间:
2013-10-17 10:15
上面的两个[code]是多余的 插代码时不知怎么出来的 忽视即可
作者:
bird_not_fat
时间:
2013-10-17 10:39
哥们如果你想输出数组内容的话有两种办法(可能更多,偶就知道这两种^^)
1.用数组工具类Arrays的toString方法
System.out.println(Arrays.toString(a));
复制代码
Arrays的toString方法的实质是什么呢?用StringBuider用for循环遍历的方法将数组元素拼接起来。
public static String toString(int[] a) {
if (a == null)
return "null";
int iMax = a.length - 1;
if (iMax == -1)
return "[]";
StringBuilder b = new StringBuilder();
b.append('[');
for (int i = 0; ; i++) {
b.append(a[i]);
if (i == iMax)
return b.append(']').toString();
b.append(", ");
}
}
复制代码
2.for循环遍历数组元素并打印。这个不用多说了。
归根结底都是用for循环遍历的。就是因为数组类型没实现万恶的toString方法
作者:
凝聚
时间:
2013-10-17 10:58
System.out.println(arr);把这句话改成System.out.println(Arrays.toString(arr));输出结果为:
[1,2,3]
作者:
kellyzyb
时间:
2013-10-17 11:16
System.out.println()这个方法并没有以int[]为参数的overload 方法
所以系统认为 int[]是一个object
所以调用System.out.println(Object obj)
而打印的是obj.toString()
而obj.toString()
toString 方法返回一个字符串,由类名和 标记符“@”和此对象哈希代码的无符号十六进制表示组成。
里面相当于涉及到方法的重载
作者:
张文豪
时间:
2013-10-17 11:18
本帖最后由 张文豪 于 2013-10-17 11:20 编辑
System.out指的就是PrintStream。
查看完PrintStream的API
得到PrintStream的方法中有定义println(char[] x)
它如是说:打印字符数组,然后终止该行。此方法的行为就像先调用 print(char[]) 然后调用 println() 一样。
print(char[]):打印字符数组。按照平台的默认字符编码将字符转换为字节,并完全以 write(int) 方法的方式写入这些字节。
PrintStream方法中并没有定义println(int[] x);
所以他调用的是println(Object x)方法,它打印的是对象的字符串值(由类名+@+此对象的哈希码的无符号十六进制组成)
作者:
周志龙
时间:
2013-10-17 11:36
如果楼主已经解惑,请将贴子设为提问结束
作者:
To
时间:
2013-10-17 14:03
不错的回答
作者:
kellyzyb
时间:
2013-10-17 14:52
本帖最后由 kellyzyb 于 2013-10-17 14:56 编辑
kellyzyb 发表于 2013-10-17 11:16
System.out.println()这个方法并没有以int[]为参数的overload 方法
所以系统认为 int[]是一个object
重新做了下整理和分析,希望对你有用:
System.out是一个PrintStream对象,print(println同理) 方法有N个重载,其中一个是pting(Object obj),查询api文档,此方法先调用了一个String.valueOf(obj)方法。查看此方法的源码: 当obj不等于空于时,自动调用obj.toString()方法。
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
复制代码
Object 类的 toString 方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@”和此对象哈希码的无符号十六进制表示组成。换句话说,该方法返回一个字符串,它的值等于: getClass().getName() + '@' + Integer.toHexString(hashCode())
所以当要打印整数数组时,会自动查找类型相匹配的方法进行重载,当没有对应的方法时,作为Object来处理,加载此方法 public void
println
(
Object
x) 最终打印出在内存中的地址值。
当是字符型数组时,有对应的public void
print
(char[] s) 方法。打印出字符串。而其它数组没有单独定义方法,当作Object来处理。
作者:
枫儿
时间:
2013-11-7 07:33
顶~~~~~~~~~~~~~~~~
作者:
枫儿
时间:
2013-11-7 07:33
我顶~~~~~~~~~~~~~~~~
作者:
枫儿
时间:
2013-11-7 07:33
必须顶
作者:
枫儿
时间:
2013-11-7 07:33
不得不顶 ~~
作者:
枫儿
时间:
2013-11-7 07:33
用尽全力顶
作者:
枫儿
时间:
2013-11-7 07:33
用尽全力顶
作者:
枫儿
时间:
2013-11-7 07:34
再加上千斤顶
作者:
枫儿
时间:
2013-11-7 07:34
总之把它顶到顶
作者:
枫儿
时间:
2013-11-7 07:34
接着使出葵花宝顶
作者:
枫儿
时间:
2013-11-7 07:34
就算顶到史前也要顶
作者:
枫儿
时间:
2013-11-7 07:35
老子看了会用道德经顶
作者:
枫儿
时间:
2013-11-7 07:35
孔子亲自拜你为师天天顶
作者:
枫儿
时间:
2013-11-7 07:35
秦始皇站在阿房宫上使劲顶
作者:
枫儿
时间:
2013-11-7 07:35
汉高祖挥师杀向东罗马为你顶
作者:
枫儿
时间:
2013-11-7 07:35
吕布抛弃了貂禅而选择了帮你顶
作者:
王建亮
时间:
2013-11-8 15:12
在运行int[] arr = {1,2,3};的时候,arr只是存储的这个数组的首地址,所以打印出来的arr就是这个数组的首地址了,这个哈希值 [I@18a992f中第一个‘【’是数组的意思‘I’是int类型的意思,后面的18a992f是在你的电脑中这个数组的存储位置。打印这个哈希值,可以很快的知道一个变量的一些信息,比如说是不是一个数组,这个数组是什么类型的等等。如果想完全知道数组的信息,可以使用tostring方法进行输出
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2