java 数组拼接_打印Java数组最优雅的方式是什么?这波操作闪瞎我

在 Java 中,数组虽然是一个对象,但并未明确的定义这样一个类,因此也就没有覆盖 toString() 方法的机会。如果尝试直接打印数组的话,输出的结果并不是我们预期的结果。那有没有一些简单可行的方式呢?

如果大家也被这个问题困扰过,或者正在被困扰,就请随 来,咱们肩并肩手拉手一起梳理一下这个问题,并找出最佳答案。Duang、Duang、Duang,打怪进阶喽!

01、为什么不能直接打印

很好奇,是不是,为什么不能直接使用 System.out.println() 等系列方法来打印数组?来看这样一个例子。

String [] cmowers = {"沉默","王二","一枚有趣的程序员"};System.out.println(cmowers);

程序打印的结果是:

[Ljava.lang.String;@3d075dc0

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

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

PS:数组虽然没有显式定义成一个类,但它的确是一个对象,继承了祖先类 Object 的所有方法。

那为什么数组不单独定义一个类来表示呢?就像字符串 String 类那样呢?

一个合理的解释是 Java 将其隐藏了。假如真的存在一个 Array.java,我们也可以假想它真实的样子,它必须要定义一个容器来存放数组的元素,就像 String 类那样。

public final class String    implements java.io.Serializable, Comparable, CharSequence {    /** The value is used for character storage. */    private final char value[];}

但这样做真的有必要吗?为数组单独定义一个类,是不是有点画蛇添足的意味。

02、使用 Stream

如果使用的是 JDK8 以上的版本,我们可以使用 Stream 这种时髦、fashion 的方式来遍历数组,顺带将其打印出来。

第一种:

Arrays.asList(cmowers).stream().forEach(s -> System.out.println(s));

第二种:

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

第三种:

Arrays.stream(cmowers).forEach(System.out::println);

打印的结果如下所示。

沉默王二一枚有趣的程序员

没错,这三种方式都可以轻松胜任本职工作,并且显得有点高大上,毕竟用到了 Stream,以及 lambda 表达式。但在我心目中,它们并不是最优雅的方式。

03、使用 for 循环

当然了,如果不喜欢 Stream 的方式,也可以使用 for 循环对数组进行变量顺便打印的方式,甚至 for-each 也行。

for(int i = 0; i < cmowers.length; i++){    System.out.println(cmowers[i]);}for (String s : cmowers) {    System.out.println(s);}

但如果你是一名有追求的程序员的话,不免觉得这样的方式有点 low。那到底最优雅的方式是什么呢?

04、使用 Arrays.toString()

Arrays.toString() 可以将任意类型的数组转成字符串,包括基本类型数组和引用类型数组,截个图大家感受一下。

b2eca1238c772055266765c94726c9f6.png

Arrays 类就不用我多做介绍了吧?虽然我的意思大家懂,但我还是忍不住要废话两句:该类包含了各种操作数组的便捷方法,与其命名为 Arrays,不如命名为 ArrayUtil。

使用 Arrays.toString() 方法来打印数组再优雅不过了,就像,就像,就像蒙娜丽莎的微笑。

6fd9d72956e665e2248571c861ddbe39.png

被逗笑了吧?来,怀揣着愉快的心情看一下代码示例。

String [] cmowers = {"沉默","王二","一枚有趣的程序员"};System.out.println(Arrays.toString(cmowers));

程序打印结果:

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

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

顺便再来看一下 toString() 方法的源码。

public static String toString(Object[] 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(String.valueOf(a[i]));        if (i == iMax)            return b.append(']').toString();        b.append(", ");    }}

1)如果数组为 null,那就返回“null”字符串,考虑很周全,省去了 NullPointerException 的麻烦。

2)如果数组长度为 0,那就返回“[]”字符串。注意,此处没有使用 a.length == 0 进行判空,而是用了 a.length - 1 == -1 ,又为之后的 for 循环中的 i == iMax 埋下了伏笔,资源一点也没有浪费。

3)for 循环中字符串的拼接更是巧妙,for 循环的条件中没有判断 i < a.length ,而在循环体内使用了 i == iMax ,这样有什么好处呢?

