使用Arrays.asList()应该注意的一些细节地方

本文为看java学习资料时,自己整理的一些东西,避免之后再去回去重新查阅。

关于java的Array学习资料链接:Java Array to List Example

Array.asList的使用方法也很简单,但也有很多需要值得注意的地方。这是asList的正常使用方法:

public class Test {
   public static void main(String[] args) {
      String[] myArray = { "Apple", "Banana", "Orange" };
      List<String> myList = Arrays.asList(myArray);
      for (String str : myList) {
         System.out.println(str);
      }
   }
}

输出的结果:“Apple”,“Banana”,“Orange”

需要注意的地方是,这种转换有一些问题、原文:The Array passed must be an array of Objects and not of primitive type。翻译过来就是,传递的数组,必须是对象数组,而不是基本数组。

话语多有歧义,还是看代码比较实在。

public class Test {
   public static void main(String[] args) {
      int[] myArray = { 1, 2, 3 };
      List myList = Arrays.asList(myArray);
      System.out.println(myList.size());
   }
}

这段代码最后的输出结果是:1

并不像String数组一样,int的数组经过asList转换之后,并没有将1,2,3给添加进去。而是将myArray当成了一个对象,所以myList得长度为1.当你使用myList.get(0)方法,得到的是myArray这一个数组。

另外一个需要注意的地方是:The List created by asList is fixed-size。翻译过来就是,使用asList创建的List长度是固定的。

长度固定,说明是没办法使用add方法添加新元素进去。

public class Test {
   public static void main(String[] args) {
      String[] myArray = { "Apple", "Banana", "Orange" };
      List<String> myList = Arrays.asList(myArray);
      myList.add("Guava");
   }
}

当运行这段代码的时候,会弹出错误:

Exception in thread "main" java.lang.UnsupportedOperationException
	at java.util.AbstractList.add(AbstractList.java:148)
	at java.util.AbstractList.add(AbstractList.java:108)
	at Test.main(Test.java:8)

同样的,在使用remove方法的时候,也会弹出类似的错误。

至于第一种情况的解决办法,文中给出了解决的办法。

public class Test {
   public static void main(String[] args) {
      int[] intArray = { 5, 10, 21 };
      List myList = Arrays.stream(intArray).boxed()
            .collect(Collectors.toList());
   }
}

Arrays.strem方法存在于JAVA 8中,如果SDK使用的不是8,是没办法使用这个方法的。Arrays.stream()有几个同名重载的方法,在这里,使用的是Arrays.stream(int[]  array)这个方法,该方法的返回值是IntStream。boxed()方法存在于IntStream中,官方文档对该方法是这样的解释:

Returns a Stream consisting of the elements of this stream, each boxed to an Integer.

Java 8官方API文档

boxed()方法的返回值是Stream<Integer>,字面翻译过来就是,装箱操作,将stream中存储的int都装箱变成Integer。最后这个Stream<Integer>调用了collect()方法。这里又涉及到了“收集器”的概念,网上找了一篇文章,解释的很不错:JAVA 8 理解Collector

collect()方法接收的是一个“Collector<? super T,A,R> collector”参数。

  1. T 是流中要收集的对象的泛型
  2. A 是累加器的类型,累加器是在收集过程中用于累积部分结果的对象。
  3. R 是收集操作得到的对象 (通常但不一定是集合) 的类型。

至于Collectors.toList(),官方文档的解释是:Returns a Collector that accumulates the input elements into a new List.

总之,最后int数组存储到了list之中,不过需要注意的是,存在List之中的并不是Int类型的数据,而是Object类型,使用get方法通过下标获取值时,需要加小括号进行类型转换,才能得到想要的int类型的值。

除去这种比较麻烦的方法,文中还给出了第二种解决的办法:

public class Test {
   public static void main(String[] args) {
      String[] myArray = { "5", "6", "7" };
      List<Integer> myList = new ArrayList<Integer>();
      for (String str : myArray) {
         myList.add(Integer.valueOf(str));
      }
   }
}

先使用String类型将数字用字符串的形式,再通过for循环,使用Integer.valueOf()方法将字符串转换为Integer进行存储。两种方法各有各的好处和坏处,利弊根据情况去权衡。

第二个难题,使用asList()导致固定长度的问题。文中也给出了解决的办法:

public class Test {
   public static void main(String[] args) {
      String[] myArray = { "Apple", "Banana", "Orange" };
      List<String> myList = new ArrayList<String>(Arrays.asList(myArray));
      myList.add("Guava");
   }
}

既然Arrays.asList()方法创建出来的无法进行增加和删除,那么我们就自己先新建一个ArrayList,对ArrayList进行数据操作就可以了。这也是目前比较广的解决方式吧。

或者用自己的方式,将这些数据进行存储。文中列出了例子:

public class Test {
   public static void main(String[] args) {
      String[] myArray = { "Apple", "Banana", "Orange" };
      List<String> myList = new ArrayList<String>();
      for (String str : myArray) {
         myList.add(str);
      }
      System.out.println(myList.size());
   }
}

这是我通过文章整理分享得到的结果,文章详细内容见开头链接。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值