ArrayList声明与转换

时间:2015-08-19 10:22:26

标签: java string arraylist

我与Java编程完全脱节,并且正在谷歌的Udacity课程作为复习。我正在浏览Sunshine应用程序的第1课,讲师通过声明一个字符串数组然后将其转换为ArrayList来选择创建虚假数据。

代码如下:

aspx

我想知道使用这种转换方法有什么好处吗?为什么不立即将数据声明为ArrayList:

String[] data = {
            "Mon 6/23 - Sunny - 31/17",
            "Tue 6/24 - Foggy - 21/8",
            "Wed 6/25 - Cloudy - 22/17",
            "Thurs 6/26 - Rainy - 18/11",
            "Fri 6/27 - Foggy - 21/10",
            "Sat 6/28 - TRAPPED IN WEATHERSTATION - 23/18",
            "Sun 6/29 - Sunny - 20/7"
    };
    List<String> weatherForecast = new ArrayList<>(Arrays.asList(data));

谢谢!

6 个答案:

答案 0 :(得分:13)

“正常”方式是使用第三种形式:

List<String> weatherForecast = new ArrayList<>();
Collections.addAll(weatherForecast,
        "Mon 6/23 - Sunny - 31/17",
        "Tue 6/24 - Foggy - 21/8",
        "Wed 6/25 - Cloudy - 22/17",
        "Thurs 6/26 - Rainy - 18/11",
        "Fri 6/27 - Foggy - 21/10",
        "Sat 6/28 - TRAPPED IN WEATHERSTATION - 23/18",
        "Sun 6/29 - Sunny - 20/7");

List是一个接口,使用它可以使用另一个类似LinkedList的实现类(仅用于几个元素)。也可用作参数类型。

这使用Collections实用程序类添加varargs ...字符串。并且在引擎盖下使用String[]用于那些参数。

第一个选项的.asList足以让List<String>无法添加。

答案 1 :(得分:5)

两者都做同样的事情。

但不同的是,第一个使它更具可读性。您完全知道要将天气预报信息添加到列表中。

在第二种情况下,您只是继续使用add()添加信息,这实际上看起来有点笨拙。

考虑将素数添加到列表中

First Approach:
int [] primeNums = {2, 3, 5, 7, 11, 13, 17, 19};
List<Integer> primes = new ArrayList<>(Arrays.asList(primeNums));

Second Approach:
List<Integer> primes = new ArrayList<>();
primes.add(2);
primes.add(3);
primes.add(5);
primes.add(7);
primes.add(11);
primes.add(13);
primes.add(17);
primes.add(19);

此外,您可以遍历数组并添加它。

for(int i = 0; i < primeNums.length; ++i)
  primes.add(primeNums[i]);

答案 2 :(得分:5)

第一种方法:

  • 更好的可读性(可以更好,见我的替代方案);所有数据都直接用逗号分隔,而不是通过方法调用来添加每个数据。
  • Arrays.asList使用内部ArrayList类为给定的特定数组创建固定大小列表,该类只是数组本身的包装,使其更有效创建数组的完整副本。
  • 您将数据保存在List变量而不是ArrayList变量中,这样可以提供更大的灵活性。

第二种方法:

  • 你使用的是原始类型,一开始就很糟糕。
  • 没有优势。

如果您使用该方法,请至少以通用方式声明List

ArrayList<String> weatherForecast = new ArrayList<>();

替代方案:

请注意,您可以直接执行:

List<String> weatherForecast = Arrays.asList(
    "Mon 6/23 - Sunny - 31/17",
    "Tue 6/24 - Foggy - 21/8",
    "Wed 6/25 - Cloudy - 22/17",
    "Thurs 6/26 - Rainy - 18/11",
    "Fri 6/27 - Foggy - 21/10",
    "Sat 6/28 - TRAPPED IN WEATHERSTATION - 23/18",
    "Sun 6/29 - Sunny - 20/7"
);

答案 3 :(得分:3)

性能方面,您的答案可能会更好,因为您只是实例化一个数据结构(ArrayList)并向其添加元素。除了可读性部分,您的讲师将实例化两个数组,然后将其转换为arrayList,这是一个可扩展的数组。它可能没有太大的性能影响,但你的表现肯定更快。

答案 4 :(得分:2)

两者都在做同样的事情;但代码可读性很重要;

考虑一个例子 -

允许应用程序将值放入最大容量的数组中,并且per this link可以在数组中允许最大Integer.MAX_VALUE - 5个值。 一旦填充了数组,开发人员就需要像上面那样将其转换为List。

现在,想想如果某人在这种情况下使用add方法,那么明确的代码行将会增长,代码将变得难以阅读。

因此,在这种情况下,首选操作将使用Arrays.asList(data);

答案 5 :(得分:1)

没有特别的优势。

在第一种情况下,您不必要将Arrays.asList()创建的数组包装为新数组。

如果数组内容是静态的,请使用第二种情况。