new ArrayList、subList和Arrays.asList淺析
阿新 • • 發佈:2019-02-07
在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 | √ |