list集合

list集合

数据结构:一维数组或双向链表(LinkedList)

特点:有下标,可以直接根据下标做集合的增删改查

有序

元素可重复

1.ArrayList

1.1 ArrayList的特点

数据结构:一维数组

特点:存储数据

1.2 ArrayList的使用

复制代码
public static void main(String[] args) {
​
        ArrayList<String> list = new ArrayList<>();
​
        //添加数据
        list.add("cs1");
        list.add("cs2");
        list.add("cs3");
        list.add("cs4");
        list.add("cs5");
​
        //设置指定下标上的元素
        list.set(1, "郭富城");
​
        //获取指定下标上的元素
        String str = list.get(1);
        System.out.println("获取指定下标上的元素:" + str);//郭富城
​
        //获取元素个数
        int size = list.size();
        System.out.println("获取元素个数:" + size);//5
​
        //在指定下标上添加元素
        list.add(2, "刘德华");
​
        ArrayList<String> newList1 = new ArrayList<>();
        Collections.addAll(newList1, "aaa","bbb","ccc","ccc");//利用集合工具类(Collections)批量添加元素
        list.addAll(newList1);//将newList1中所有的元素都添加到list集合里末尾的位置
​
        ArrayList<String> newList2 = new ArrayList<>();
    //利用集合工具类(Collections)批量添加元素
        Collections.addAll(newList2, "xxx","xxx","yyy","yyy","zzz","zzz");
        list.addAll(3, newList2);//将newList2中所有的元素都添加到list集合里指定下标的位置
​
        //清空集合里所有的元素
        //list.clear();
​
        System.out.println("判断集合中是否包含指定元素:" + list.contains("郭富城"));//true
        System.out.println("判断集合中是否包含指定集合:" + list.containsAll(newList1));//true
​
        System.out.println("获取元素在集合中第一次出现的下标:" + list.indexOf("ccc"));//12
        System.out.println("获取元素在集合中最后一次出现的下标:" + list.lastIndexOf("ccc"));//13
​
        //没有-true,有-false
        System.out.println("判断集合里是否没有元素:" + list.isEmpty());//false
​
        list.remove(9);//通过下标删除元素
        list.remove("CS3");//通过数据删除元素
        list.removeAll(newList1);//将list中有newList1的元素全部删除(去除交集)
​
        list.retainAll(newList2);//将list中有newList2的元素全部保留(保留交集)
​
        List<String> subList = list.subList(1, 4);//从开始下标处(包含)截取到结束下标处(排他)的元素,返回新的集合
​
        //将集合转换为数组
        Object[] array1 = subList.toArray();
        System.out.println(Arrays.toString(array1));//[xxx, yyy, yyy]
​
        //将集合转换为指定类型的数组
        String[] array2 = new String[3];
        subList.toArray(array2);
        System.out.println(Arrays.toString(array2));//[xxx, yyy, yyy]
​
        System.out.println("-----------------------------------------");
​
        //遍历集合 -- for循环
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }
​
        System.out.println("-----------------------------------------");
​
        //遍历集合 -- foreach
        for (String element : list) {
            System.out.println(element);
        }
​
        System.out.println("-----------------------------------------");
​
        //遍历集合 -- Iterator
        Iterator<String> it = list.iterator();
        while(it.hasNext()){//判断是否有可迭代的元素
            String next = it.next();//获取下一个元素
            System.out.println(next);
        }
​
        System.out.println("-----------------------------------------");
​
        //遍历集合 -- ListIterator
        ListIterator<String> listIterator = list.listIterator();
        while(listIterator.hasNext()){//判断是否有可迭代的元素
            String next = listIterator.next();//获取下一个元素
            System.out.println(next);
        }
​
​
    }

1.3 ArrayList相关面试题

ArrayList底层数据结构是什么?

Object类型的一维数组
ArrayList默认初始化长度是多少?

10
ArrayList如何减少容器的伸缩性?

使用有参构造定义容量
ArrayList数组最大容量是多少?

Integer.MAX_VALUE-8
ArrayList数组最大容量为什么是Integer.MAX_VALUE-8?或 ArrayList数组最大容量为什么要减8?

减8是为了腾出空间存放数组的头部信息
ArrayList的扩容机制是什么?

是原来数组长度的1.5倍

2.LinkedList

2.1 LinkedList的特点

数据结构:双向链表

特点:队列模式、栈模式

2.2 LinkedList的使用

使用和ArrayList完全相同

