集合1---ArrayList

public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable

ArrayList继承AbstractList,实现List,RandomAccess(支持快速随机访问),Cloneable(可克隆的),Serializable(可序列化的)

public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E>

AbstractList继承AbstractCollection,实现List

public abstract class AbstractCollection<E> implements Collection<E>

AbstractCollection实现Collection

public interface List<E> extends Collection<E>

List继承Collection

public interface Collection<E> extends Iterable<E>

Collection继承Iterable

ArrayList底层是Object[]实现的,数组的值可重复,可为null,线程不安全

默认容量10,当进行add操作时,先判断Object[]是否有足够空间存放添加的值,发现不够时,扩容至1.5倍。

newCapacity = oldCapacity + (oldCapacity>>1);

1、添加数据

使用set方法添加值时,先判断下标是否越界。将原来下标上的值替换成新值,把旧值返回。

2、获取数据:使用get方法获取值时,先判断下标是否越界。

3、删除数据

一、通过下标删除remove(int index)

先判断下标是否越界,将下标index的数据删除,index后面的数据通过System.ArrayCopy方法往前移动。返回删除的值

size=elementData.length()

numMove=size-(index+1);//index后面的数据

System.ArrayCopy(elementData,index+1,elementData,index,numMove)

然后将Object[] elementData 最后一位赋值null,elementData[--size]=null;

二、通过值删除remove(object obj)

判断obj是否为null,遍历集合,找出值为obj的下标index

为null:elementData[index]==null;不为null:obj.equals(elementData[index])

满足这个条件,删除对应下标inde的值。

在集合中删除了数据obj返回true,未删除返回false。

modCount++:fail-fast机制。

集合大小size发生改变时会进行modCount++操作(修改次数)

modCount在本数据结构对应迭代器中使用,在迭代器初始的时候记录用这个迭代器的对象的modCount,在迭代器遍历过程中如果发现对象的modCount发生变化,则抛出异常,fail-fast机制。

一些集合不是线程安全的,假如在迭代的过程有其他线程修改了该集合对象的大小size,抛异常。

subList

subList()截取elementData中一个范围的数据,操作截取后的集合,原集合会跟着改变。

ArrayList类中有subList内部类

    private class SubList extends AbstractList<E> implements RandomAccess {
        private final AbstractList<E> parent;
        private final int parentOffset;
        private final int offset;
        int size;

        SubList(AbstractList<E> parent,
                int offset, int fromIndex, int toIndex) {
            this.parent = parent;
            this.parentOffset = fromIndex;
            this.offset = offset + fromIndex;
            this.size = toIndex - fromIndex;
            this.modCount = ArrayList.this.modCount;
        }

集合对象elementData调用subList()会生成subList内部类对象。

subList类没有定义Object[]来存放对象,定义变量parent(指向原集合地址)来保存传递的原集合

定义一个偏移量offset来保存偏移量,当对subList对象修改时,通过偏移量offset找到在变量parent对应的位置,修改的变量parent中的数据

定义size表示在集合parent中subList的可见范围是多少

 

 

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值