java list接口注意项总结

本文探讨了List接口在Java中的重要性,重点比较了ArrayList和LinkedList在元素存取、增删效率上的差异,并介绍了Iterator接口的使用及其限制。通过实例展示了如何在实际开发中利用这两种数据结构以及遍历集合的方法。
摘要由CSDN通过智能技术生成

List接口继承自Collection接口,是单列集合的一个重要分支。
在List集合中允许出现重复的元素,所有的元素是以一种线性方式进行存储的,在程序中可以通过索引来访问集合中的指定元素。
另外,List集合还有一个特点就是元素有序,即元素的存入顺序和取出顺序一致。

List作为Collection集合的子接口,不但继承了Collection接口中的全部方法,而且还增加了一些根据元素索引来操作集合的特有方法,如下表所示
在这里插入图片描述

ArrayList是List接口的一个实现类,底层的存储结构式数组。
ArrayList集合中大部分方法都是从父类Collection和List继承过来的,其中add()方法和get()方法用于实现元素的存取。

package test;

import java.util.*;

public class test1 {
    public static void main(String[] args) {
        List list = new ArrayList();

        //add和get实现集合存取
        list.add("java");
        list.add("python");
        list.add("mysql");
        System.out.println("集合长度" + list.size());
        System.out.println(list);
        //可见集合里的下标也是从0开始的
        System.out.println(list.get(2));

        //输出:
        //集合长度3
        //[java, python, mysql]
        //mysql

        List list1 = new ArrayList();
        list1.add("11");
        list1.add("22");
        list1.add("33");

        System.out.println(list1);
        //实现一个集合追加到另一个集合
        list.addAll(list1);
        System.out.println(list);

        //查看一个元素在集合中最后出现的位置

        System.out.println(list.lastIndexOf("11"));
    }
}


ArrayList集合在查询元素时速度很快,但在增删元素时效率较低。
为了克服这种局限性,可以使用List接口的另一个实现类LinkedList。
该集合内部维护了一个双向循环链表,所以LinkedList集合对于元素的增删操作具有很高的效率。LinkedList集合添加元素和删除元素的过程如下图所示。
在这里插入图片描述

LinkedList集合具有增删元素效率高的特点。
在这里插入图片描述

package test;

import java.util.LinkedList;

public class test2 {
    public static void main(String[] args) {
        LinkedList link = new LinkedList();
        link.add("java");
        link.add("python");
        link.add("c");
        System.out.println(link);
        System.out.println(link.toString());
        link.add(3, "mysql");
        System.out.println(link);
        link.addFirst("scala");
        System.out.println(link);
        System.out.println(link.getFirst());
        //link.remove(2);

        //输出:
        //[java, python, c]
        //[java, python, c]
        //[java, python, c, mysql]
        //[scala, java, python, c, mysql]
        //scala

    }
}

在程序开发中,经常需要遍历集合中的所有元素。
针对这种需求,JDK专门提供了一个接口Iterator。
Iterator接口也是Java集合中的一员,但它与Collection、Map接口有所不同,Collection接口与Map接口主要用于存储元素,而Iterator主要用于迭代访问(即遍历)Collection中的元素,因此Iterator对象也被称为迭代器。

package test;

import java.util.ArrayList;
import java.util.Iterator;

public class test3 {
    public static void main(String[] args) {
        ArrayList list=new ArrayList();
        list.add("R");
        list.add("java");
        list.add("python");
        list.add("mysql");
        Iterator iterator=list.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }

    }
}

Iterator迭代器对象在遍历集合时,内部采用指针的方式来跟踪集合中的元素,接下来通过一个图例来演示Iterator对象迭代元素的过程,如下图所示。
在这里插入图片描述
需要特别说明的是,当通过迭代器获取ArrayList集合中的元素时,都会将这些元素当做Object类型来看待,如果想得到特定类型的元素,则需要进行强制类型转换

为了简化书写,从JDK5.0开始,提供了foreach循环。foreach循环是一种更加简洁的for循环,也称增强for循环。foreach循环用于遍历数组或集合中的元素,其具体语法格式如下
在这里插入图片描述

package test;

import java.util.ArrayList;

public class test4 {
    public static void main(String[] args) {
        ArrayList list=new ArrayList();
        list.add("C");
        list.add("Java");
        list.add("Python");

        for (Object object:list){
            System.out.println(object);
        }
    }

}

foreach不能用于修改,以一个String类型的数组为例。

package test;

public class test5 {
    static String[] strs = {"aaa", "bbb", "ccc"};

    public static void main(String[] args) {
        for(String str:strs){
            str="ddd";//不能进行更改
        }
        System.out.println("foreach循环修改后的数组:"+strs[0]+";"+strs[1]+";"+strs[2]);

        for (int i=0;i<strs.length;i++){
            strs[i]="ddd";
        }
        System.out.println("普通for循环修改后的数组:"+strs[0]+";"+strs[1]+";"+strs[2]);
    }

}


迭代器周期内不能增删元素,通过一个案例来演示这种异常。

package test;

import java.util.ArrayList;
import java.util.Iterator;

public class test6 {
    public static void main(String[] args) {
        //test1();
       test2();
        //test3();
    }

    public static void test1() {
        ArrayList list = new ArrayList();
        list.add("java");
        list.add("C");
        list.add("mysql");
        list.add("python");
        Iterator it = list.iterator();
        while (it.hasNext()) {
            Object object = it.next();
            if ("java".equals(object)) {
                list.remove(object);
            }
        }
        System.out.println(list);
    }

    public static void test2() {
        ArrayList list = new ArrayList();
        list.add("java");
        list.add("C");
        list.add("mysql");
        list.add("python");
        Iterator it = list.iterator();
        while (it.hasNext()) {
            Object object = it.next();
            if ("java".equals(object)) {
                list.remove(object);
                list.remove(object);
                break;
            }
        }
        System.out.println(list);
    }
    public static void test3(){
        ArrayList list = new ArrayList();
        list.add("java");
        list.add("C");
        list.add("mysql");
        list.add("python");
        Iterator it=list.iterator();
        while (it.hasNext()){
            Object object=it.next();
            if ("java".equals(object)){
                it.remove();
            }
        }
        System.out.println(list);
    }
}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

侬本多情。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值