List集合讲解(ArrayList LinkedList Vector)

    xiaoxiao2023-12-01  185

    List集合

    一.简述collection集合二.list集合1.特点:2.遍历方式3.list集合特有的方法4.集合元素的删除方法 三.list优化四.泛型五.装箱和拆箱六.ArrayList LinkedList Vector 的区别1.ArrayList:以连续的数组结构存储数据,增删改稍慢,查询稍快,因为有下标,但也不是绝对的,当数据量过大时则速度没什么区别.2.LinkedList :以链表的结构存储数据,查询慢、增删改快3. Vector:增删改查都慢,已过时

    在了解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:以连续的数组结构存储数据,增删改稍慢,查询稍快,因为有下标,但也不是绝对的,当数据量过大时则速度没什么区别.

    图解:

    2.LinkedList :以链表的结构存储数据,查询慢、增删改快
    3. Vector:增删改查都慢,已过时
    最新回复(0)