java.lang.UnsupportedOperationException

数组转List 方法Arrays.asList()

有些人做开发一两年,都搞不清楚的java基础知识:

public class Test {
    public static void main(String[] args) {
        /*int[] iArr = {456,789,1230,741,8520,963};
        //List<int> iList = Arrays.asList(iArr); // err  List 里面存的并不是 多个int类型 元素
        List<int[]> iList = Arrays.asList(iArr); // ok  而是 int[] 类型 一个对象
        System.out.println(iList);               // [[I@4b85612c]
        for (int i = 0; i < iList.size(); i++) { // 只会循环一次(内部不抛异常的情况下)
            System.out.println("O(∩_∩)O~");
            if (0==i)
                iList.remove(i); // 增删元素操作会抛异常:java.lang.UnsupportedOperationException
        }*/

        /*String[] sArr = {"456","789","1230","741","8520","963"};
        //List<String[]> sList = Arrays.asList(sArr); // err  List 里面存的并 不是String[] 类型 一个对象
        List<String> sList = Arrays.asList(sArr); // ok  而是 多个String类型 元素
        System.out.println(sList);                // [456, 789, 1230, 741, 8520, 963]
        for (int i = 0; i < sList.size(); i++) {  // 会循环多次(内部不抛异常的情况下)
            System.out.println("O(∩_∩)O~");
            if (0==i)
                sList.remove(i); // 增删元素操作会抛异常:java.lang.UnsupportedOperationException
        }*/

        // String类型是个特殊的 引用类型 ,Arrays.asList()会特别处理,其他 引用类型(基本数据类型会自动包装) 和 iArr的效果一样。
        // Arrays.asList()转过来的 List 是不能进行增删操作的!!
        // 解决办法:new ArrayList<>(作为参数传到这里);

        List<String> okList = new ArrayList<>(Arrays.asList(new String[]{"456","789","1230","741","8520","963"}));
        System.out.println(okList);
        for (int i = 0; i < okList.size(); i++) { // 现在 完全是一个正常的List,可以正常增删操作
            System.out.println("O(∩_∩)O~");
            if ("789".equals(okList.get(i))){
                okList.remove(i--); // 遍历List时,根据角标删除元素 角标--
            }
        }
    }
}

  • // 遍历List时,根据角标删除元素 角标–
  • 原因:集合中删了一个元素,后面的元素会自动前移,
  • 比如说 刚把角标2上的元素删了,继续循环 就轮到角标3了,
  • 可是后面元素前移,之前在角标3位置的元素现在已经在角标2上了
  • 不–操作,刚移到角标2的元素就成了漏网之鱼!!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值