ArrayList深度透析

一、ArrayList


1、问你ArrayList初始容量是多少?


如果使用无参数的构造函数仅仅创建而不添加任何元素,那么容量是


0;
如果添加了元素,则容量扩展为初始容量10.
ArrayList底层实际上是一个Object类型的数组但是如果仅仅是创建一


个ArrayList集合,实际上这个时候指向是一个空(empty)的集合,长


度是0。我们一旦开始调用add方法想集合中添加元素的时候,这个时


候实际上是创建初始容量为10的数组。


 确保存放集合元素的数组的容量是足够的
 在调用add()函数的时候,会首先调用: 


ensureCapacityInternal()  
 
ArrayList的扩容策略:
1、如果集合的容量不够,就要调用grow函数扩容,扩容本质上是创建


一个容量更大的新的数组,然后把原来数组中的元素拷贝到新的数组


当中来:Arrays.copyOf()实现元素的拷贝。
2、新的数组的容量究竟是多大:oldCapacity+(oldCapacity >> 1)  


容量扩展方案
3、是当前数组已经填满了,那么才开始扩容。即ArrayList的负载因


子是1


该add实际上是把元素添加到数组的末尾【该末尾不是指数组的末尾,


而是指添加的元素的下一个位置】


2、//如果不向如下所有的list集合添加元素的话,
   //那么这些集合在内存中实际上指向同一个空的数组。
/*ArrayList<String> list1=new ArrayList<>


();
ArrayList<String> list1=new ArrayList<>();
ArrayList<String> list1=new ArrayList<>();
ArrayList<String> list1=new ArrayList<>();
ArrayList<String> list1=new ArrayList<>();
ArrayList<String> list1=new ArrayList<>();
ArrayList<String> list1=new ArrayList<>();
ArrayList<String> list1=new ArrayList<>();
ArrayList<String> list1=new ArrayList<>


();*/


3、
 /* 1、使用如下add的时候,要确保指定的index要在[0-size]这个


范围之间,否则将抛出:IndexOutOfBoundsException。
    * 2、该add()相当于在指定索引位置插入一个元素:该索引位置后


面的元素将往后移动。
* 并且是先移动,再插入,否则,将覆盖原来的元素。
*   【实际上,从底层源码来看,是一个拷贝操作。】
*    从这里可以看出:ArrayList不适用于插入频繁的应


用场合。
         * 3、该方法也会导致size+1
* */
list1.add(5, "v");


/**
* 在获取指定索引位置的元素的时候,会首先检


查该索引是否大于ArrayList的size,
* 如果大于size的话,将抛出:


IndexOutOfBoundsExeption。
* 当然,如果指定的值小于0大于底层数组的


length,也会抛出IndexOutOfBoundsExeption。
* */
//System.out.println(list1.get(-2));

//ArrayList直接使用索引获取数组元素,效率非


常高,因此,ArrayList非常适合用于查询频繁的应用场合.
System.out.println(list1.get(3));


4              /**
* 删除的逻辑不是把指定位置设置为空或者0,
* 而是把该位置后面的值往前移动,
* 最后把最后一个位置置空,
* 并且size-1
* 也就是说,删除的位置实际上是被后面的值给


覆盖掉。
* 因此,ArrayList实际上并不适合删除频繁的场


合。
* */
list1.remove(3);
  //直接根据索引修改即可  因此效率非常好  即ArrayList适合频繁


修改的应用场合。
list1.set(3, "");
 
5 什么时候用无参构造,什么时候用有参构造??
   
               /**
                 * 1、如果我们不知道该集合究竟有可能存放多少


个数据,我们最好是使用无参数的构造函数创建ArrayList实例。
*   如果一开始分配很大,但是最后真正存放的


数据只有很少的数据,导致大量的内存空间浪费;
* 2、如果我们知道大概要往ArrayList容器中存


放多少个数据,这个时候就应当尽可能的分配一个初始容量大的


ArrayList。
*   但是究竟要多大,这得取决于服务器的配置


:在这里实际上指的是服务器的内存资源,如果服务器内存资源比较


大,
*   就可以分配大一点,如果内存资源比较小,


就小一点。
*   这样做的好处是减少扩容的次数,减少了扩


容的次数就减少了复制的次数。
* */
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值