网站开发中网页上传和网站发布,网页设计实训方法步骤,网站设计的软件,郫县网站建设Apache Commons Lang提供了一个ArrayUtils类#xff0c;其中包含toString#xff08;Object#xff09;方法#xff0c;该方法“将数组作为字符串输出”。 在本文中#xff0c;我将研究当JDK提供Arrays.toString#xff08;Object []#xff09;方法[以及原始类型数组的… Apache Commons Lang提供了一个ArrayUtils类其中包含toStringObject方法该方法“将数组作为字符串输出”。 在本文中我将研究当JDK提供Arrays.toStringObject []方法[以及原始类型数组的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表示形式。 JDK Arrays.toString(Object[])与ACL ArrayUtils.toString(Object) 比较典型Java数组的单字符串输出 输入数组 JDK Arrays.toString(Object[]) Apache Commons Lang ArrayUtils.toString(Object) {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.valueOfObject返回的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.toStringObject可以很好地处理该情况并且不会假装为“数组”方法实际上它不会对数组没有太大帮助。 通过提供每个实现预期参数的差异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的二维数组传递给相应方法的输出。 JDK Arrays.toString(Object[])与ACL ArrayUtils.toString(Object) 比较二维数组的单字符串输出 输入数组 JDK Arrays.toString(Object[]) Apache Commons Lang ArrayUtils.toString(Object) {{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.toStringObject和JDKJDK 10 Arrays.toStringObject []的特性的讨论 。 JDK Arrays.toString(Object[])与ACL ArrayUtils.toString(Object) 输入类型 JDK Arrays.toString(Object[]) Apache Commons Lang ArrayUtils.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.toStringObject []来选择第三方Apache Commons Lang的ArrayUtils.toStringObject 来生成数组的单个String表示形式。 我发现最明显的情况是对于多维数组选择此特定的第三方库而不是内置替代方法。 翻译自: https://www.javacodegeeks.com/2018/08/apache-commons-versus-jdk.html