为什么Java lib stream()在流式传输的元素是一个拆分的字符串时创建一个对象数组?

avkwfej4  于 2023-02-15  发布在  Java
关注(0)|答案(3)|浏览(94)

我有一个字符串如下“AaaBBBBCCCC”。
我想把这个字符串转换成一个字符串列表和一个字符串数组。
为了实现这一点,首先我做了以下操作:
var list1 = Arrays.stream(input.split(" ")).toList(); System.out.println(list1);
然后,出现的是[Aaaa, Bbbb, Cccc]
现在轮到阵列了。
当我打印数组的类时,Java说它的类是Object(class [Ljava.lang.Object)。
我怎样才能得到一个字符串数组而不是对象?

cpjpxq1n

cpjpxq1n1#

不太确定,如果我没弄错的话。input.split(" ")已经返回了一个字符串数组。要从这个数组创建一个List,只需要使用

Arrays.asList(input.split(" "))
6tr1vspr

6tr1vspr2#

Java中的数组在内部也是一个object
此输出的原因是toString()(用于输出到println)方法在String类中实现,而不是在Array对象中实现。因此,使用了来自父Object类的标准toString()。对于类似的输出,可以使用Arrays.toString()

jv4diomz

jv4diomz3#

如果您有一个String,其中包含由空格分隔的单词,如String str = "Aaaa Bbbb Cccc";,则可以仅使用split方法来获得String数组:String[] arr = str.split(" ");。然后可以使用List<String> list = Arrays.asList(arr);获得一个List。
但是,如果我理解正确的话,您会问为什么在使用Arrays.stream(str.split(" ")).toArray()时得到的是Object数组而不是String数组,这里的原因是Arrays.stream()方法有以下实现:当数组包含基元数据类型时,可以传递int[]long[]double[]数组。不能将其他基元数据类型(如char[])的任何数组作为参数传递给Arrays.stream()。在您的情况下,您的数组包含String类型的对象;但是,Array.stream()的实现对任何非基元类型使用泛型数据类型T[]。未绑定的泛型数组在运行时解析为类型Object[],并且无法轻松转换为任何其他类型(如String[])。因此,您会得到数组类型为Object[]而不是String[]的输出。
因此,如果变量str包含单词,并调用System.out.println(str.split(" "));,则会得到:[Ljava.lang.String。但如果调用System.out.println(Arrays.stream(str.split(" ")).toArray());,则会得到:[Ljava.lang.Object.
如果要以可读形式打印数组的元素,可以使用Arrays.toString()方法:System.out.println(Arrays.toString(str.split(" ")));。这会将[Aaaa, Bbbb, Cccc]打印到控制台。
有关Arrays.stream()方法的不同变体,请参阅文档:Arrays (Java Platform SE 8)
如果要更好地理解泛型类型的数组,请参见www.example.com上的以下资源:Creating a Generic Array in Javabaeldung.com: Creating a Generic Array in Java

相关问题