如何将一个数组转换成一个集合,我们首先想到的一个方法是通过java自带的api实现,
Arrays.asList(T t);
使用这种方式将数组转成集合的话,需要特别注意,这个api返回的ArrayList并不是我常用的java.util.ArrayList,他是一个Arrays的一个内部类,
java.util.Arrays$ArrayList
这个类被定义长一个定长的集合,他直接集成AbstractList类,并且没有重写,add,del,set这些方法,所以使用这个api转换数组集合的时候,需要特别注意,不能进行这一类操作,否则会抛出与异常。
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.AbstractList.add(AbstractList.java:148)
at java.util.AbstractList.add(AbstractList.java:108)
这是其中一个坑
还有另外一个就是如果使用Arrays.asList()方法生成的集合,如果原先的数组修改了元素,那么新生成的集合的元素也会对应修改,
这里我们可以通过把对象打印出来得到结果
User[] a = new User[]{new User("a", "a", 3)};
List<User> lt = Arrays.asList(a);
List<User> ddd = new ArrayList<>();
for (int i = 0; i < a.length; i++) {
System.out.println(a[i]);
ddd.add(a[i]);
}
a[0] = new User("a", "b", 4);
System.out.println("-----new ArrayList----");
for (User user : ddd) {
System.out.println(user);
}
System.out.println("----原数组-----");
for (int i = 0; i < a.length; i++) {
System.out.println(a[i]);
ddd.add(a[i]);
}
System.out.println("-----Arrays.asList()----");
for (User ss : lt) {
System.out.println(ss);
}
demo6.User@675d3402
-----new ArrayList----
demo6.User@675d3402
----原数组-----
demo6.User@482f8f11
-----Arrays.asList()----
demo6.User@482f8f11
可以发现,Arrays.asList 和数组保持一致,二new Arraylist出来的集合则不做修改。这些坑尤为注意
严重怀疑定义这个内部类的意义。。