自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

妹:打印數(shù)組有什么好講的?

開發(fā) 后端
[Ljava.lang.String; 表示字符串數(shù)組的 Class 名,@ 后面的是十六進制的 hashCode——這樣的打印結(jié)果太“人性化”了,一般人表示看不懂!為什么會這樣顯示呢?

[[399424]]

“哥,之前聽你說,數(shù)組也是一個對象,但 Java 中并未明確的定義這樣一個類。”看來三妹有在用心地學(xué)習(xí)。

“是的,因此數(shù)組也就沒有機會覆蓋 Object.toString() 方法。如果嘗試直接打印數(shù)組的話,輸出的結(jié)果并不是我們預(yù)期的結(jié)果。”我接著三妹的話繼續(xù)說。

“那怎么打印數(shù)組呢?”三妹心有靈犀地把今天的核心問題提了出來。

“首先,我們來看一下,為什么不能直接打印數(shù)組,直接打印的話,會出現(xiàn)什么問題。”

來看這樣一個例子。

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

程序打印的結(jié)果是:

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

[Ljava.lang.String; 表示字符串數(shù)組的 Class 名,@ 后面的是十六進制的 hashCode——這樣的打印結(jié)果太“人性化”了,一般人表示看不懂!為什么會這樣顯示呢?查看一下 java.lang.Object 類的 toString() 方法就明白了。

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

再次證明,數(shù)組雖然沒有顯式定義成一個類,但它的確是一個對象,繼承了祖先類 Object 的所有方法。

“哥,那為什么數(shù)組不單獨定義一個類來表示呢?就像字符串 String 類那樣呢?”三妹這個問題讓人頭大,但也好解釋。

“一個合理的說法是 Java 將其隱藏了。假如真的存在這么一個類,就叫 Array.java 吧,我們假想一下它真實的樣子,必須得有一個容器來存放數(shù)組的每一個元素,就像 String 類那樣。”一邊回答三妹,我一邊打開了 String 類的源碼。

  1. public final class String 
  2.     implements java.io.Serializable, Comparable<String>, CharSequence { 
  3.     /** The value is used for character storage. */ 
  4.     private final char value[]; 

“最終還是要用類似一種數(shù)組的形式來存放數(shù)組的元素,對吧?這就變得很沒有必要了,不妨就把數(shù)組當做是一個沒有形體的對象吧!”

“好了,不討論這個了。”我怕話題扯遠了,扯到我自己也答不出來就尷尬了,趕緊把三妹的思路拽了回來。

“我們來看第一種打印數(shù)組的方法,使用時髦一點的 Stream 流。”

第一種形式:

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

第二種形式:

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

第三種形式:

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

打印的結(jié)果如下所示。

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

沒錯,這三種方式都可以輕松勝任本職工作,并且顯得有點高大上,畢竟用到了 Stream,以及 lambda 表達式。

“當然了,也可以使用比較土的方式,for 循環(huán)。甚至 for-each 也行。”

  1. for(int i = 0; i < cmowers.length; i++){ 
  2.     System.out.println(cmowers[i]); 
  3.  
  4. for (String s : cmowers) { 
  5.     System.out.println(s); 

“哥,你難道忘了上一篇在講 Arrays 工具類的時候,提到過另外一種方法 Arrays.toString() 嗎?”三妹看我一直說不到點子上,有點著急了。

“當然沒有了,我認為 Arrays.toString() 是打印數(shù)組的最佳方式,沒有之一。”我的情緒有點激動。

Arrays.toString() 可以將任意類型的數(shù)組轉(zhuǎn)成字符串,包括基本類型數(shù)組和引用類型數(shù)組。該方法有多種重載形式。

使用 Arrays.toString() 方法來打印數(shù)組再優(yōu)雅不過了,就像,就像,就像蒙娜麗莎的微笑。

(三妹看到這么一副圖的時候忍不住地笑了)

“三妹,你不要笑,來,懷揣著愉快的心情看一下代碼示例。”

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

程序打印結(jié)果:

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

哇,打印格式不要太完美,不多不少!完全是我們預(yù)期的結(jié)果:[] 表明是一個數(shù)組,, 點和空格用來分割元素。

“哥,那如果我想打印二維數(shù)組呢?”

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

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

打印結(jié)果如下所示。

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

“說到打印,三妹,哥給你提醒一點。阿里巴巴的 Java 開發(fā)手冊上有這樣一條規(guī)約,你看。”

“什么是 POJO 呢,就是 Plain Ordinary Java Object 的縮寫,一般在 Web 應(yīng)用程序中建立一個數(shù)據(jù)庫的映射對象時,我們稱它為 POJO,這類對象不繼承或不實現(xiàn)任何其它 Java 框架的類或接口。”

“對于這樣的類,最好是重寫一下它的 toString() 方法,方便查看這個對象到底包含了什么字段,好排查問題。”

“如果不重寫的話,打印出來的 Java 對象就像直接打印數(shù)組的那樣,一串誰也看不懂的字符序列。”

“可以借助 Intellij IDEA 生成重寫的 toString() 方法,特別方便。”

“好的,哥,我記住了。以后遇到的話,我注意下。你去休息吧,我來敲一下你提到的這些代碼,練一練。”

“OK,我走,我走。”

本文轉(zhuǎn)載自微信公眾號「沉默王二」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系沉默王二公眾號。

 

責任編輯:武曉燕 來源: 沉默王二
相關(guān)推薦

2021-05-10 11:38:07

Java數(shù)組IDEA

2009-08-26 13:41:58

PHP操作Imagic

2023-09-12 14:02:30

數(shù)組vector

2022-10-27 19:32:20

切片golang數(shù)組

2015-11-12 15:39:53

程序員笑話

2009-11-18 17:29:25

PHP數(shù)組

2021-07-30 09:32:55

JavaEquals

2012-11-08 09:37:55

IT公司IT女生編程語言

2021-06-06 20:56:48

Java內(nèi)存 intern

2020-12-09 05:19:35

static關(guān)鍵字Java

2023-09-26 22:15:49

JavaScrip開發(fā)

2023-03-28 07:03:15

gRPCMetadata

2020-10-05 21:38:35

pythonprettyprintpprint

2011-05-03 16:40:29

噴墨打印機打印機墨盒維修

2021-07-08 22:43:41

ThrowThrowsJava

2020-10-29 10:28:31

Java數(shù)據(jù)類型

2020-10-26 09:36:45

Java變量數(shù)據(jù)

2020-11-18 09:44:49

Java命名約定

2009-09-24 10:23:41

打印服務(wù)器

2021-07-09 06:48:29

數(shù)組存儲內(nèi)存
點贊
收藏

51CTO技術(shù)棧公眾號