集合(一)

1、如果一个类实现了Serializable,则如果在某个属性上面添加关键字transient ,则这个属性就不会被序列化。
第一个:ArrayList
2、关于集合,应该关注的点:

  1. 是否允许空
  2. 是否允许重复数据
  3. 是否有序,有序的意思是读取数据的顺序和存放数据的顺序是否一致
  4. 是否线程安全
    在这里插入图片描述
    ArrayList
    1、 ArrayList就是一个以数组形式实现的集合
    2、对于ArrayList,构造方法:ArrayList()默认构造方法,提供初始容量为10的空列表
    ArrayList(int initialCapacity) 构造一个具有指定初始容量的空列表
    3、
    private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        // minCapacity is usually close to size, so this is a win:
        elementData = Arrays.copyOf(elementData, newCapacity);
    }

    private static int hugeCapacity(int minCapacity) {
        if (minCapacity < 0) // overflow
            throw new OutOfMemoryError();
        return (minCapacity > MAX_ARRAY_SIZE) ?
            Integer.MAX_VALUE :
            MAX_ARRAY_SIZE;
    }

上面是ArrayList数组空间不够的时候,使用的扩容算法,每次添加的数量是 int newCapacity = oldCapacity + (oldCapacity >> 1); 也就是 old + (old /2),每次添加原空间大小的一半大小
注意,每次扩容的时候是 重新创建一个新的容量大一半的数组,然后将原先的数组使用copyof复制到新的数组中去
4、对于ArrayList集合去删除元素的时候,该元素后面的数据都会向前移动一个位置,这个时候去获得原最后一个位置上的数据,就会报错
5、ArrayList和Vector的区别
ArrayList是线程非安全的,vector是线程安全的。
vector可以指定增长因子,如果该增长因子指定了,那么扩容的时候回每次新的数组大小会在原数组的大小基础上增加增长因子,如果不指定增长因子,那么就给原数组*2,
总结:ArrayList给予数组实现,可以通过下标索引直接查找到指定位置的元素,因此查找效率高,但每次插入或删除元素,就要大量移动元素,插入删除元素的效率低

第二个:LinkedList
LinkedList是一种双向链表,双向链表中有两点含义:
1、链表中任意一个存储单元都可以通过向前或者向后寻址的方式获取到其前一个和后一个存储单元
2、链表的尾节点的后一个节点是链表的头结点,链表的头结点的前一个节点是链表的尾节点
在这里插入图片描述

3、LinkedLIst和ArrayList的对比

  1. 顺序插入速度ArrayList会比较快,因为ArrayList是给予数组实现的,数组是事先new好的,只要往指定位置赛一个数据就好了,LinkedList则不痛,每次顺序插入的时候LinkedList将new一个对象出来,如果对象比较大,那么new的时间势必会长一点,再加上一些引用赋值的操作,所以顺序插入LinkedList必然慢于ArrayList
  2. 给予上一点,因为LinkedList里面不仅维护了带插入的元素,还维护了Entry的前置Entry和后继Entry,如果一个LinkedList中的Entry非常多,那么LinkedList将比ArrayList更耗时一些内存
  3. 有些说法认为LinkedList做插入和删除更快,这种说法其实是不准确的:
    (1)LinkedList做插入、删除的时候,慢在寻址,快在只需要改变前后的Entry的引用地址
    (2)ArrayList做插入、删除的时候 ,慢在数组元素的批量Copy,快在寻址
    所以,如果待插入、删除的元素是在数据结构的前半段,尤其是非常靠前的位置的时候,LinkedList的效率将大大快过ArrayList,因为ArrayList将批量Copy大量的元素,越往后,对于LinkedList来说,因为他是双向链表,所以在第二个元素后面插入一个数据和在倒数第二个元素后面插入一个元素在效率上基本上没有差别,但是ArrayLIst由于要批量Copy的元素越来越少,操作速度必然追上乃至超过LinkedList

从这个分析看出,如果你十分确定你插入、删除的元素是在前半段,那么就使用LinkedList;如果你十分确定你删除、删除的元素在比较靠后的位置,那么可以考虑使用ArrayList。如果你不能确定你要做的插入、删除是在哪儿呢?那还是建议你使用LinkedList吧,因为一来LinkedList整体插入、删除的执行效率比较稳定,没有ArrayList这种越往后越快的情况;二来插入元素的时候,弄得不好ArrayList就要进行一次扩容,记住,ArrayList底层数组扩容是一个既消耗时间又消耗空间的操作。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值