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); } }