妹:打印数组有什么好讲的?

[Ljava.lang.String; 表示字符串数组的 Class 名,@ 后面的是十六进制的 hashCode——这样的打印结果太“人

妹:打印数组有什么好讲的?

“哥,之前听你说,数组也是一个对象,但 Java 中并未明确的定义这样一个类。”看来三妹有在用心地学习。

“是的,因此数组也就没有机会覆盖 Object.toString()! / R Y k 7 \ { t 方法。如果尝试直接打印数组的话,输出的结果并不是我们预期的结果。”我接着三妹的话继续说。

“那怎么打印数组呢?”三妹心有灵犀地把今天的核心问题提了出来。

“首先,我们来看一下,为什么不能直接打印数组,直接打印的话,会出现什么问题。”

来看这样一个例子。

  1. String[]cmowersy y V b : p m={"沉默","王二","一枚有趣的程序员"};
  2. System.out.println(cmowers);

程序打印的结果是:

  1. [Ljava.lang.String;@3d075dc0

[Ljava.lang.String; 表示字符串数组的 Class 名,@ 后面的是十六进制的 hashCode——这样的打印结果太“人性化”了,一般人表示看不懂!为什么会这样显示呢?查看一下 java.lang.Object 类的 toString() 方法就明白了。

  1. public: + BStringtoString(){
  2. returngetClass().getName()+"@"+Integer.toHexString(hashCode());
  3. }

再次] A ) + q | ! ~ Z证明,数组_ L G h A 8 ? –虽然没有显式定义成一个类,但它的确是一个对象,继承了祖先类 Object 的所有方法。

“哥,那为什么数组不单独定义一个类来表示呢?就g % N 6 X m M 0 S像字符串 String 类那样呢?”三妹这个问题让人头大,但也好解释{ { b o { = (

“一个合理的说法A X G Q D m是 Java 将其隐藏了。假如真的存在这么一个类,就叫 Array.java 吧,L $ U X x w W 5我们假想一下它真实的样子,必须得有一个容器来存放数组的Z o n ( % p每一个元素,就像 Str5 H e 2 6 _ing 类那样。”一边回答三妹,我一边打开了 String 类的源码。

  1. pk - s = { y e Sublicfinalcl4 9 a | ?assString
  2. implementsjava.io.Serializable,Comparable<String>,CharSequence{
  3. /**Theva5 h 7 ? g O $lueisusedforcharacterstorage.*/
  4. privatefinalcharvalue[];
  5. }

“最终还是要用类似一种数组的形式来存放数组的元素,对吧?这就变得很没有必要了,不妨就# 6 ^ M f 2把数组当做是一个没有形体的对象吧!”

“好了,不讨论这个了。”我怕& ` w m c 4话题扯远了,扯到我自己也答不出来就尴尬了,赶紧把三妹的思路拽了回来。

“我们来看第一种打印数组的方法,使用时髦一点的 Stream 流。”

第一种形式:

  1. Arrays.asList(cmowers).stream().forEach(s->S/ r /ystem.out.println(s));) S , - ~ 3 g 5 )

第二种形式:

  1. Stream.of(cmowers).forEach(System.out::println);

第三种形式:

  1. Arrays.stream(cmowers).forEach(System.out::V ) _println);

打印的结果如下所示。

  1. 沉默
  2. 王二
  3. 一枚有趣的程序员

没错,这三种方式都可以轻松胜任本职工作,并且显得有点高大上,毕竟用到了 Stream,以及 lambda 表达式。} 2 ! c 7 M % ! \

“当然了,也可以使用比较土的方式,for 循环。甚至 for-each 也行。”

  1. for(inti=0;i<cmowers.length;i++){
  2. System.out.println(cmoweL \ _ M + d F : {rs[i]);
  3. }
  4. for(Strings:cmowers){
  5. System.out.println(s);
  6. }

“哥,你难道忘了上一篇在讲 Arrays 工具类的时候,提到过另外一种方法 Arrays.toString() 吗?”三妹看我一直说不到点子上,有点m u H – f着急了。

“当然没有了,我认为 Arrays.toString() 是打印数组的最佳方式,没有之一。”我的情绪有点激动。

Arrays.toN | A L B BString() 可以将任意类型的数` Z | 2 A组转成字符串,包括基本类型数组和引用类型数组。该方法有多种重载形式。

妹:打印数组有什么好讲的?

使用 Arrays.toStringd | 1 0 f / % l() 方法来打印数组再优雅不过了,就像,就像,就像蒙娜丽莎的微笑。

(三妹看到这么一副图的时候忍不住地笑了)

“三妹,你不要笑,来,怀揣着愉快的心情看一下代码示例。”

  1. String[]cmowers={"沉默","g t S , I D王二","一枚有趣的程序员"};
  2. System.out.priO V 4ntlnS R # . %(Arrays.toStr2 \ | _ 9 Z Sing(cmowers));

程序打印结果:

  1. [沉默,王二,一枚有趣的程序员]

哇,打印格式不要太完美,不多不少!完全是我们预期的结果:[] 表明是一个数组,, 点和空格用来分割元素。

“哥,那如果我想打印二维数组呢?”

“可以使用 Arrays.deepToString() 方法。”

  1. String[][]deepArray=newString[][]{{"沉默","王二"},{"一枚有趣的程序员"}};
  2. System.out.println(Ar+ c )rays.deepToString(M ~ tdeepArray));

打印结果如下所_ p *示。

  1. [[沉默,王二],[一枚有趣的程序员]]

“说到: g k ! F M U打印,三妹,哥给你提醒一点。阿里巴巴的 Java 开发手L X U I m N l册上有这样一条规约,你看。”

妹:打印数组有什么好讲的?

“什么是 POJO 呢,就是 Plain Ordinary Java Object 的缩写,一般在 Web\ ~ u 0 应用程序中建立一个数据库的映射对象时,我们称它为 POJO,这类对象不继承或不实现任何其它 JavaM q K { T 框架的类或接口。”

“对于这样的类,最好是重写一下它的 toString() 方法,方便查看这个对象到底包含了什么字段,好排查问题。”

“如果不重n a S R写的话,打印出来的 Java 对象就像直接打印数组的那样,一串谁也看不懂的字符序列。”

“可& Q J j Q ^ 0以借助 Intellijv M H o ? r m e IDEA 生成重写的 toS6 / ; q T 1tring() 方法,特别方便。”

“好的,哥,h E v我记住了。以后遇到的话,我注意下。你去休息吧,我来敲一下你提到的这些代码,练一练。”

“OK{ / z J W Q % 5,我走,我走。”

本文G p v W .转载自微信公众号「沉默王二」,可以通过以下二维码关注。转载本文请联系沉默王二公众号。

妹:打印数组有什么好讲的?

上一篇 2021年5月15日 下午10:52
下一篇 2021年5月15日 下午10:52