本文为看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
.
boxed()方法的返回值是Stream<Integer>,字面翻译过来就是,装箱操作,将stream中存储的int都装箱变成Integer。最后这个Stream<Integer>调用了collect()方法。这里又涉及到了“收集器”的概念,网上找了一篇文章,解释的很不错:JAVA 8 理解Collector
collect()方法接收的是一个“Collector<? super T,A,R> collector”参数。
- T 是流中要收集的对象的泛型
- A 是累加器的类型,累加器是在收集过程中用于累积部分结果的对象。
- 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());
}
}
这是我通过文章整理分享得到的结果,文章详细内容见开头链接。