StringUtils的坑,关于StringUtils.join传入的是基本类型的数组返回乱码

前提,引入的是org.apache.commons.lang3下的StringUtils

今天发现了一个StringUtils巨大的坑,害得我调试了太久,连源码都看了好多遍,终于发现了这个问题!!

先上代码:


int[] array = {1, 2, 3, 4};
System.out.println(StringUtils.join(array,","));

我期望输出也是理论输出的是 :1,2,3,4

实际输出:[I@36aa7bc2,

然后我进源码看:

public static String join(int[] array, char separator) {
        return array == null ? null : join((int[])array, separator, 0, array.length);
}

public static String join(int[] array, char separator, int startIndex, int endIndex) {
        if (array == null) {
            return null;
        } else {
            int noOfItems = endIndex - startIndex;
            if (noOfItems <= 0) {
                return "";
            } else {
                StringBuilder buf = new StringBuilder(noOfItems * 16);

                for(int i = startIndex; i < endIndex; ++i) {
                    if (i > startIndex) {
                        buf.append(separator);
                    }

                    buf.append(array[i]);
                }

                return buf.toString();
            }
        }
    }

有关的方法我已经贴出来了,而且就照着这个方法运行下去,都能获取到正确的值。

这就让人很无奈了,然后接下来让我经历了永生难忘的一幕,大家请看这个方法:

@SafeVarargs
public static <T> String join(T... elements) {
    return join((Object[])elements, (String)null);
}

这个也是可变参数方法StringUtils里面的方法,原谅我真的想骂人了。

所以我的问题就出现了,尽管 StringUtils提供了支持基本类型数组(例如int,byte,char)的join方法,可是,他同时也提供了一个可变参数的方法,然后悲剧来了。所有的基本类型数组,都统一的进入了可变参数方法!!但是所有的包装类型数组就能进入正常的方法。

解决方案:

1.把基本类型数组换为对应的包装类型的数组

2.自己写个方法实现吧

发布了71 篇原创文章 · 获赞 13 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/qq_29611427/article/details/86074706