复制代码
public static void main(String[] args) {
​
        LinkedLis<String> list = new LinkedLis<>();
​
        //添加数据
        list.add("cs1");
        list.add("cs2");
        list.add("cs3");
        list.add("cs4");
        list.add("cs5");
​
        //设置指定下标上的元素
        list.set(1, "郭富城");
​
        //获取指定下标上的元素
        String str = list.get(1);
        System.out.println("获取指定下标上的元素:" + str);//郭富城
​
        //获取元素个数
        int size = list.size();
        System.out.println("获取元素个数:" + size);//5
​
        //在指定下标上添加元素
        list.add(2, "刘德华");
​
        LinkedLis<String> newList1 = new LinkedLis<>();
        Collections.addAll(newList1, "aaa","bbb","ccc","ccc");//利用集合工具类(Collections)批量添加元素
        list.addAll(newList1);//将newList1中所有的元素都添加到list集合里末尾的位置
​
        LinkedLis<String> newList2 = new LinkedLis<>();
    //利用集合工具类(Collections)批量添加元素
        Collections.addAll(newList2, "xxx","xxx","yyy","yyy","zzz","zzz");
        list.addAll(3, newList2);//将newList2中所有的元素都添加到list集合里指定下标的位置
​
        //清空集合里所有的元素
        //list.clear();
​
        System.out.println("判断集合中是否包含指定元素:" + list.contains("郭富城"));//true
        System.out.println("判断集合中是否包含指定集合:" + list.containsAll(newList1));//true
​
        System.out.println("获取元素在集合中第一次出现的下标:" + list.indexOf("ccc"));//12
        System.out.println("获取元素在集合中最后一次出现的下标:" + list.lastIndexOf("ccc"));//13
​
        //没有-true,有-false
        System.out.println("判断集合里是否没有元素:" + list.isEmpty());//false
​
        list.remove(9);//通过下标删除元素
        list.remove("CS3");//通过数据删除元素
        list.removeAll(newList1);//将list中有newList1的元素全部删除(去除交集)
​
        list.retainAll(newList2);//将list中有newList2的元素全部保留(保留交集)
​
        List<String> subList = list.subList(1, 4);//从开始下标处(包含)截取到结束下标处(排他)的元素,返回新的集合
​
        //将集合转换为数组
        Object[] array1 = subList.toArray();
        System.out.println(Arrays.toString(array1));//[xxx, yyy, yyy]
​
        //将集合转换为指定类型的数组
        String[] array2 = new String[3];
        subList.toArray(array2);
        System.out.println(Arrays.toString(array2));//[xxx, yyy, yyy]
​
        System.out.println("-----------------------------------------");
​
        //遍历集合 -- for循环
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }
​
        System.out.println("-----------------------------------------");
​
        //遍历集合 -- foreach
        for (String element : list) {
            System.out.println(element);
        }
​
        System.out.println("-----------------------------------------");
​
        //遍历集合 -- Iterator
        Iterator<String> it = list.iterator();
        while(it.hasNext()){//判断是否有可迭代的元素
            String next = it.next();//获取下一个元素
            System.out.println(next);
        }
​
        System.out.println("-----------------------------------------");
​
        //遍历集合 -- ListIterator
        ListIterator<String> listIterator = list.listIterator();
        while(listIterator.hasNext()){//判断是否有可迭代的元素
            String next = listIterator.next();//获取下一个元素
            System.out.println(next);
        }
​
​
    }

2.3 LinkedList相关面试题

LinkedList的底层数据结构是什么?

双向链表
ArrayList 和 LinkedList效率的区别?

ArrayList:一维数组

LinkedList:双向链表

添加功能 - 不扩容:ArrayList快

添加功能 - 扩容:LinkedList快

删除功能:LinkedList快

修改功能:ArrayList快

查询功能:ArrayList快

一般项目中使用ArrayList居多,因为业务流程里查询业务是最多的

3.Vector

3.1 Vector的特点

数据结构:一维数组

特点:线程安全

3.2 Vector的使用

使用和ArrayList完全相同

