在了解list集合之前,我们先来了解一下collection集合
面试点:collection是集合的顶级接口,是set集合和list集合的爸爸,但不是map集合的爸爸!
1.1.有序 1.2.元素不唯一,即可重复
2.1.for(下标) 2.2.foreach 2.3.迭代器iterator
/** * 一.遍历集合的三种方式 * 1.for 下标 * 2.foreach * 3.迭代器 iterator */ //定义一个集合 List<Object> mz=new ArrayList<>(); //添加数据 mz.add("aa"); mz.add("bb"); mz.add("cc"); mz.add("dd"); //1.for下标遍历 for (int i = 0; i < mz.size(); i++) { System.out.println(mz.get(i)); } //2.foreach for (Object o : mz) { System.out.println(o); } //3.iterator 核心即 hasnext方法 和 next方法 Iterator<Object> it = mz.iterator(); while(it.hasNext()) {//判断是否有元素 System.out.println(it.next());//取出下一个元素 }4.1.for下标删除 4.2.迭代器删除
/** * 二.集合元素的删除 * 1.传统的下标遍历循环删除 但是无法删除干净,需要逆向删除即可 * 2.使用迭代器删除 */ System.out.println("删除前:"+mz.size()); //1.下标删除 for (int i = 0; i < mz.size(); i++) { mz.remove(i);//删除每一个元素 } //最后结果为: 删除前:4 删除后:2 主要原因是集合元素带有下标,从前面开始删会影响下标 //逆向删除试试? for (int i = mz.size()-1; i >= 0; i--) {//获取集合元素长度-1即为元素的最大下标,只要i>=0即可循环 mz.remove(i); } //最后结果为: 删除前:4 删除后:0 主要是因为从后往前删不影响下标 //2.迭代器删除 Iterator<Object> it = mz.iterator(); while(it.hasNext()) {// 判断是否有元素存在 it.next();//必须要先取出元素,否则无法删除 注意:如果直接删除不挨个取出元素,会抛出IllegalStateException异常 it.remove();//成功删除元素 } //最后结果为: 删除前:4 删除后:0 主要是因为迭代器会挨个取出元素然后挨个删除元素 System.out.println("删除后:"+mz.size());1.负载因子(扩容比例):0.5 每次扩容比例为0.5 2.增长因子:1.5 每次扩容都是乘以1.5 3.公式:容器容量+10*0.5 注意:list集合的初始容量为 10 原理实现:
public static void main(String[] args) { //定义一个初始容量为30的Arraylist集合 ArrayList lst=new ArrayList<>(); for (int i = 1; i <=30; i++) { lst.add(i);//循环添加30次 System.out.print(i+",");//打印出当前添加的元素 try { getCapacity(lst); } catch (Exception e) { e.printStackTrace(); } } } public static void getCapacity(ArrayList lst) throws Exception { Field f=lst.getClass().getDeclaredField("elementData"); f.setAccessible(true); Object obj=f.get(lst); Object[] elementData=(Object[])obj; System.out.println("当前容器的容量为:"+elementData.length); }效果:
1.概念:以类型作为参数的类,称为泛型(继JDK1.5之后有) 2.作用:提高程序的健壮性,简化代码 3.泛型的默认类型为Object
List<Object> mz=new ArrayList<>();//尖括号内为集合类型参数 默认为Object1.值类型==>引用类型 是为装箱 2.引用类型==>值类型 是为拆箱 注意:继JDK1.5后,可以实现自动装箱拆箱
图解: