大家好,我是鸭哥。
最近,鸭哥帮部门招聘,做程序员的都知道,一个组里,妹纸真的太少了,刚刚HR小姐姐,为了照顾咱们这个“和尚组”,特地拿了一份妹纸的简历给我,让我好好去招聘,争取能招聘过来。
鸭哥跟部门的其它小伙伴商量了一下,考查妹纸的什么面试题呢?最后,达成一致,就问一个最简单,又最经典的面试题:如何打印数组?
然而,这位应聘实习岗位的妹纸,支支吾吾了半天,也没回答出来~
我只能给组里的小伙伴们说,我真的尽力了!
其实,打印数组,一个看似普通得不能再普通的操作,却也难倒了不少初级程序员。技术论坛上相关提问有着贼高的阅读量,看来大家对这个问题解决方法的第一感,还是有些问题的。不怕,鸭哥今天给你说明白,也希望这位妹纸也能好好听听~
直觉中的打印方法
要打印变量,我们很自然地想到如下的方法,
int[] intArray = {1, 2, 3}; System.out.println(intArray); // 打印结果:[I@1b6d3586 String[] strArray = {"print","test"}; System.out.println(strArray); // 打印结果:[Ljava.lang.String;@4554617c
为什么会打印出[I@1b6d3586这样的奇怪字符呢?因为在 Java 中,数组无法重写 toString() 方法,如果直接打印一个数组,得到的是 className + '@' + 数组的十六进制的 hashCode. 那么有哪些简单的方法可以正确地打印数组呢?
常用的几种方法
1、使用 for 循环
最”朴实无华“的方法,却也是屡试不爽的方法,直接打印变量名不成,逐个遍历打印一定是可以的!
int[] intArray = {1, 2, 3}; for(int i = 0; i < intArray.length; i++) System.out.println(intArray[i]);
如果是多维数组的话,使用多层 for 循环嵌套就可以了。
2、使用 Arrays.toString() 或 Arrays.deepToString()
对于一维数组,我们可以使用 Arrays.toString() 方法,它支持将任意类型的数组转换为字符串,示例如下,
int[] intArray = {1, 2, 3}; System.out.println(Arrays.toString(intArray)); // 打印结果:[1, 2, 3]
但对于多维数组,用 Arrays.toString() 打印就会出现和直接打印数组变量名时一样的问题,这时候,我们就需要使用 Arrays.deepToString() 方法了
String[][] strArray = {{"print1","test1"},{"print2","test2"}}; //打印结果:[[Ljava.lang.String;@1b6d3586, [Ljava.lang.String;@4554617c] System.out.println(Arrays.toString(strArray)); //打印结果:[[print1, test1], [print2, test2]] System.out.println(Arrays.deepToString(strArray));
3、使用 Arrays.asList()
需要说明的是,Arrays.asList() 方法只针对 Object 数组有效,打印基本数据类型(如int)的数组是不行的,
int[] intArray = {1, 2, 3}; System.out.println(Arrays.asList(intArray)); // 打印结果:[[I@1b6d3586] Integer[] IntArray = new Integer[]{1, 2, 3}; System.out.println(Arrays.asList(IntArray)); // 打印结果:[1, 2, 3]
综合来看,Java 中打印数组最简单和通用的方法是使用 Arrays 类中的 toString() 或 deepToString() 方法;而当我们需要定制输出内容的格式时,使用 for 循环遍历则是比较方便的。
这个问题,你get到了吗?你面试的时候,被问到过没?欢迎在留言区讨论~