复制代码
public static void main(String[] args) {
​
        Vector<String> list = new Vector<>();
​
        //添加数据
        list.add("麻生希");
        list.add("椎名空");
        list.add("水菜丽");
        list.add("朝桐光");
        list.add("樱井步");
​
        //设置指定下标上的元素
        list.set(1, "侯小康");
​
        //获取指定下标上的元素
        String str = list.get(1);
        System.out.println("获取指定下标上的元素:" + str);//侯小康
​
        //获取元素个数
        int size = list.size();
        System.out.println("获取元素个数:" + size);//5
​
        //在指定下标上添加元素
        list.add(2, "杨雪飞");
​
        Vector<String> newList1 = new Vector<>();
        Collections.addAll(newList1, "aaa","bbb","ccc","ccc");//利用集合工具类(Collections)批量添加元素
        list.addAll(newList1);//将newList1中所有的元素都添加到list集合里末尾的位置
​
        Vector<String> newList2 = new Vector<>();
        Collections.addAll(newList2, "xxx","xxx","yyy","yyy","zzz","zzz");//利用集合工具类(Collections)批量添加元素
        list.addAll(3, newList2);//将newList2中所有的元素都添加到list集合里指定下标的位置
​
        //清空集合里所有的元素
        //list.clear();
​
        System.out.println("判断集合中是否包含指定元素:" + list.contains("侯小康"));//true
        System.out.println("判断集合中是否包含指定集合:" + list.containsAll(newList1));//true
​
        System.out.println("获取元素在集合中第一次出现的下标:" + list.indexOf("ccc"));//12
        System.out.println("获取元素在集合中最后一次出现的下标:" + list.lastIndexOf("ccc"));//13
​
        //没有-true,有-false
        System.out.println("判断集合里是否没有元素:" + list.isEmpty());//false
​
        list.remove(9);//通过下标删除元素
        list.remove("水菜丽");//通过数据删除元素
        list.removeAll(newList1);//将list中有newList1的元素全部删除(去除交集)
​
        list.retainAll(newList2);//将list中有newList2的元素全部保留(保留交集)
​
        List<String> subList = list.subList(1, 4);//从开始下标处(包含)截取到结束下标处(排他)的元素,返回新的集合
​
        //将集合转换为数组
        Object[] array1 = subList.toArray();
        System.out.println(Arrays.toString(array1));//[xxx, yyy, yyy]
​
        //将集合转换为指定类型的数组
        String[] array2 = new String[3];
        subList.toArray(array2);
        System.out.println(Arrays.toString(array2));//[xxx, yyy, yyy]
​
        System.out.println("-----------------------------------------");
​
        //遍历集合 -- for循环
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }
​
        System.out.println("-----------------------------------------");
​
        //遍历集合 -- foreach
        for (String element : list) {
            System.out.println(element);
        }
​
        System.out.println("-----------------------------------------");
​
        //遍历集合 -- Iterator
        Iterator<String> it = list.iterator();
        while(it.hasNext()){//判断是否有可迭代的元素
            String next = it.next();//获取下一个元素
            System.out.println(next);
        }
​
        System.out.println("-----------------------------------------");
​
        //遍历集合 -- ListIterator
        ListIterator<String> listIterator = list.listIterator();
        while(listIterator.hasNext()){//判断是否有可迭代的元素
            String next = listIterator.next();//获取下一个元素
            System.out.println(next);
        }
​
​
    }

4.Stack

4.1 Stack的特点

继承关系:class Stack extends Vector 特点:栈模式

4.2 Stack的使用

集成Vector类,Vector方法都可用

复制代码
Stack<String> stack = new Stack<>();
​
        //将元素添加到栈顶
        stack.push("aaa");
        stack.push("bbb");
        stack.push("ccc");
        stack.push("ddd");
        stack.push("eee");
​
        System.out.println("获取栈顶元素:" + stack.peek());
        System.out.println("获取元素到栈顶的距离:" + stack.search("bbb"));//4 - 从1开始数
​
        //判断集合是否为空内容
        while(!stack.empty()){
​
            //删除栈顶元素,并返回
            String pop = stack.pop();
            System.out.println(pop);
        }
​
    }
相关推荐
1nullptr1 小时前
三次翻转实现数组元素的旋转
数据结构
TT哇1 小时前
【数据结构练习题】链表与LinkedList
java·数据结构·链表
yylの博客1 小时前
Windows通过git-bash安装zsh
windows·git·bash·zsh
A懿轩A1 小时前
C/C++ 数据结构与算法【栈和队列】 栈+队列详细解析【日常学习,考研必备】带图+详细代码
c语言·数据结构·c++·学习·考研·算法·栈和队列
进击的code2 小时前
windows 下使用WLS2 编译aosp Android14并刷机到pixle 5a
windows
1 9 J3 小时前
数据结构 C/C++(实验五:图)
c语言·数据结构·c++·学习·算法
汝即来归3 小时前
选择排序和冒泡排序;MySQL架构
数据结构·算法·排序算法
染指11105 小时前
50.第二阶段x86游戏实战2-lua获取本地寻路,跨地图寻路和获取当前地图id
c++·windows·lua·游戏安全·反游戏外挂·游戏逆向·luastudio
dntktop6 小时前
Converseen:全能免费批量图像处理专家
windows
aaasssdddd966 小时前
C++的封装(十四):《设计模式》这本书
数据结构·c++·设计模式