一、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。
* 但是究竟要多大,这得取决于服务器的配置
:在这里实际上指的是服务器的内存资源,如果服务器内存资源比较
大,
* 就可以分配大一点,如果内存资源比较小,
就小一点。
* 这样做的好处是减少扩容的次数,减少了扩
容的次数就减少了复制的次数。
* */
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。
* 但是究竟要多大,这得取决于服务器的配置
:在这里实际上指的是服务器的内存资源,如果服务器内存资源比较
大,
* 就可以分配大一点,如果内存资源比较小,
就小一点。
* 这样做的好处是减少扩容的次数,减少了扩
容的次数就减少了复制的次数。
* */