4.5.3 ArrayList
文章目录
- 1.特点
- 2. 练习:ArrayList测试
- 3.ArrayList扩容
1.特点
- 存在java.util包中
- 内部是用数组结构存放数据,封装数组的操作,每个对象都有下标
- 内部数组默认的初始容量是10,如果不够会以1.5倍的容量增长
- 查询快,增删数据效率会低
2. 练习:ArrayList测试
package partThree;import java.util.ArrayList;
import java.util.Iterator;
import java.util.ListIterator;/**本类用于ArrayList相关测试*/
public class TestArrayList {public static void main(String[] args) {//1.创建对应的集合对象/**底层会自动帮我们创建数组来存放对象,并且数组的初始容量是10*/ArrayList<Integer> list = new ArrayList();//2.向集合中添加元素,用于测试list.add(100);list.add(200);list.add(300);list.add(400);list.add(400);list.add(300);System.out.println(list); //打印查看集合中的元素//3.测试常用方法//list.clear(); //清空集合System.out.println(list.contains("100"));//false 因为这个100是字符串System.out.println(list.get(0));//100,根据下标获取元素System.out.println(list.indexOf(400));//3,判断指定元素第一次出现的位置System.out.println(list.lastIndexOf(400));//4,判断指定元素最后一次出现的位置System.out.println(list.remove(0)); //删除集合中0号索引处的元素//System.out.println(list.remove(300));/**上面的代码会报错:数组下标越界:index:300 size:5* 数组中传入的是integer,是引用类型,不是基本类型,输入300默认为元素位置* 主要是因为List中有两个重载的remove(),如果传入的是300* 会认为是int类型的index索引,所以如果想指定元素删除数据* 需要把int类型的300手动装箱成Integer类型*/System.out.println(list.remove(Integer.valueOf(300)));System.out.println(list);System.out.println(list.size());//获取集合中元素的个数System.out.println(list.set(0,77));//修改指定位置的值//4. 迭代集合//4.1 使用for循环System.out.println("------------方式1-------------");for (int i=0; i<list.size(); i++){//循环集合System.out.println(list.get(i));//根据本轮循环到的索引获取集合中对应的元素}//4.2 使用高效循环System.out.println("------------方式2-------------");for(Integer num :list){//for(元素类型 元素名 : 要遍历的集合名){循环体}System.out.println(num); //打印每轮遍历到的元素}//4.3 使用 IteratorSystem.out.println("------------方式3-------------");Iterator<Integer> it = list.iterator();//获取迭代器对象//循环迭代集合中的所有元素while(it.hasNext()){//判断是否有下一个元素可迭代,如果有,继续循环System.out.println(it.next());//打印本轮迭代到的元素}//4.4 使用 ListIteratorSystem.out.println("------------方式4-------------");ListIterator<Integer> it2 = list.listIterator(); //获取迭代器对象//循环迭代集合中的所有元素while(it2.hasNext()){//判断是否有下一个元素可迭代,如果有,继续循环System.out.println(it2.next());//打印本轮迭代到的元素}}
}
== 我们集合中存入的类型是引用类型,不是基本类型
如果想根据元素删除数据,需要把int类型参数转为集合中的元素类型integer==
3.ArrayList扩容
ArrayList相当于在没指定initialCapacity时就是会使用延迟分配对象数组空间,当第一次插入元素时才分配10(默认)个对象空间。假如有20个数据需要添加,那么会分别在第一次的时候,将ArrayList的容量变为10;之后扩容会按照1.5倍增长。也就是当添加第11个数据的时候,Arraylist继续扩容变为10*1.5=15;当添加第16个数据时,继续扩容变为15 * 1.5 =22个
ArrayList没有对外暴露其容量个数,查看源码我们可以知道,实际其值存放在elementData对象数组中,那我们只需拿到这个数组的长度,观察其值变化了几次就知道其扩容了多少次。怎么获取呢?只能用反射技术了。