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() 可以將任意類型的數組轉成字符串,包括基本類型數組和引用類型數組,截個圖大家感受一下。
Arrays 類就不用我多做介紹了吧?雖然我的意思大家懂,但我還是忍不住要廢話兩句:該類包含了各種操作數組的便捷方法,與其命名為 Arrays,不如命名為 ArrayUtil。
使用 Arrays.toString() 方法來打印數組再優雅不過了,就像,就像,就像蒙娜麗莎的微笑。
被逗笑了吧?來,懷揣著愉快的心情看一下代碼示例。
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() 的源碼,本文就不再分析了,大家感興趣的話自己看一看。(如果你想卓越的話,必須要看啊)
覺得此文不錯的大佬們可以多多關注或者幫忙轉發分享一下哦,感謝!!!!
總結
以上是生活随笔為你收集整理的java 数组拼接_打印Java数组最优雅的方式是什么?这波操作闪瞎我的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java数组转换成string_java
- 下一篇: cake fork什么意思_Java7任