new ArrayList、subList和Arrays.asList浅析

在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体现的是适配器模式,只是转换接口,后台的数据仍是数组。

总结
#addremovesetclear
new ArrayList
subList
Arrays.asList
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值