• java-单列集合List详解


    一、List概述

    ​​​​​​​List 接口继承自 Collection 接口。这意味着所有 List 类型的对象都是 Collection 类型的对象,它们共享 Collection 接口中定义的所有方法。

    List集合的特点:

    1、有序:存和取得元素顺序一致

    2、有索引:可以通过索引操作元素

    3、可重复:存储的元素可以重复

    二、List的方法

    Collection接口的方法List都继承了,在此基础上List还增加了索引操作的方法

    List独有的方法:

    它的特有方法都与索引有关

    1、增加元素

    语法1:集合名称.add(元素);

    在集合的末尾添加元素

    语法2:集合名称.add(索引,元素);    特有方法

    在指定索引添加元素原索引及其之后的元素都会向后移动一位 而不是覆盖该索引处的元素

    1. import java.util.ArrayList;
    2. import java.util.List;
    3. public class test1 {
    4. public static void main(String[] args) {
    5. // 1.创建集合
    6. List l=new ArrayList<>();
    7. // 2.添加元素
    8. // 通用方法
    9. l.add("aaa");
    10. l.add("bbb");
    11. l.add("ccc");
    12. System.out.println(l);// [aaa, bbb, ccc]
    13. // 特有方法
    14. // 在指定索引处添加元素 原索引及其之后的元素都会向后移动一位 而不是覆盖该索引处的元素
    15. l.add(1,"在索引1处添加元素");
    16. System.out.println(l);// [aaa, 在索引1处添加元素, bbb, ccc]
    17. }
    18. }

    2、删除元素

    语法1:集合名称.remove(元素);

    根据元素删除,如果存在则删除成功,返回值为true,如果不存在则删除失败,返回值为false

    语法2:集合名称.remove(索引,元素);    特有方法

    在指定索引删除元素,返回值为删除的元素

    1. import java.util.ArrayList;
    2. import java.util.List;
    3. public class test1 {
    4. public static void main(String[] args) {
    5. // 1.创建集合
    6. List l=new ArrayList<>();
    7. // 2.添加元素
    8. // 通用方法
    9. l.add("aaa");
    10. l.add("bbb");
    11. l.add("ccc");
    12. System.out.println(l);// [aaa, bbb, ccc]
    13. // 特有方法
    14. // 在指定索引处添加元素 原索引及其之后的元素都会向后移动一位 而不是覆盖该索引处的元素
    15. l.add(1,"qqq");
    16. System.out.println(l);// [aaa, qqq, bbb, ccc]
    17. // 3.删除元素
    18. // 通用方法
    19. // 集合未存在java 删除失败 返回false
    20. boolean r1=l.remove("java");
    21. System.out.println(r1);// false
    22. System.out.println(l);// [aaa, qqq, bbb, ccc]
    23. // 集合存在qqq 删除成功 返回true
    24. boolean r2=l.remove("qqq");
    25. System.out.println(r2);// true
    26. System.out.println(l);// [aaa , bbb, ccc]
    27. // 特有方法
    28. // 在指定索引处删除元素
    29. String r3=l.remove(2);
    30. System.out.println(r3);// ccc
    31. System.out.println(l);// [aaa , bbb]
    32. }
    33. }

    3、修改元素

    语法:集合名称.set(索引,元素);特有方法

    修改指定索引的元素,返回值为修改前的元素

    1. import java.util.ArrayList;
    2. import java.util.List;
    3. public class test1 {
    4. public static void main(String[] args) {
    5. // 1.创建集合
    6. List l=new ArrayList<>();
    7. // 2.添加元素
    8. // 通用方法
    9. l.add("aaa");
    10. l.add("bbb");
    11. l.add("ccc");
    12. System.out.println(l);// [aaa, bbb, ccc]
    13. // 特有方法
    14. // 在指定索引处添加元素 原索引及其之后的元素都会向后移动一位 而不是覆盖该索引处的元素
    15. l.add(1,"qqq");
    16. System.out.println(l);// [aaa, qqq, bbb, ccc]
    17. // 3.修改元素
    18. // 修改指定索引的元素 返回修改前的元素
    19. String r1=l.set(1, "kkk");
    20. System.out.println(r1);// qqq
    21. System.out.println(l);// [aaa, kkk, bbb, ccc]
    22. }
    23. }

    4、获取元素

    语法:集合名称.set(索引);特有方法

    返回值为该索引对应的元素

    1. import java.util.ArrayList;
    2. import java.util.List;
    3. public class test1 {
    4. public static void main(String[] args) {
    5. // 1.创建集合
    6. List l=new ArrayList<>();
    7. // 2.添加元素
    8. // 通用方法
    9. l.add("aaa");
    10. l.add("bbb");
    11. l.add("ccc");
    12. System.out.println(l);// [aaa, bbb, ccc]
    13. // 特有方法
    14. // 在指定索引处添加元素 原索引及其之后的元素都会向后移动一位 而不是覆盖该索引处的元素
    15. l.add(1,"qqq");
    16. System.out.println(l);// [aaa, qqq, bbb, ccc]
    17. // 3.获取元素
    18. // 返回值为该索引对应的元素
    19. String r1=l.get(1);
    20. System.out.println(r1);// qqq
    21. }
    22. }

    5、注意点

    因为出现了方法的重载,在调用方法时,会优先调用形参类型与实参类型一致的方法

    三、List的遍历方式

    List的遍历方式不仅继承Collection接口的遍历方式,还有自己特有的根据索引遍历的方式,它的遍历方式共5种,包括迭代器遍历、增强for遍历、lamdba表达式遍历、普通for循环(特有 因为List集合存在索引)、列表迭代器遍历(特有),其中迭代器遍历、增强for遍历、lamdba表达式遍历是继承Collection接口的遍历方式,用法完全一致

    详情可以参考以下文章:http://t.csdnimg.cn/zTdXHicon-default.png?t=N7T8http://t.csdnimg.cn/zTdXH

    1、迭代器遍历

    语法:

    Iterator<集合元素类型>迭代器名称=集合名称.Iterator();

    while(迭代器对象名称.hasnext()){

            System.out.println(迭代器对象名称.next());

    }

    1. import java.util.ArrayList;
    2. import java.util.Iterator;
    3. import java.util.List;
    4. public class 迭代器遍历 {
    5. public static void main(String[] args) {
    6. // 1.创建集合
    7. List l=new ArrayList<>();
    8. // 2.添加元素
    9. l.add("aaa");
    10. l.add("bbb");
    11. l.add("ccc");
    12. // 3.遍历集合
    13. // 通过iterator方法创建迭代器对象
    14. Iterator it=l.iterator();
    15. // hasNext()判断该位置是否存在元素 若存在则返回true 不存在则返回false
    16. while (it.hasNext()){
    17. // next()是用来返回当前位置元素 并指向下一位置的元素
    18. String s=it.next();
    19. System.out.println(s);
    20. }
    21. // aaa
    22. // bbb
    23. // ccc
    24. }
    25. }

    2、列表迭代器遍历(特有)

    列表迭代器遍历与迭代器遍历的方法很相似,不同的是列表迭代器遍历不仅可以在遍历的时候删除元素,还可以在遍历的时候添加元素

    语法:(仅仅遍历)

    ListIterator<集合元素类型>迭代器名称=集合名称.ListIterator();

    while(迭代器对象名称.hasnext()){

            System.out.println(迭代器对象名称.next());

    }

    补充知识:

    ListIterator与Iterator的关系: ListIterator接口则是一个专门为List设计的迭代器接口 它扩展了Iterator接口,并添加了一些针对List集合特有的方法

    ListIterator与List的关系: ListIterator是专门为List设计的一个迭代器的接口 List含有获取ListIterator迭代器的方法 即listIterator()

    1. import java.util.ArrayList;
    2. import java.util.List;
    3. import java.util.ListIterator;
    4. public class 列表迭代器遍历 {
    5. public static void main(String[] args) {
    6. // 1.创建集合
    7. List l=new ArrayList<>();
    8. // 2.添加元素
    9. l.add("aaa");
    10. l.add("bbb");
    11. l.add("ccc");
    12. // 3.列表迭代器遍历
    13. // 通过listIterator方法生成列表迭代器
    14. /*
    15. ListIterator与Iterator的关系:
    16. ListIterator接口则是一个专门为List设计的迭代器接口
    17. 它扩展了Iterator接口,并添加了一些针对List集合特有的方法
    18. ListIterator与List的关系:
    19. ListIterator是专门为List设计的一个迭代器的接口
    20. List含有获取ListIterator迭代器的方法 即listIterator()
    21. */
    22. ListIterator it=l.listIterator();
    23. // hasNext()判断该位置是否存在元素 若存在则返回true 不存在则返回false
    24. while (it.hasNext()){
    25. // next()是用来返回当前位置元素 并指向下一位置的元素
    26. String s=it.next();
    27. System.out.println(s);
    28. }
    29. //aaa
    30. //bbb
    31. //ccc
    32. }
    33. }

    语法:(遍历中增加元素)

    it.add(元素);

    注意:ListIteratoradd()方法的作用是在当前迭代器位置之前插入一个元素

    1. import java.util.ArrayList;
    2. import java.util.List;
    3. import java.util.ListIterator;
    4. public class 列表迭代器遍历 {
    5. public static void main(String[] args) {
    6. // 1.创建集合
    7. List l=new ArrayList<>();
    8. // 2.添加元素
    9. l.add("aaa");
    10. l.add("bbb");
    11. l.add("ccc");
    12. // 3.列表迭代器遍历
    13. // 通过listIterator方法生成列表迭代器
    14. /*
    15. ListIterator与Iterator的关系:
    16. ListIterator接口则是一个专门为List设计的迭代器接口
    17. 它扩展了Iterator接口,并添加了一些针对List集合特有的方法
    18. ListIterator与List的关系:
    19. ListIterator是专门为List设计的一个迭代器的接口
    20. List含有获取ListIterator迭代器的方法 即listIterator()
    21. */
    22. ListIterator it=l.listIterator();
    23. // hasNext()判断该位置是否存在元素 若存在则返回true 不存在则返回false
    24. while (it.hasNext()){
    25. // next()是用来返回当前位置元素 并指向下一位置的元素
    26. String s=it.next();
    27. if(s.equals("bbb")){
    28. it.add("qqq");
    29. }
    30. System.out.println(s);
    31. }
    32. /*
    33. 第一次遍历时指针指向aaa 调用it.next(); 将aaa赋值给s 并将指针指向下一位置bbb
    34. 然后判断s是否为bbb 此时s不是bbb 因此it.add("qqq");没有执行 输出aaa
    35. 第二次遍历时指针指向bbb 调用it.next(); 将bbb赋值给s 并输出bbb 并将指针指向下一位置ccc
    36. 然后判断s是否为bbb 此时s是bbb 因此it.add("qqq");执行 并输出bbb
    37. ListIterator的add()方法的作用是在当前迭代器位置之前插入一个元素。
    38. 所以在ccc前添加qqq
    39. 将ccc赋值给s 此时s不是bbb 因此it.add("qqq");不执行 并将指针指向下一位置(没有元素) 循环结束
    40. 整个过程qqq没有输出
    41. */
    42. //aaa
    43. //bbb
    44. //ccc
    45. System.out.println(l);// [aaa, bbb, qqq, ccc]
    46. }
    47. }
    1. import java.util.ArrayList;
    2. import java.util.List;
    3. import java.util.ListIterator;
    4. public class 列表迭代器遍历 {
    5. public static void main(String[] args) {
    6. // 1.创建集合
    7. List l=new ArrayList<>();
    8. // 2.添加元素
    9. l.add("aaa");
    10. l.add("bbb");
    11. l.add("ccc");
    12. // 3.列表迭代器遍历
    13. // 通过listIterator方法生成列表迭代器
    14. /*
    15. ListIterator与Iterator的关系:
    16. ListIterator接口则是一个专门为List设计的迭代器接口
    17. 它扩展了Iterator接口,并添加了一些针对List集合特有的方法
    18. ListIterator与List的关系:
    19. ListIterator是专门为List设计的一个迭代器的接口
    20. List含有获取ListIterator迭代器的方法 即listIterator()
    21. */
    22. ListIterator it=l.listIterator();
    23. // hasNext()判断该位置是否存在元素 若存在则返回true 不存在则返回false
    24. while (it.hasNext()){
    25. // next()是用来返回当前位置元素 并指向下一位置的元素
    26. it.add("qqq");
    27. String s=it.next();
    28. /*
    29. ListIterator的add()方法的作用是在当前迭代器位置之前插入一个元素。
    30. 第一次遍历时指针指向aaa 调用it.add("qqq"); 会在aaa前添加qqq
    31. 然后调用it.next()输出aaa 并将指针指向下一位置bbb 因此qqq不会输出
    32. 第二次遍历时指针指向bbb 调用it.add("qqq"); 会在bbb前添加qqq
    33. 然后调用it.next()输出bbb 并将指针指向下一位置ccc 因此qqq不会输出
    34. 第三次遍历时指针指向aaa 调用it.add("qqq"); 会在ccc前添加qqq
    35. 然后调用it.next()输出aaa 并将指针指向下一位置(没有元素) 因此qqq不会输出
    36. 循环结束
    37. */
    38. System.out.println(s);
    39. }
    40. //aaa
    41. //bbb
    42. //ccc
    43. System.out.println(l);// [qqq, aaa, qqq, bbb, qqq, ccc]
    44. }
    45. }

    3、增强for遍历

    快速生成增强for遍历:集合名称.for+回车

    1. import java.util.ArrayList;
    2. import java.util.List;
    3. public class 增强for遍历 {
    4. public static void main(String[] args) {
    5. // 1.创建集合
    6. List l=new ArrayList<>();
    7. // 2.添加元素
    8. l.add("aaa");
    9. l.add("bbb");
    10. l.add("ccc");
    11. // 3.遍历集合
    12. // 增强for遍历
    13. // 快速生成增强for遍历:集合名称.for+回车
    14. // s是用来存储遍历的元素
    15. for (String s : l) {
    16. System.out.println(s);
    17. }
    18. // aaa
    19. // bbb
    20. // ccc
    21. }
    22. }

    4、lamdba表达式遍历

    forEach方法的底层其实是一个循环遍历  依次得到集合中的每一个元素

    并将每一个元素传递给accept方法(其中String s中,s就是传入的元素)

     accept方法就是将传入的元素输出

    最后利用lamdba表达式进行简化

    1. import java.util.ArrayList;
    2. import java.util.List;
    3. import java.util.function.Consumer;
    4. public class lamaba表达式遍历 {
    5. public static void main(String[] args) {
    6. // 1.创建集合
    7. List l=new ArrayList<>();
    8. // 2.添加元素
    9. l.add("aaa");
    10. l.add("bbb");
    11. l.add("ccc");
    12. // 3.lamdba表达式遍历
    13. // forEach方法的底层其实是一个循环遍历 依次得到集合中的每一个元素
    14. // 并将每一个元素传递给accept方法(其中String s,s就是传入的元素)
    15. // accept方法就是将传入的元素输出
    16. // 简化前:
    17. l.forEach(new Consumer() {
    18. @Override
    19. public void accept(String s) {
    20. System.out.println(s);
    21. }
    22. });
    23. // aaa
    24. // bbb
    25. // ccc
    26. // 简化后:
    27. l.forEach(s->System.out.println(s));
    28. // aaa
    29. // bbb
    30. // ccc
    31. }
    32. }

    5、普通for循环(特有 因为List集合存在索引)

    语法:       

    for (int i = 0; i < l.size(); i++) {
                System.out.println(l.get(i));
      }

    通过get和size方法结合,遍历集合的元素

    1. import java.util.ArrayList;
    2. import java.util.List;
    3. public class 普通for遍历 {
    4. public static void main(String[] args) {
    5. // 1.创建集合
    6. List l=new ArrayList<>();
    7. // 2.添加元素
    8. l.add("aaa");
    9. l.add("bbb");
    10. l.add("ccc");
    11. // 3.普通for遍历元素
    12. // 通过集合名称.size().fori快速生成for循环
    13. // l.size()获取集合的长度
    14. // l.get(i)获取索引为i的元素值
    15. for (int i = 0; i < l.size(); i++) {
    16. System.out.println(l.get(i));
    17. }
    18. //aaa
    19. //bbb
    20. //ccc
    21. }
    22. }

    6、五种遍历方式的对比

  • 相关阅读:
    python笔记--函数、异常
    C++ 基础与深度分析 Chapter9 序列与关联容器(关联容器、适配器与生成器)
    stack-es-标准篇-ElasticsearchClient-function_score
    vue中 table中的treeselect 下拉框不显示
    ONNX+TensorRT:将预处理操作写入ONNX并完成TRT部署
    IPTABLES问题:DNAT下如何解决内网访问内部服务器问题
    java进阶—集合
    【二:测试报告的配置】
    【考研】数据结构(更新到顺序表)
    standard_init_linux.go:211: exec user process caused “exec format error“
  • 原文地址:https://blog.csdn.net/weixin_74886498/article/details/138038656