List【数据结构】

List

1.List的常用方法

方法解释
boolean add( E e )尾插e
void add(int index, E element)将e插入到index位置
Boolean addAll(Collection<? extends E> c)尾插c中的元素
E remove(int index)删除 index 位置元素
boolean remove(Object o)删除遇到的第一个o
E get(int index)获取下标 index 位置元素
E set(int index, E element)将下标 index 位置元素设置为 element
void clear()清空
boolean contains(Object o)判断 o 是否在线性表中
int indexOf(Object o)返回第一个 o 所在的下标
int lastIndexOf(Object o)返回最后一个o所在下标
List< E > subList(int fromIndex, int toIndex)截取部分 list

2. List的使用

注意: List是个接口,并不能直接用来实例化。,如果要使用,必须去实例化List的实现类。

在这里插入图片描述

2.1 线性表

线性表(linear list)是数据结构的一种,表示n个具有相同特性的数据元素的有限序列

线性表在逻辑上是线性结构,在物理上不一定是连续的,在物理上存储时,通常以数组和链式结构的形式存储

3. ArrayList 框架图

在集合框架中,ArrayList是一个普通的类,实现了List接口,具体框架图如下:
在这里插入图片描述
(1)ArrayList 实现了 RandomAccess 接口,表明 ArrayList 支持随机访问
(2)ArrayList 实现了 Cloneable 接口,表明 ArrayList 是可以 clone 的
(3)ArrayList 实现了 Serializable 接口,表明 ArrayList 是支持序列化的
(4)和 Vector 不同, ArrayList 不是线程安全的,在单线程下可以使用,在多线程中可以选择 Vector 或者CopyOnWriteArrayList
(5)ArrayList 底层是一段连续的空间,并且可以动态扩容,是一个动态类型的顺序表

4. ArrayList使用用例

先定义一个顺序表数组结构

public int[] elem;
    public int usedSize;
    public static final int DEFAULT_CAPACITY = 10;


    public MyArrayList(){
        this.elem = new int[10];
    }

(1) 打印顺序表display(),只需要打印到 usedSize 下标就可以了

    public void display(){
        for(int i = 0; i < this.usedSize; i++){
            System.out.println(this.elem[i]+" ");
        }
        System.out.println();
    }

(2) 新增元素,默认在数组最后新增 add

先判断是否需要扩容 isFull()

 public boolean isFull(){
        //这里usedsize 必须和 elem.length
        return usedSize == elem.length;

需要扩容时,就申请空间扩容

public void add(int data){
        //扩容
        try{
            if(isFull()){
                elem = Arrays.copyOf(elem, 2*elem.length);
            }
        }catch(NegativeArraySizeException e){
            e.printStackTrace();
        }
        elem[usedSize++] = data;
    }

(3) 在 pos 位置新增元素 add(int pos, int data)

检查add元素的时候,pos位置是否合法

private void checkAddPos(int pos){
        if(pos < 0 || pos > usedSize){
            throw new PosIndexNotLegalException("pos位置不合法");
        }
    }

在 pos 位置新增元素,把pos后面元素全部向后移一位,然后放入新增元素

public void add(int pos, int data){
        try{
            checkAddPos(pos);

            if(isFull()){
                elem = Arrays.copyOf(elem, 2*elem.length);
            }

            for(int i = usedSize-1; i >= pos; i++){
                elem[i+1] = elem[i];
            }
            elem[pos] = data;
            usedSize++;
        }catch(PosIndexNotLegalException e){
            e.printStackTrace();
        }

    }

上述代码中若有不合法,则调用异常类 PosIndexNotLegalException

package Listdemo;
public class PosIndexNotLegalException extends RuntimeException{
    public PosIndexNotLegalException(){
    }
    public PosIndexNotLegalException(String msg){
        super(msg);
    }
}

(4) 判定是否包含某个元素 contains()

public boolean contains(int toFind){
        for(int i = 0; i < usedSize; i++){
            if(elem[i] == toFind){
                return true;
            }
        }
        return false;
    }

(5) 查找某个元素对应的位置 indexOf()

public int indexOf(int toFind){
        for(int i = 0; i < usedSize; i++){
            if(elem[i] == toFind){
                return i;
            }
        }
        return -1;
    }

(6) 获取 pos 位置的元素 get()

同理 获取 pos 位置的数据,检查合法性

private void checkGetPos(int pos){
        if(pos < 0 || pos >= usedSize){
            throw new PosIndexNotLegalException("pos位置不合法");
        }
    }
public int get(int pos){
//        int retVal = -1;
//        try{
//            checkGetPos(pos);
//            retVal = elem[pos];
//        }catch(PosIndexNotLegalException e){
//            //就要处理pos位置不合法的问题
//            e.printStackTrace();
//        }
//        return retVal;
        checkGetPos(pos);
        return elem[pos];
    }

(7) 给 pos 位置元素设置 value 更新 set()

public void set(int pos, int value){
        checkGetPos(pos);
        elem[pos] = value;
    }

(8) 删除第一次出现的关键字key remove()

public void remove(int key){
        int index = indexOf(key);
        if(index == -1){
            System.out.println("没有你要删除的数字");
            return;
        }
        for(int i = index; i < usedSize; i++){
            elem[i] = elem[i+1];
        }
          //elem[] = null;
            usedSize--;
    }

(9) 获取顺序表长度 size()

public int size(){
        return usedSize;
    }

(10) 清空顺序表 clear()

public void clear(){
//        for(int i = 0; i < usedSize; i++){
//            elem[i] = null;
//        }
            usedSize = 0;
    }

验证测试

public static void main(String[] args) {
        MyArrayList myArrayList = new MyArrayList();
        myArrayList.add(0,1);
        myArrayList.add(1,2);
        myArrayList.add(2,3);
        myArrayList.add(31);
        myArrayList.display();
        System.out.println(myArrayList.contains(1));
        System.out.println(myArrayList.indexOf(1));
        System.out.println(myArrayList.get(1));
        myArrayList.set(0,99);
        myArrayList.display();
    }

5. ArrayList的遍历

(1)for 循环遍历
(2)foreach循环
(3)使用迭代器
如:

public class Test {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("JavaSE");
        list.add("JavaWeb");
        list.add("JavaEE");
        list.add("JVM");
        list.add("测试课程");
        System.out.println(list);
        System.out.println("===================for======================");

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

        for (String x: list) {
            System.out.println(x);
        }

        System.out.println("====================迭代器1=======================");

        Iterator<String> it = list.iterator();
        while(it.hasNext()){
            System.out.println(it.next());
        }

        System.out.println("====================迭代器2=======================");

        ListIterator<String> it2 = list.listIterator();
        while(it2.hasNext()){
            System.out.println(it2.next());
        }
}

测试结果:
在这里插入图片描述

**注意:**截取部分list subList()

List<String> ret = list.subList(1,3);
        System.out.println(ret);

        System.out.println("===================更新===================");
        ret.set(0,"zmy");

        System.out.println(list);
        System.out.println(ret);

测试结果:
在这里插入图片描述

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值