文章目录
- 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 使用 Iterator
System.out.println("------------方式3-------------");
Iterator<Integer> it = list.iterator();//获取迭代器对象
//循环迭代集合中的所有元素
while(it.hasNext()){//判断是否有下一个元素可迭代,如果有,继续循环
System.out.println(it.next());//打印本轮迭代到的元素
}
//4.4 使用 ListIterator
System.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对象数组中,那我们只需拿到这个数组的长度,观察其值变化了几次就知道其扩容了多少次。怎么获取呢?只能用反射技术了。