Apache Commons ArrayUtils.toString(Object)与JDK Arrays.toString(Object)
Apache Commons Lang提供了一個ArrayUtils類,其中包含toString(Object)方法,該方法“將數組作為字符串輸出”。 在本文中,我將研究當JDK提供Arrays.toString(Object [])方法[以及原始類型數組的Arrays類上該方法的多個重載版本]時,該方法仍然有用的情況。
ArrayUtils.toString(Object) ,使用Apache Commons Lang ArrayUtils.toString(Object)方法的原因可能是JDK沒有提供替代方法。 Arrays.toString(Object[])是在J2SE 5 ( 2004年末 Arrays.toString(Object[])中引入的,因為Apache Commons Lang自至少Lang 2.0 ( 2003年末 ArrayUtils.toString(Object)以來就擁有ArrayUtils.toString(Object) )。 盡管這些發行版之間只有一年多的差異,但是許多組織比JDK版本更愿意升級庫,因此有些組織之所以選擇使用Lang API是因為他們甚至在其通用發行版之后仍未采用JDK。 但是,到今天,可能只有極少數的Java部署未使用JDK 5或更高版本,因此這似乎不再是在新編寫的代碼中使用Apache Commons Lang方法而不是JDK方法的原因。 。
相對于JDK的Arrays.toString(Object[]) ArrayUtils.toString(Object)可能選擇Apache Commons Lang的ArrayUtils.toString(Object)另一個原因是從元素數組構造的字符串的格式。 這似乎不是很吸引人的動機,因為各自的輸出沒有太大的不同。
對于本文中的示例,我假設定義了一個String數組,如下所示:
/** Array of {@code String}s used in these demonstrations. */ private static final String[] strings= {"Dustin", "Inspired", "Actual", "Events"};將上面定義的數組傳遞給JDK的Arrays.toString(Object[])和Apache Commons Lang的ArrayUtils.toString(Object) ,下面將分別比較每個數組分別生成的String表示形式。
| {"Dustin", "Inspired", "Actual", "Events"} | [Dustin, Inspired, Actual, Events] | {Dustin,Inspired,Actual,Events} |
該表說明了這兩種方法的生成的字符串在實質意義上非常相似,但是它們的輸出存在外觀差異。 JDK版本用方括號將生成的字符串的數組內容括起來,而Apache Commons Lang版本用花括號將數組內容括起來。 另一個明顯的區別是,JDK數組元素在字符串中用定界符表示,該定界符由逗號和空格組成,而Apache Commons Lang表示的數組元素只用逗號定界而沒有空格。
如果Apache Commons Lang ArrayUtils.toString(Object)允許自定義其輸出的“樣式”,則可能會進一步證明其表示樣式是一種優勢。 但是, 從方法的實現中可以看出 ,它始終使用ToStringStyle.SIMPLE_STYLE 。
這里討論的將Java數組表示為單個String表示形式的兩種方法之間的另一個小區別是對傳遞給方法的null的處理。 兩種方法在傳遞null時都返回一個非null非空String ,但是該字符串的內容根據所調用的實現而有所不同。 JDK的Arrays.toString(Object[])返回字符串"null"時, null傳遞給它,而阿帕奇共享郎的ArrayUtils.toString(Object)返回字符串"{}"當null傳遞給它。
ArrayUtils.toString(Object)返回的"{}"很容易理解,并且在某種程度上, ArrayUtils.toString(Object)為呈現為數組提供的null的字符串版本,這種方法在美學上更令人愉悅。 但是,可以說"{}"表示一個空數組而不是null 。 實際上,Apache Commons Language版本確實為空數組返回了相同的"{}"字符串(并且與使用數組初始值設定項聲明空數組的方式完全匹配)。 JDK的Arrays.toString(Object[])方法為null輸入提供字符串"null" ,為空數組輸入提供"[]" 。
可以說,將null數組參數的字符串版本表示為"null"的JDK方法與Java開發人員在給定其他類似情況下提供null String表示的情況下可能期望的一致。 null的隱式String轉換 (有關更多詳細信息,請參見Java SE 10語言規范的 5.1.11節 )和通過對null參數調用String.valueOf(Object)返回的String表示字符串"null" 。 數組類型的隱式String轉換為null也會導致"null"字符串。
ArrayUtils.toString(Object)和Arrays.toString(Object[])之間的另一個區別是每種方法所需的參數類型。 ArrayUtils.toString(Object)實現需要一個Object ,因此可以接受幾乎任何想要提供給它的東西。 JDK的Arrays.toString(Object[])強制向其提供數組(或null ),而不能向其提供非數組類型。 哪種方法更好是有爭議的,但是我個人通常更喜歡使用嚴格類型化的API,這些API僅允許其宣傳(有助于執行合同)。 在這種情況下,因為所需的功能是傳遞一個數組并返回該數組的String表示形式,所以我希望使用更確定類型的方法來期望一個數組。 另一方面,可能有人爭辯說他們更喜歡接受通用Object的方法,因為這樣可以將任何任意對象(例如Java collection )傳遞給該方法。
通常,我不喜歡在名為ArrayUtils的類上使用方法來構建除數組以外的任何內容的String表示的想法。 我已經見過此方法在Java集合上使用,但是沒有必要,因為Java集合已經提供了合理的toString()實現(數組不能覆蓋Object的toString() ,這就是為什么它們需要這些外部方法來這樣做)。 也不必使用ArrayUtils.toString(Object)來確保在沒有NullPointerException的情況下處理null因為Objects.toString(Object)可以很好地處理該情況,并且不會假裝為“數組”方法(實際上,它不會對數組沒有太大幫助)。
通過提供每個實現預期參數的差異String所提供的陣列引線表示進入的動機,我認為是最有說服力的選擇第三方庫提供的ArrayUtils.toString(Object)在內置Arrays.toString(Object[]) ,但是對于一種特定情況,這是一個顯著的優勢: 多維 Java數組。 JDK的Arrays.toString(Object[])僅設計用于一維Java數組。 但是,Apache Commons Lang ArrayUtils.toString(Object)很好地支持呈現單個String表示形式,甚至是多維Java數組。 它的方法級Javadoc宣傳了這一優勢:“多維數組得到正確處理,包括多維基本數組。” 為了說明這些方法在多維數組輸出中的差異,我將使用這個可笑的示例:
/** Two-dimensional array of {@code String}s used in demonstrations. */ private static final String[][] doubleDimStrings= {{"Dustin"}, {"Inspired", "Actual", "Events"}};下表顯示了將String的二維數組傳遞給相應方法的輸出。
| {{"Dustin"}, {"Inspired", "Actual", "Events"}} | [[Ljava.lang.String;@135fbaa4, [Ljava.lang.String;@45ee12a7] | {{Dustin},{Inspired,Actual,Events}} |
剛剛顯示的表證明,一旦Java數組具有多個維,JDK的Arrays.toString()并不會特別有用。 Apache Commons Lang的ArrayUtils.toString(Object)甚至可以呈現多維數組的漂亮的單個String表示形式。
我有意避免在性能方面對本文中涉及的兩種選擇進行比較,因為我很少在日常工作中發現這些類型方法的性能差異很重要。 但是,如果在每毫秒計數的情況下需要此功能,那么可能有必要在實際情況下嘗試每種功能,選擇效果最好的一種。 我的直覺告訴我,JDK實現通常會更好(特別是如果使用基元數組,并且能夠使用Arrays用于基元的重載toString()方法之一),但是我的直覺在涉及到之前是錯誤的。性能問題。
下表總結了我的帖子對Apache Commons Lang(版本3.7) ArrayUtils.toString(Object)和JDK(JDK 10) Arrays.toString(Object [])的特性的討論 。
| 一維數組 | "[Dustin, Inspired, Actual, Events]" | "{Dustin,Inspired,Actual,Events}" |
| 二維數組 | "[[Ljava.lang.String;@135fbaa4, [Ljava.lang.String;@45ee12a7]" | "{{Dustin},{Inspired,Actual,Events}}" |
| null | "null" | "{}" |
| 空一維數組 | "[]" | "{}" |
這篇文章探討了一些可能的動機,它們選擇了內置JDK的Arrays.toString(Object [])來選擇第三方Apache Commons Lang的ArrayUtils.toString(Object )來生成數組的單個String表示形式。 我發現最明顯的情況是,對于多維數組,選擇此特定的第三方庫而不是內置替代方法。
翻譯自: https://www.javacodegeeks.com/2018/08/apache-commons-versus-jdk.html
總結
以上是生活随笔為你收集整理的Apache Commons ArrayUtils.toString(Object)与JDK Arrays.toString(Object)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑中应该必备的八款单机游戏适合电脑单机
- 下一篇: 为Envoy构建控制平面的指南-特定于域