前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java避坑指南:java.util.Arrays工具类避坑记

Java避坑指南:java.util.Arrays工具类避坑记

作者头像
崔认知
发布2023-06-19 17:01:46
1380
发布2023-06-19 17:01:46
举报
文章被收录于专栏:nobodynobody

坑一:java.util.Arrays#asList的参数不要传入基本类型数组


示例:基本类型数组作为参数

代码语言:javascript
复制
package com.example.demo;

import java.util.Arrays;
import java.util.List;


/**
 * @author 认知科技技术团队
 * 微信公众号:认知科技技术团队
 */
public class Demo {
    public static void main(String[] args) {
        long[] demo = new long[]{1L, 8L, 88L};
        List<long[]> longs = Arrays.asList(demo);
        System.out.println(longs);
        for (long[] aLong : longs) {
            System.out.println(aLong);
        }
    }
}

输出:

基本类型数组作为Arrays.asList参数,返回的列表中只有一个元素。

因为Arrays.asList的参数是一个泛型变长参数,但是java中基本类型是不能泛型化的。

我们必须使用包装类型,避免这种问题的发生:

代码语言:javascript
复制
/**
 * @author 认知科技技术团队
 * 微信公众号:认知科技技术团队
 */
public class Demo {
    public static void main(String[] args) {
        Long[] demo = new Long[]{1L, 8L, 88L};
        List<Long> longs = Arrays.asList(demo);
        System.out.println(longs);

        for (Long aLong : longs) {
            System.out.println(aLong);
        }
    }
}

结果:

其实基本类型作为参数,如果使用IDE的自动赋值给变量功能,从其返回类型中我们也可以看出问题所在:

返回类型:

当然我们的参数直接为多个基本类型变量,不会有这个问题的发生,如下示例:

代码语言:javascript
复制
/**
 * @author 认知科技技术团队
 * 微信公众号:认知科技技术团队
 */
public class Demo {
    public static void main(String[] args) {
        List<Integer> integers = Arrays.asList(1, 2, 3, 4, 5, 6);
        System.out.println(integers);
    }
}

坑二、java.util.Arrays#asList返回的List对象不能修改


示例: 返回的List对象添加操作

代码语言:javascript
复制
/**
 * @author 认知科技技术团队
 * 微信公众号:认知科技技术团队
 */
public class Demo {
    public static void main(String[] args) {
        List<Integer> integers = Arrays.asList(1, 2, 3, 4, 5, 6);
        integers.add(1);
    }
}

输出:

抛出异常:UnsupportedOperationException。

因为java.util.Arrays#asList返回的list对象是java.util.Arrays类中的一个私有的静态内部类:

代码语言:javascript
复制
java.util.Arrays.ArrayList

此类没有实现父类AbstractList的增加、删除操作方法:

代码语言:javascript
复制
public void add(int index, E element) {
        throw new UnsupportedOperationException();
    }
代码语言:javascript
复制
public E remove(int index) {
        throw new UnsupportedOperationException();
    }

默认都是抛出异常UnsupportedOperationException。

坑三、java.util.Arrays#asList传入数组对象返回的list并不是原数组对象的copy,修改会反映到原数组对象


示例:

代码语言:javascript
复制
/**
 * @author 认知科技技术团队
 * 微信公众号:认知科技技术团队
 */
public class Demo {
    public static void main(String[] args) {
        Integer[] integers = new Integer[]{1, 2, 3, 4, 5, 6};
        List<Integer> list = Arrays.asList(integers);
        System.out.println(list);
        System.out.println(Arrays.toString(integers));

        list.set(0,999); //修改操作
        System.out.println(list);
        System.out.println(Arrays.toString(integers));
    }
}

输出:

我们可以使用java.util.ArrayList的构造函数

代码语言:javascript
复制
java.util.ArrayList#ArrayList(java.util.Collection<? extends E>)
代码语言:javascript
复制
new ArrayList<>(Arrays.asList(stringArray))

来深度复制一份原数组对象。

小结


java.util.Arrays工具类避坑记

👍🏻java.util.Arrays#asList的参数不要传入基本类型数组;

【👍🏻】java.util.Arrays#asList返回的List对象不能修改;

【👍🏻】java.util.Arrays#asList传入数组对象返回的list并不是原数组对象的copy,修改会反映到原数组对象;

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-08-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 认知科技技术团队 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档