Java集合的5点细节

1、实现了compareTo方法,就有必要实现equals方法,同时还需要确保两个方法同步

compareTo是判断元素在排序中的位置是否相等,equals是判断元素是否相等,既然一个决定排序位置,一个决定相等,所以我们非常有必要确保当排序位置相同时,其equals也应该相等。

2、subList返回的只是原列表的一个视图,它所有的操作最终都会作用在原列表上

如:从list中删除部分数据:list.subList(100, 200).clear();

3、在使用asList时不要将基本数据类型当做参数,应使用其包装类

如:int[] intA = {1,2,3,4,5};
        List list = Arrays.asList(intA);--------返回的list的size是1,内部item第一个元素是int[] intA的数组值;

使用包装类时:

因为:asList的源码

    @SafeVarargs
    @SuppressWarnings("varargs")
    public static <T> List<T> asList(T... a) {
        return new ArrayList<>(a);//该ArrayList是Arrays的一个内部类,不是java.util.ArrayList
    }

该方法的接受参数是变长泛型T的,8种基本数据类型是无法发型化,所以在将int[] intA数组对象作为一个泛型T的方法入参;

4、不要试图改变(dd、remove等)asList返回的列表结构,否则会直接抛出UnsupportedOperationException异常

在第3点说到,Arrays.asList(T... a)的源码,返回的该ArrayList是Arrays的一个内部类java.util.Arrays.ArrayList,不是java.util.ArrayList。该内部类提供了size、toArray、get、set、indexOf、contains方法,而像add、remove等改变list结构的方法从AbstractList父类继承过来,它会直接抛出UnsupportedOperationException异常:

内部类java.util.Arrays.ArrayList支持的方法有:

其他操作结构的方法(add、remove等),来自java.util.AbstractList的实现:

如果非要操作,可以使用 java.util.ArrayList包一层:new java.util.ArrayList(将asList的java.util.Arrays.ArrayList)

5、如果知道集合容器的大小,要为集合指定初始容量,优化性能

如:ArrayList:动态扩容时,新容量=旧容量的1.5倍,使用System.copy方法完成数组拷贝;

       HashMap:动态扩容时(达到阈值),新容量=旧容量的2倍,新阈值=旧阈值的2倍,新建节点数组,完成拷贝;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值