在Java中List是我们很常用的数据结构,对此我们有必要简单了解一下创建List的三种方式并对它们进行一些简单的测试。
- new ArrayList
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
System.out.println("----------new ArrayList----------");
for (Integer i : list) {
System.out.println(i);
}
list.set(0, 10);
System.out.println("----------set修改----------");
for (Integer i : list) {
System.out.println(i);
}
list.remove(0);
System.out.println("----------remove删除----------");
for (Integer i : list) {
System.out.println(i);
}
list.add(0, 0);
System.out.println("----------add添加----------");
for (Integer i : list) {
System.out.println(i);
}
打印结果:
----------new ArrayList----------
1
2
3
4
5
----------set修改----------
10
2
3
4
5
----------remove删除----------
2
3
4
5
----------add添加----------
0
2
3
4
5
使用new ArrayList<>()创建的List的增、删、改操作都正常。
- subList
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
List<Integer> subList = list.subList(2, 4);
System.out.println("----------subList----------");
for (Integer i : subList) {
System.out.println(i);
}
for (Integer i : list) {
System.out.println(" " + i);
}
subList.set(0, 10);
System.out.println("----------set修改----------");
for (Integer i : subList) {
System.out.println(i);
}
for (Integer i : list) {
System.out.println(" " + i);
}
subList.remove(0);
System.out.println("----------remove删除----------");
for (Integer i : subList) {
System.out.println(i);
}
for (Integer i : list) {
System.out.println(" " + i);
}
subList.add(0, 0);
System.out.println("----------add添加----------");
for (Integer i : subList) {
System.out.println(i);
}
for (Integer i : list) {
System.out.println(" " + i);
}
打印结果:
----------subList----------
3
4
1
2
3
4
5
----------set修改----------
10
4
1
2
10
4
5
----------remove删除----------
4
1
2
4
5
----------add添加----------
0
4
1
2
0
4
5
如上所示,List的增、删、改操作也都正常。其实使用subList创建的List返回的是ArrayList的内部类SubList,并不是ArrayList,而是ArrayList 的一个视图,对于SubList子列表的所有操作最终会反映到原列表上。
- Arrays.asList
List<Integer> list = Arrays.asList(1,2,3,4,5);
System.out.println("----------Arrays.asList----------");
for (Integer i : list) {
System.out.println(i);
}
list.set(0, 10);
System.out.println("----------set修改----------");
for (Integer i : list) {
System.out.println(i);
}
list.remove(0);
System.out.println("----------remove删除----------");
for (Integer i : list) {
System.out.println(i);
}
list.add(0, 0);
System.out.println("----------add添加----------");
for (Integer i : list) {
System.out.println(i);
}
打印结果:
----------Arrays.asList----------
1
2
3
4
5
----------set修改----------
10
2
3
4
5
Exception in thread "main" java.lang.UnsupportedOperationException
如上所示,List的set修改可以执行,但是remove和add方法抛出UnsupportedOperationException异常错误。
使用工具类Arrays.asList()把数组转换成集合时,不能使用其修改集合相关的方法,它的add/remove/clear方法会抛出UnsupportedOperationException异常。
asList的返回对象是一个Arrays内部类,并没有实现集合的修改方法。Arrays.asList体现的是适配器模式,只是转换接口,后台的数据仍是数组。
总结
# | add | remove | set | clear |
---|---|---|---|---|
new ArrayList | √ | √ | √ | √ |
subList | √ | √ | √ | √ |
Arrays.asList | √ |