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…

hdu 1466 计算直线的交点数 递推

以前做这道题目的时候&#xff0c;花了好长时间找规律&#xff0c;感觉十分高大上&#xff0c;今天回顾这个题目的时候&#xff0c;突然有了顿悟&#xff0c; 有了递推的思想就容易解决了。 题意&#xff1a;给你n条直线&#xff0c;问&#xff1a;输出这些直线所有相交情况下的…

Android插件化开发基础之App如何动态加载类

在 Java 里面&#xff0c;我们可以把一些类放到 .jar 文件里面&#xff0c;然后用 ClassLoader 动态加载。例如&#xff1a; URLClassLoader ucl URLClassLoader.newInstance(new URL[] {new URL("file:/sdcard/files/test.jar")}); Class clazz ucl.loadClass…

Windows 10 2022 年更新来了!

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

python小工具小发明_【kimol君的无聊小发明】—用python写截屏小工具

前言今天我看了一下自己的文件夹&#xff0c;发现了自己写了许多似乎很无聊的代码。于是乎&#xff0c;一个想法油然而生&#xff1a;“生活已经很无聊了&#xff0c;不如再无聊一点叭”。说干就干&#xff0c;那就开一个专题&#xff0c;我们称之为kimol君的无聊小发明。妙…啊…

npm执行命令后无任何响应(windows下)

曾经执行过npm config set prefix 命令&#xff0c; 导致npm的config乱掉了&#xff0c; 找到这个文件.npmrc&#xff0c; 然后删掉就可以了 。 我的.npmrc位置在C:\Users\Administrator下。转载于:https://www.cnblogs.com/josjo/p/6099631.html

职业技能培训

实战技能 精通web容器 Apache、Nginx 精通Redis、Mongodb、Memcache、Hadoop 精通CGI/FastCGI PHP扩展 精通Qt和Webkt 应用技能 gccgdbmakeautoconfSourceInsightvim理论素养 数据库数据结构操作系统算法WEB转载于:https://www.cnblogs.com/heidsoft/p/3418660.html

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

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;&…

Android插件化开发之动态加载技术系列索引

动态加载介绍 在Android开发中采用动态加载技术&#xff0c;可以达到不安装新的APK就升级APP功能的目的&#xff0c;可以用来到达快速发版的目的&#xff0c;也可以用来修复一些紧急BUG。 现在使用得比较广泛的动态加载技术的核心一般都是使用 ClassLoader &#xff0c;后者能够…

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性能追踪及分析。 我们今天就简…

python后面空格报错_python中空格和table混用报错原因

python是一门严格遵守缩进的语言&#xff0c;缩进的规则代表着程序的层级关系。我们来看一段代码。class MyForm(Form):value1 StringField(value1)value2 StringField(value2)value3 StringField(value3) #这行用的是Tab缩进submit SubmitField(Submit)learn pytho…

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;所以利用这个项目开始上手挺合适的。源码、可执行文件可以自…

Struts学习笔记_i18n

1. I18N原理 a) ResourceBundle和Locale的概念 b) 资源文件 c) native2ascii //test.javaimport java.util.Locale; import java.util.ResourceBundle;public class Test {public static void main(String[] args) {ResourceBundle res ResourceBu…