对Java数组直接输出结果的分析

首先创建一系列数组,并给基本类型数组赋值

  		// 自定义类数组
        T[] t = new T[2];
        // 基本类型数组
        int[] i = new int[]{1, 2};
        short[] s = new short[]{1, 3};
        long[] l = new long[]{1, 4};
        byte[] b = new byte[]{0, 1};
        float[] f = new float[]{2.4f, 2, 3f};
        double[] d = new double[]{1.4, 2.6};
        char[] c = new char[]{'a', 'b'};
        boolean[] bl = new boolean[]{true, false};

将这些数组输出

   		System.out.println("T " + t);
        System.out.println(t);


        System.out.println("\nint[] " + i);
        System.out.println(i);

        System.out.println("\nshort[] " + s);
        System.out.println(s);

        System.out.println("\nlong[] " + l);
        System.out.println(l );

        System.out.println("\nbytes[] " + b);
        System.out.println(b );

        System.out.println("\nfloat[] " + f);
        System.out.println(f);

        System.out.println("\ndouble[] " + d);
        System.out.println(d);

        System.out.println("\nchar[] " + c);
        System.out.println(c);

        System.out.println("\nboolean[]" + bl);
        System.out.println(bl);

输出结果为:

T [Lcom.example.test.printTest.T;@3cda1055
[Lcom.example.test.printTest.T;@3cda1055

int[] [I@3fb6a447
[I@3fb6a447

short[] [S@6b2fad11
[S@6b2fad11

long[] [J@73f792cf
[J@73f792cf

byte[] [B@2ed94a8b
[B@2ed94a8b

float[] [F@dfd3711
[F@dfd3711

double[] [D@26ba2a48
[D@26ba2a48

char[] [C@3b81a1bc
ab

boolean[][Z@13fee20c
[Z@13fee20c

观察输出结果发现char数组单独输出时的格式和其他数组不同,输出了数组内容。而其他基本类型数组输出时与自定义类的数组输出时的格式一致。

查找Java官方API文档发现:
在这里插入图片描述
println() 方法有多个重载,但这些重载方法的方法参数只有 char 数组而没有其他基本类型数组。此时我们又注意到 在Java中数组也是对象 ,所以其他基本类型数组应该调用了 println(Object x) 方法。

println(Object x) 的源码为:

    public void println(Object x) {
       String s = String.valueOf(x);
       synchronized (this) {
           print(s);
           newLine();
       }
   }

其中String.valueOf()方法的源码为:

    public static String valueOf(Object obj) {
        return (obj == null) ? "null" : obj.toString();
    }

Object中定义的toString()方法源码为:

    public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }

发现使用System.out.println()方法直接输出Object对象时,是以对象类名+@+16进制散列码形式输出。
而当class对象是数组对象时,getName()方法返回以下形式的值,其中[的数目表示数组嵌套深度(数组维度)

[I      // int[]
[S      // short[]
[J      // long[]
[B		// byte[]
[F		// float[]
[D		// double[]
[C		// char[]
[Z		// boolean[]
[Ljava.lang.Object // Object[]
[Lclassname;		// class [] or interface []

回头看上面输出char数组的两行代码和输出结果

        System.out.println("\nchar[] " + c);
        // char[] [C@3b81a1bc
        
        System.out.println(c);
		// ab

为什么char数组前有 "\nchar[] " 时,输出的不是char数组内容了呢?
"\nchar"实际上是一个String类变量,c此时是一个char[] 一维数组,这两个变量相加,IDEA也给了我们一个警告
在这里插入图片描述

这一行语句实际上是 String Concatenation by + operator(通过+操作符进行字符串连接),实际上对char数组c隐式调用了方法toString(),而char数组本身没有覆盖toString()方法,所以实际上还是调用了超类Object的toString()方法。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值