【问题标题】:java - StringUtils.join() returning pointerjava - StringUtils.join() 返回指针
【发布时间】:2015-07-07 06:09:04
【问题描述】:

我试图通过 Apache commons 库中的 StringUtils.join(array, separator) 方法加入数组的元素。谁能解释一下,如果我使用像 int[] 这样的原始类型数组,为什么我不能得到结果字符串,只有一个指向它的位置的指针? 请看下面的示例代码:

public static void main(String[] args){

    String[] s = new String[]{"Anna","has", "apples"};
    System.out.println(StringUtilities.join(s, " "));

    int[] a = new int[]{1,2,3};
    System.out.println(StringUtilities.join(a, " "));

    Integer[] b = new Integer[]{1,2,3};
    System.out.println(StringUtilities.join(b, " "));
}

仅使用 Integer 数组有效。我知道原语数组在内部的处理方式与 ArrayList 或其他高阶对象不同,但是为什么有可能(或多或少相同的主题,但可能有不同的问题)实例化 HashMap<String, int[]> 而没有任何警告、异常?数组内部是否包含在另一个对象中?只适用于地图?从我从文档中读到的内容中,您无法使用原始类型对地图、集合、数组列表等进行参数化,这是我理解的,但是......我觉得有点令人困惑。任何合理的解释将不胜感激。谢谢。

【问题讨论】:

    标签: java types return-value primitive


    【解决方案1】:

    看看intStringUtils#join数组的签名:

    join(byte[] array, char separator)
    

    你打电话给join使用

    StringUtils.join(a, " "),
    

    使用字符串而不是字符。 尝试使用

    StringUtils.join(a, ' ')
    

    改为。

    发生的情况是您的呼叫匹配了另一个签名:

    join(T... elements),
    

    所以你的参数被解释为两个对象,一个整数数组和一个带有空格字符的字符串。在创建结果字符串时,该方法将整数数组的字符串表示形式与字符串连接起来。

    【讨论】:

    • 如果我使用StringUtils.join(intArray)也是一样的效果。我不需要放置任何分隔符,这只是为了举例。传递一个 int(基元)数组并调用任何方法的签名(即,有或没有分隔符,分隔符作为 char 或字符串产生相同的效果)。试试看:int[] a = new int[]{1,2,3}; System.out.println(StringUtilities.join(a, ' ')); System.out.println(StringUtilities.join(a)); System.out.println(StringUtilities.join(a, " "));
    • 调用join(a) 也匹配可变参数签名,因此您将获得intArray 的object 字符串表示形式,这恰好是@Kayaman 解释的输出。如果要将 int 数组与分隔符 char 连接,则必须使用正确的 char 参数。因此调用了正确的方法(从单个 int 数组条目创建字符串的方法)。
    • @Marius 我很难相信int[] a = new int[] {1, 2, 3}; StringUtils.join(a, ' '); 不会打电话给the correct method
    • @Marius 我尝试了所有示例。使用(a, ' ') 的调用返回“1 2 3”。使用(a, " ") 的调用返回类似于“[I@659e0bfd”的字符串(注意:末尾有一个空格字符,此调用的结果被解释为object 类型的可变参数)。
    • @Marius 您使用的是哪个版本的 Apache Commons,您确定您的 StringUtilities 课程没有任何会打乱电话的内容吗?
    【解决方案2】:

    一个整数数组(一个基元)是一个对象。

    我怀疑该实现不支持原始数组,并在它们上调用toString(),从而导致类似于[I@659e0bfd(转换为Ints 的一维(只有一个[)数组及其“内存位置”)。

    【讨论】:

    • 是的,类似的。几个月前在某些数组上调用 toString() 时第一次看到这一点,但我希望这个问题能够得到解决,无论是实现原始类型的 toString() 方法还是警告用户这无法实现。到底是谁的错? Java还是阿帕奇?我猜 Java .. apache 只是利用了 API
    • 这是 Apache 的“错误”。基元类型不能有toString() 方法,因为基元没有方法(这不是问题)。数组不会覆盖 toString(),因为这可能是毁灭性的(假设您有一个 byte[10000000] 并且有人在其上调用了 toString())。如果您需要漂亮地打印数组,请使用Arrays.toString(fooArray);
    • 呵呵呵呵.. 确实如此,但如果将基元数组视为对象并具有 toString() 方法,Java 社区也应该清理这个“混乱”或至少隐藏它。无论如何,为了美化,这就是我一直在使用的Arrays.toString()。感谢您的回答。
    • 您应该将 Katja 的答案标记为正确,因为她的推理是正确的。原来这不是 Java 或 Apache 的错;)
    • 查看我的评论以获得她的答案
    猜你喜欢
    • 2013-02-11
    • 1970-01-01
    • 2013-04-10
    • 1970-01-01
    • 1970-01-01
    • 2018-05-30
    • 1970-01-01
    • 2014-08-02
    • 2011-10-26
    相关资源
    最近更新 更多