通常来说,一般的程序员拼接字符串的时候是这样做的。

StringBuilder b = new StringBuilder();b.append('[');for (int i = 0; i < cmowers.length; i++) {    b.append(cmowers[i]);    b.append(", ");}b.delete(b.length()-2, b.length());b.append(']');

没错吧,非常的循规蹈矩,但比起 toString() 方法源码中的写法,就要相形见绌了。情不自禁地感慨一下啊: 要想成为一名卓越的程序员,而不只是一名普通的程序员,最快的捷径就是学习 Java 的源码 。

05、使用 Arrays.deepToString()

如果需要打印多维码数组的话, Arrays.toString() 就无能为力了。

String[][] deepArray = new String[][] {{"沉默", "王二"}, {"一枚有趣的程序员"}};System.out.println(Arrays.toString(deepArray));

打印结果如下所示。

[[Ljava.lang.String;@7ba4f24f, [Ljava.lang.String;@3b9a45b3]

不不不,这不是我们期望的结果,怎么办呢?使用 Arrays.deepToString() ,专为多维数组而生。

String[][] deepArray = new String[][] {{"沉默", "王二"}, {"一枚有趣的程序员"}};System.out.println(Arrays.deepToString(deepArray));

打印结果如下所示。

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

优秀吧!至于 deepToString() 的源码,本文就不再分析了,大家感兴趣的话自己看一看。(如果你想卓越的话,必须要看啊)

觉得此文不错的大佬们可以多多关注或者帮忙转发分享一下哦,感谢!!!!

410d91f96e6566b8f7060a506eb2f41b.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/292515.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AmazeUI基本样式

2019独角兽企业重金招聘Python工程师标准>>> AmazeUI是一个轻量级、Mobile first的前端框架&#xff0c;基于开源社区流行的前端框架编写。 Normalize AmazeUI使用了normalize.css&#xff0c;但做了些调整&#xff1a;html添加了-webkit-font-smoothing:antialiase…

Oracle基础中的基础视频讲座录像(西安)供免费下载

下载地址播放器也在上述目录中。记得那年园博会&#xff0c;培训中间有一天参观&#xff1a;转载于:https://blog.51cto.com/botang/1323099

她13岁自己造飞机,17岁进麻省理工,3篇黑洞论文被霍金引用......

全世界只有3.14 % 的人关注了爆炸吧知识13岁的时候&#xff0c;你在干嘛&#xff1f;我想&#xff0c;绝大多数人都没有萨布丽娜这么硬核——独自组装飞机。之后&#xff0c;16岁的萨布丽娜完成了生涯首飞&#xff0c;历史第一年轻。17岁时&#xff0c;她考上麻省理工&#xff…

Windows 10 2022 年更新来了!

面向 Release Preview 频道的 Windows 10 预览体验成员&#xff0c;微软现已发布 Windows 10 Build 19044.1499。主要修复1.微软修复了阻止某些环绕声音频在 Microsoft Edge 中播放的问题。2.微软修复了使用中文输入法时&#xff0c;一些应用停止工作的意外错误。3.微软修复了在…

当代成年人的生活状态......

1 小喵咪举起了它的狙击枪▼2 简直有毒...▼3 哈哈哈哈哈▼4 电焊既视感▼5 请问需要小猫咪吗&#xff1f;▼6 哈哈哈哈哈▼7 一物降一物▼7 数学能有多好玩&#xff1f;▼你点的每个赞&#xff0c;我都认真当成了喜欢

c++ why can't class template hide its implementation in cpp file?

类似的问题还有&#xff1a; why cant class template use Handle Class Pattern to hide its implementation? || why there are linker problems (undefined reference) to my class template? 我出现问题的源码&#xff08;见main.cpp,Stack.h,Stack.cpp&#xff09;&…

C# using static 声明

许多实际的扩展可以通过扩展方法来实现&#xff0c;并非所有实际的扩展都有可以扩展的类型。对于某些场景&#xff0c;简单的静态方法比较适合。为了更容易调用这些方法&#xff0c;可以使用 using static 声明除去类名。例如&#xff0c;如果打开了 System.Console using stat…

PHP性能追踪及分析工具xhprof的安装与使用

PHP性能追踪及分析工具xhprof的安装与使用 对于本地开发环境来说&#xff0c;进行性能分析xdebug是够用了&#xff0c;但如果是线上环境的话&#xff0c;xdebug消耗较大&#xff0c;配置也不够灵活&#xff0c;因此线上环境建议使用xhprof进行PHP性能追踪及分析。 我们今天就简…

C 语言 int 型乘法溢出问题

2019独角兽企业重金招聘Python工程师标准>>> long l; int a, b; l a*b; 因为 a*b 的结果仍然以 int 型保存, 所以即使 l 为long,仍然会有溢出,并且截去了部分数据.出现问题. 转载于:https://my.oschina.net/simon203/blog/175885

Android插件化开发基础之Java类加载器与双亲委派模型

类加载器 Java虚拟机类加载过程是把Class类文件加载到内存&#xff0c;并对Class文件中的数据进行校验、转换解析和初始化&#xff0c;最终形成可以被虚拟机直接使用的java类型的过程。 在加载阶段&#xff0c;java虚拟机需要完成以下3件事&#xff1a; a.通过一个类的全限定名…

将k8s制作成3D射击游戏,好玩到停不下来,附源码

点击上方蓝字 关注【我的小碗汤】大家好&#xff0c;我是小碗汤&#xff0c;今天演示一个项目&#xff0c;利用Unity做场景、用C#做交互逻辑&#xff0c;将k8s制作成一个3D射击游戏。正好最近在学习Unity&#xff0c;所以利用这个项目开始上手挺合适的。源码、可执行文件可以自…

JavaJVM之ClassLoader源码分析

层次结构和类图 ClassLoader层次结构&#xff1a;UML类图&#xff1a;sun.misc.Launcher.ExtClassLoader sun.misc.Launcher.AppClassLoader 显式加载类 在代码中显式加载某个类&#xff0c;有三种方法&#xff1a;this.getClass().getClassLoader().loadClass()Class.forName(…

ASP.NET Core Web API使用静态swagger.json文件

前言ASP.NET Core Web API默认集成了Swashbuckle&#xff0c;可以在运行时显示Swagger UI&#xff1a;而Swagger UI实际上是解析的动态生成的swagger.json&#xff1a;app.UseSwagger(); app.UseSwaggerUI(c > c.SwaggerEndpoint("/swagger/v1/swagger.json", &qu…

XenApp共享桌面打开文件警告与桌面文件由于Internet文件安全设置无法打开解决办法...

问题现象 1. 在使用了UPM与文件夹重定向后&#xff0c;个人的桌面路径就会变成一个UNC路径&#xff0c;这个时候如果用户登录共享桌面的话可以看到桌面与快速启动栏的文件与快捷方式&#xff0c;但是打开的时候就会遇到以下错误 这种情况是由于我们放的文件是一个网络路径所导致…

周选特辑|一些超棒的开源项目!

编程导航 每周新增资源优选特辑 02编程导航 致力于推荐优质编程资源 &#x1f48e;项目开源仓库&#xff1a;https://github.com/liyupi/code-nav跪求一个 star ⭐️哈喽大家好&#xff01;我是编程导航的小编火宝。美好的一周又过去了&#xff0c;大家有没有认真学习呢&#x…

Android插件化开发之DexClassLoader动态加载dex、jar小Demo

一、温故动态加载ClassLoader机制 如果对Android的ClassLoader加载机制不熟悉&#xff0c;猛戳Android插件化开发动态加载基础之ClassLoader工作机制 http://blog.csdn.net/u011068702/article/details/53248960 二、介绍 我们知道在Android中可以跟java一样实现动态加载jar&…

js监听多个事件_JavaScript中的事件与异常捕获解析

这篇文章主要给大家介绍了关于JavaScript中事件与异常捕获的相关资料&#xff0c;文中通过示例代码介绍的非常详细&#xff0c;写的十分的全面细致&#xff0c;具有一定的参考价值&#xff0c;对此有需要的朋友可以参考学习下。如有不足之处&#xff0c;欢迎批评指正。事件处理…