如何将对象数组转换为Java中的string数组

我使用下面的代码将一个Object数组转换为一个String数组:

Object Object_Array[]=new Object[100]; // ... get values in the Object_Array String String_Array[]=new String[Object_Array.length]; for (int i=0;i<String_Array.length;i++) String_Array[i]=Object_Array[i].toString(); 

但是我想知道是否有另一种方式来做到这一点,如:

 String_Array=(String[])Object_Array; 

但是这会导致运行时错误: Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String; Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;

什么是正确的方法来做到这一点?

System.arraycopy另一种select:

 String[] stringArray = Arrays.copyOf(objectArray, objectArray.length, String[].class); 

System.arraycopy可能是最有效的方法,但对于美学,我更喜欢:

  Arrays.asList(Object_Array).toArray(new String[Object_Array.length]); 

我看到提供了一些解决scheme,但没有任何原因,所以我将详细解释这一点,因为我相信知道你做错了什么,以便从给定的答复中得到“某些东西”是同样重要的。

首先,让我们看看Oracle有什么话要说

  * <p>The returned array will be "safe" in that no references to it are * maintained by this list. (In other words, this method must * allocate a new array even if this list is backed by an array). * The caller is thus free to modify the returned array. 

这看起来可能不重要,但你会看到它是…那么下面这一行失败了什么? 列表中的所有对象都是String,但不会将其转换,为什么?

 List<String> tList = new ArrayList<String>(); tList.add("4"); tList.add("5"); String tArray[] = (String[]) tList.toArray(); 

也许,你们中许多人会认为这个代码是一样的,但事实并非如此。

 Object tSObjectArray[] = new String[2]; String tStringArray[] = (String[]) tSObjectArray; 

当实际上书面代码正在做这样的事情。 javadoc在说这个! 它会安装一个新的arrays,它会是什么对象!

 Object tSObjectArray[] = new Object[2]; String tStringArray[] = (String[]) tSObjectArray; 

所以tList.toArray实例化一个对象,而不是string…

因此,这个线程中没有提到的自然解决scheme,但是Oracle推荐的是以下内容

 String tArray[] = tList.toArray(new String[0]); 

希望已经够清楚了。

在Java 8中:

 String[] strings = Arrays.stream(objects).toArray(String[]::new); 

要转换其他types的数组:

 String[] strings = Arrays.stream(obj).map(Object::toString). toArray(String[]::new); 

谷歌集合框架提供了一个很好的转换方法,所以你可以把你的对象转换成string。 唯一的缺点是它必须从Iterable到Iterable,但这是我的方式:

 Iterable<Object> objects = ....... //Your chosen iterable here Iterable<String> strings = com.google.common.collect.Iterables.transform(objects, new Function<Object, String>(){ String apply(Object from){ return from.toString(); } }); 

这使你远离使用数组,但我认为这将是我的首选方式。

如果你想获得你的数组中的对象的string表示,那么是的,没有其他的方法来做到这一点。

如果你知道你的对象数组只包含string,你也可以做(调用toString()的未读函数):

 for (int i=0;i<String_Array.length;i++) String_Array[i]= (String) Object_Array[i]; 

当你可以使用强制转换为Object_Array的String []的唯一情况是,如果它引用的数组实际上被定义为String [],例如这将工作:

  Object[] o = new String[10]; String[] s = (String[]) o; 

这个很好,但是不像mmyers注意到的那样,因为方括号:

Arrays.toString(objectArray).split(",")

这一个是丑陋的,但工作:

Arrays.toString(objectArray).replaceFirst("^\\[", "").replaceFirst("\\]$", "").split(",")

如果你使用这个代码,你必须确保你的对象的toString()返回的string不包含逗号。

对于你的想法,其实你正在接近成功,但如果你这样做应该没问题:

 for (int i=0;i<String_Array.length;i++) String_Array[i]=(String)Object_Array[i]; 

顺便说一下,使用数组实用程序的方法是相当不错的,并使代码优雅。

 Object arr3[]=list1.toArray(); String common[]=new String[arr3.length]; for (int i=0;i<arr3.length;i++) { common[i]=(String)arr3[i]; } 

你可以使用types转换器 。 要将任何types的数组转换为string数组,您可以注册自己的转换器:

  TypeConverter.registerConverter(Object[].class, String[].class, new Converter<Object[], String[]>() { @Override public String[] convert(Object[] source) { String[] strings = new String[source.length]; for(int i = 0; i < source.length ; i++) { strings[i] = source[i].toString(); } return strings; } }); 

并使用它

  Object[] objects = new Object[] {1, 23.43, true, "text", 'c'}; String[] strings = TypeConverter.convert(objects, String[].class); 

无需任何头文件轻松更改将任何对象数组转换为string数组对象drivex [] = {1,2};

  for(int i=0; i<drive.length ; i++) { Str[i]= drivex[i].toString(); System.out.println(Str[i]); }