List集合
在了解list集合之前,我们先来了解一下collection集合
一.简述collection集合
面试点:collection是集合的顶级接口,是set集合和list集合的爸爸,但不是map集合的爸爸!
二.list集合
1.特点:
1.1.有序
1.2.元素不唯一,即可重复
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());//取出下一个元素
}
3.list集合特有的方法
/**
* 指定位置添加元素
* add(下标,元素);
*/
//向集合下标为2的位置添加元素 ss
mz.add(2, "ss");
for (Object o : mz) {
System.out.print(o+",");//输出打印结果 aa,bb,ss,cc,dd,
}
/**
* 指定位置添加集合
* addAll(下标,集合)
*/
List<Object> ajj=new ArrayList<>();
ajj.add("11");
ajj.add("22");
ajj.add("33");
ajj.add("44");
mz.addAll(2,ajj);//在mz集合中指定2的位置添加集合ajj
for (Object o : mz) {
System.out.print(o+",");//输出打印结果 aa,bb,11,22,33,44,cc,dd,
}
/**
* 获取集合指定下标的元素
* get(下标);
*/
//获取mz集合下标为3的元素
System.out.println(mz.get(3));//打印结果为 dd
/**
* 获取指定元素的下标
* indexOf("元素");
*/
System.out.println(mz.indexOf("dd"));///打印结果为 下标3
/**
* 获取集合中指定元素最后一次出现的的下标 没有则返回-1
* lastIndexOf("元素");
*/
System.out.println(mz.lastIndexOf("dd"));//打印结果为:3
System.out.println(mz.lastIndexOf("vv"));//打印结果为:-1
/**
* 从指定位置开始遍历集合元素
* listInterator(下标);
*/
Iterator<Object> its = mz.listIterator(2);//从下标2开始遍历 包括下标2
while(its.hasNext()) {
System.out.println(it.next());//打印结果为 cc dd
}
/**
* 指定元素下标,并替换元素
* set(下标,"准备替换的元素"):
*/
mz.set(1, "ll");//替换元素
for (Object o : mz) {
System.out.print(o+",");//打印结果为: 将原来的bb 换成了 ll aa,ll,cc,dd,
}
4.集合元素的删除方法
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());
三.list优化
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<>();//尖括号内为集合类型参数 默认为Object
五.装箱和拆箱
1.值类型==>引用类型 是为装箱
2.引用类型==>值类型 是为拆箱
注意:继JDK1.5后,可以实现自动装箱拆箱
六.ArrayList LinkedList Vector 的区别
1.ArrayList:以连续的数组结构存储数据,增删改稍慢,查询稍快,因为有下标,但也不是绝对的,当数据量过大时则速度没什么区别.
图解: