Java等效的C#匿名数组和列表?

ash*_*999 7 c# java arrays collections

当我需要将它们传递给函数时,C#允许我动态地创建数组.假设我有一个名为的方法findMiddleItem(String[] items).在C#中,我可以编写如下代码:

findMiddleItem(new String[] { "one", "two", "three" });
Run Code Online (Sandbox Code Playgroud)

这太棒了,因为这意味着我不必写:

IList<String> strings = new List<String>();
strings.add("one");
strings.add("two");
strings.add("three");
findMiddleItem(strings.ToArray());
Run Code Online (Sandbox Code Playgroud)

这很糟糕,因为我并不在乎strings- 它只是一个让我将字符串数组传递给需要它的方法的构造.一种我无法修改的方法.

那么你如何用Java做到这一点?我需要知道数组类型(例如String [])以及泛型类型(例如List).

Sea*_*oyd 18

List和Array是根本不同的东西.

A ListCollection类型,接口的实现.
Array是一种特殊的操作系统特定数据结构,只能通过特殊语法或本机代码创建.

数组

在Java中,数组语法与您描述的语法相同:

String[] array = new String[] { "one", "two", "three" };
Run Code Online (Sandbox Code Playgroud)

参考: Java教程>数组

清单

创建List的最简单方法是:

List<String> list = Arrays.asList("one", "two", "three");
Run Code Online (Sandbox Code Playgroud)

但是,结果列表将是不可变的(或者至少它不支持add()remove()),因此您可以使用ArrayList构造函数调用来包装调用:

new ArrayList<String>(Arrays.asList("one", "two", "three"));
Run Code Online (Sandbox Code Playgroud)

正如Jon Skeet所说,它与番石榴相比更漂亮,你可以做到:

Lists.newArrayList("one", "two", "three");
Run Code Online (Sandbox Code Playgroud)

参考:Java Tutorial > The List Interface,Lists(番石榴javadocs)

VARARGS

关于这个评论:

如果我们能够做findMiddleItem({"one","two","three"})会很好;

Java varargs为您提供了更好的交易:

public void findMiddleItem(String ... args){
    //
}
Run Code Online (Sandbox Code Playgroud)

你可以使用可变数量的参数调用它:

findMiddleItem("one");
findMiddleItem("one", "two");
findMiddleItem("one", "two", "three");
Run Code Online (Sandbox Code Playgroud)

或者使用数组:

findMiddleItem(new String[]{"one", "two", "three"});
Run Code Online (Sandbox Code Playgroud)

参考: Java Tutorial > Arbitrary Number of Arguments