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()返回的元素的索引(如果列表迭代器位于列表的开头,则返回-13  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:无需开辟连续空间,查询慢,增删快。

 

posted @   暴躁C语言  阅读(78)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示