2022.4.25 集合 List 子接口与其中的实现类
List 子接口
特点:有序、有下标、元素可重复
有序的 collection(也称为序列)。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。
1 void add(int index,,0bject o)//在index位置插入对象o。 2 boolean addAll(int index,Collection c)//将一个集合中的元素添加到此集合index位置。 3 0bject get(int index)//返回集合中指定位置的元素。 4 List subList(int fromIndex,int toIndex)//返回fromIndex和toIndex之间的集合元素。
1 package com.xing.list; 2 3 import java.util.ArrayList; 4 import java.util.Iterator; 5 import java.util.List; 6 import java.util.ListIterator; 7 8 public class Demo01 { 9 public static void main(String[] args) { 10 //List为接口,只能实例化其下面的实现类 11 List list = new ArrayList(); 12 //添加元素 13 list.add("苹果"); 14 list.add("小米"); 15 list.add(0,"华为");//在下标0添加元素 16 System.out.println("元素个数: "+list.size()); 17 System.out.println( list);//默认调用重写的toString() 18 19 //删除元素 20 //list.remove("苹果"); 21 //list.remove(0);//移除集合中下标为0的元素 22 System.out.println("删除之后:"+list.size( )); 23 System.out.println(list.toString()); 24 25 //判断 26 System.out.println(list.contains("苹果"));//是否包含苹果这个对象 27 System.out.println(list.isEmpty());//判断是否为空 28 29 //获取下标 30 System.out.println(list.indexOf("苹果"));//返回苹果对象的下标 31 32 //遍历 1.可以使用for 因为有下标 33 for (int i = 0; i < list.size(); i++) { 34 //get(int index);根据下标获取元素 返回Object类型 可根据实际类型进行强转 35 System.out.println(list.get(i)); 36 } 37 //2.使用增强for 38 for (Object o : list) { 39 System.out.println(o); 40 } 41 42 //迭代器 43 Iterator iterator = list.iterator(); 44 while (iterator.hasNext()) { 45 System.out.println(iterator.next()); 46 // 可以使用iterator.remove(); 进行移除元素 47 // collection.remove(); 不能用collection其他方法 会报并发修改异常 48 } 49 50 //列表迭代器 list接口独有的 listIterator();返回值列表迭代器 51 ListIterator listIterator = list.listIterator(); 52 //从前向后 53 while (listIterator.hasNext()) { 54 //next()初始指针指向下标-1 指针向后移动,然后返回下标对应的对象 55 System.out.print(listIterator.nextIndex()+":"+listIterator.next());//0:华为1:苹果2:小米 56 } 57 58 //由于上一个从前向后的遍历使指向元素的指针指到了下标为2的元素 59 //从后向前 60 System.out.println("=================="); 61 while (listIterator.hasPrevious()) { 62 //previous()返回当前元素,之后指针向前移动 63 System.out.print(listIterator.previousIndex()+":"+listIterator.previous()); 64 } 65 } 66 }
列表迭代器ListIterator
1 int nextIndex()返回由后续调用next()返回的元素的索引(如果列表迭代器位于列表的末尾,则返回列表大小。) 2 int previousIndex()返回由后续调用previous()返回的元素的索引(如果列表迭代器位于列表的开头,则返回-1) 3 next()初始指针指向下标-1 指针向后移动,然后返回下标对应的对象 4 previous()返回当前元素,之后指针向前移动
允许程序员按任一方向遍历列表、迭代期间修改列表,并获得迭代器在列表中的当前位置。ListIterator 没有当前元素,它的光标位置始终位于调用 previous()所返回的元素和调用next()所返回的元素之间。长度为n的列表的迭代器有n+1个可能的指针位置
与Iterator的区别:ListIterator可以向前或向后遍历,添加、删除、修改元素
-
相同点
-
都是迭代器,当需要对集合中元素进行遍历不需要干涉其遍历过程时,这两种迭代器都可以使用。
-
-
不同点
-
使用范围不同,Iterator可以应用于所有的集合,Set、List和Map和这些集合的子类型。而ListIterator只能用于List及其子类型。
-
ListIterator有add方法,可以向List中添加对象,而Iterator不能。
-
ListIterator和Iterator都有hasNext()和next()方法,可以实现顺序向后遍历,但是ListIterator有hasPrevious()和previous()方法,可以实现逆向(顺序向前)遍历。Iterator不可以。
-
ListIterator可以定位当前索引的位置,nextIndex()和previousIndex()可以实现。Iterator没有此功能。
-
都可实现删除操作,但是ListIterator可以实现对象的修改,set()方法可以实现。Iterator仅能遍历,不能修改。
-
1 package com.xing.list; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 public class Demo02 { 7 public static void main(String[] args) { 8 List list = new ArrayList(); 9 10 //添加数字元素 集合不能存储基本数据类型 通过自动装箱变为包装类 11 list.add(10); 12 list.add(20); 13 list.add(30); 14 list.add(40); 15 list.add(50); 16 17 18 //当删除数字与索引矛盾时 对数字强转 19 list.remove((Object) 10); 20 list.remove(new Integer(10)); 21 22 //返回子集合 sublist(x, y);左闭右开 23 List subList = list.subList(1, 3);//返回下标1和2的元素 24 System.out.println(subList); 25 } 26 }
List实现类
-
ArrayList 【重点】
-
数组结构实现,必须要连续空间,查询快、增删慢
-
jdk1.2版本,运行效率快、线程不安全
-
-
Vector
-
数组结构实现,查询快、增删慢
-
jdk1.0版本,运行效率慢、线程安全
-
-
LinkedList
-
双向链表结构实现,无需连续空间,增删快,查询慢
-
ArrayList
源码
1 DEFAULT_CAPACITY = 10; //默认容量 2 //注意:如果没有向集合中添加任何元素时,容量0,添加一个后,容量为10 3 //每次扩容是原来的1.5倍 4 elementData存放元素的数组 5 size 实际元素个数
1 package com.xing.list; 2 3 import java.util.ArrayList; 4 import java.util.Iterator; 5 import java.util.ListIterator; 6 7 public class Demo03 { 8 public static void main(String[] args) { 9 Student s1 = new Student("小明",23); 10 11 ArrayList arrayList = new ArrayList(); 12 arrayList.add(s1);//添加 13 //arrayList.remove(s1);//移除 14 //arrayList.remove(new Student("小明",23));//remove中调用了equals,重写此方法可以删除 15 System.out.println(arrayList.size());//元素个数 16 System.out.println(arrayList.toString());//必须重写toString 17 //判断 System.out.println(arrayList.contains(new Student("小明", 23)));// true contains()调用了equals() System.out.println(arrayList.isEmpty()); //查找 System.out.println(arrayList.indexOf(s1));//0 查看下标 //遍历 Iterator iterator = arrayList.iterator(); while (iterator.hasNext()) { System.out.println(iterator.next()); } ListIterator listIterator = arrayList.listIterator(); //从前向后 while (listIterator.hasNext()) { System.out.print(listIterator.nextIndex()+":"+listIterator.next()); } //从后向前 System.out.println("=================="); while (listIterator.hasPrevious()) { System.out.print(listIterator.previousIndex()+":"+listIterator.previous()); } } } class Student { private String name; private int age; public Student() { } public Student(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + '}'; } @Override public boolean equals(Object obj) { //1 判断是不是同一个对象 if(this == obj){ return true; } //2 判断是否为空 if(obj == null){ return false; } //3 判断是否是Student类型 if(obj instanceof Student){ Student s = (Student) obj; //4 比较属性 if(this.name.equals(s.getName()) && this.age == s.getAge()){ return true; } } //5 不满足条件返回false return false; } }
Vector
1 package com.xing.vector; 2 3 import java.util.ArrayList; 4 import java.util.Collection; 5 import java.util.Enumeration; 6 import java.util.Vector; 7 8 public class Demo01 { 9 public static void main(String[] args) { 10 Vector vector = new Vector(); 11 vector.add("苹果"); 12 vector.add("狮子"); 13 vector.add("老师"); 14 15 System.out.println(vector.size());//对象个数 16 System.out.println(vector);//调用其重写的toString 17 18 // vector.remove("苹果");//移除 19 // vector.remove(0);//根据下标移除 20 // vector.clear();//清空 21 22 //判断 23 System.out.println(vector.contains("苹果"));//是否包含 24 System.out.println(vector.isEmpty()); 25 26 27 //遍历 使用枚举器 28 Enumeration enumeration = vector.elements(); 29 //hasMoreElements() nextElement() 类似于迭代器中的hasNext() next() 30 while(enumeration.hasMoreElements()){ 31 System.out.println(enumeration.nextElement()); 32 } 33 } 34 }
LinkedList
创建链表集合
常用方法与List一致
1 package com.xing.linkedlist; 2 3 import java.util.ArrayList; 4 import java.util.Iterator; 5 import java.util.LinkedList; 6 import java.util.ListIterator; 7 8 public class Demo01 { 9 public static void main(String[] args) { 10 Student s1 = new Student("张三",20); 11 Student s2 = new Student("李四",18); 12 Student s3 = new Student("王五",22); 13 14 LinkedList linkedList =new LinkedList(); 15 16 linkedList.add(s1); 17 linkedList.add(s2); 18 linkedList.add(s3); 19 20 System.out.println(linkedList.size()); 21 System.out.println(linkedList);//必须重写其toString 22 23 // linkedList.remove(); 24 // linkedList.clear(); 25 26 //遍历与 27 } 28 } 29 30 class Student { 31 private String name; 32 private int age; 33 34 public Student() { 35 } 36 public Student(String name, int age) { 37 this.name = name; 38 this.age = age; 39 } 40 41 public String getName() { 42 return name; 43 } 44 45 public void setName(String name) { 46 this.name = name; 47 } 48 49 public int getAge() { 50 return age; 51 } 52 53 public void setAge(int age) { 54 this.age = age; 55 } 56 @Override 57 public String toString() { 58 return "Student{" + 59 "name='" + name + '\'' + 60 ", age=" + age + 61 '}'; 62 } 63 }
ArrayList与LinkedList区别
-
ArrayList数组实现LinkedList双向链表实现
-
ArrayList:必须开辟连续空间,查询快,增删慢。LinkedList:无需开辟连续空间,查询慢,增删快。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现