前提,引入的是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.自己写个方法实现吧