List、ArrayList与顺序表的介绍(数据结构系列3)

目录

前言:

1.List

1.1什么是List

1.2List的使用

2.ArrayList

2.1线性表

2.2ArrayList的方法

2.3ArrayList的模拟实现

2.4ArrayList的使用

2.5ArrayList的三种遍历方式

2.5.1for循环遍历

2.5.2for-each遍历

2.5.3使用迭代器遍历

结束语:


前言:

1.List

1.1什么是List

在集合框架中List是一个接口,继承自Collection,如下图所示:

 其中Collection也是一个接口,该接口中规范了后序容器中常用的一些方法,如下图所示:

 Lterable也是一个接口,表示实现该接口的类是可以逐个元素进行遍历的,具体如下所示:

1.2List的使用

在数据结构的角度来看,List就是一个线性表,即n个具有相同类型元素的有限序列,在该序列上可以执行增删改查以及变量等操作。需要注意的是List是一个接口,并不能直接用来实例化。如果要使用的话,必须去实例化List的实现类,在集合框架中,ArrayList和LinkedList都实现了List接口。

那么接下来我们来具体看一下什么是ArrayList以及带大家去了解一下ArrayList中的一些方法。

2.ArrayList

2.1线性表

在数据结构中存在一中结构叫线性结构,其中线性结构中又包含了顺序结构和链式结构,那么接下来我先带着大家一起来了解一下什么是顺序结构。

顺序表:

顺序表使用一段物理地址连续的存储空间单元依次存储数据元素的线性结构,一般情况下都是采用数组存储,在数组上完成增删改查操作。其实通俗的将顺序表就是一个数组,将数据以顺序的方式存储起来。

2.2ArrayList的方法

那么我可以现在idea上查看一下ArrayList具体都有哪些方法。

那么接下来我们来自己实现一下这些方法。 

2.3ArrayList的模拟实现

代码实现如下所示,具体的方法解释也在代码中,详见代码。
MyArrayList代码:

import java.util.Arrays;

public class MyArrayList {
    //顺序表不适合频繁的删除数据
    public int[] elem;//默认为NULL
    public int usedSize;//存储了多少个有效数据
    public static final int DEFAULT_SIZE = 5;//给定一个默认值
    public MyArrayList() {
        this.elem = new int[DEFAULT_SIZE];//进行开辟空间初始化
    }

    //打印数组
    public void display() {
        for (int i = 0; i < this.usedSize; i++) {
            System.out.print(this.elem[i] + " ");
        }
    }

    //获取顺序表的长度
    public int size () {
        return this.usedSize;
    }

    //判断是否包含某个元素
    public boolean contains(int toFind) {
        for (int i = 0; i < this.usedSize; i++) {
            if (this.elem[i] == toFind) {
                return true;
            }
        }
        return false;
    }

    //查找某个元素对应的位置
    public int indexOf(int toFind) {
        for (int i = 0; i < this.usedSize; i++) {
            if (this.elem[i] == toFind) {
                return i;
            }
        }
        return -1;
    }

    //新增元素,默认在数组最后新增
    public void add(int data) {
        if (isFull()) {
            resize();
        }
        this.elem[this.usedSize] = data;
        this.usedSize++;
    }

    //判断是否为满
    public boolean isFull() {
        if (this.usedSize >= this.elem.length) {
            return true;
        }
        return false;
    }

    //扩容
    private void resize() {
        this.elem = Arrays.copyOf(this.elem, 2 * this.elem.length);
    }

    //在pos位置新增元素,与上述的add方法构成了重载
    //时间复杂度O(1)
    public void add(int pos, int data) {
        checkAddIndex(pos);
        for (int i = this.usedSize - 1; i >= pos ; i--) {
            this.elem[i + 1] = this.elem[i];
        }
        this.elem[pos] = data;
        this.usedSize++;
    }
    //检查位置的合法性
    private void checkAddIndex(int pos) {
        if (pos < 0 || pos > this.usedSize) {
            throw new IndexOutInException("该位置不合法!");
        }
    }
    //获取pos位置的值
    public int get(int pos) {
        checkGetIndex(pos);
        for (int i = 0; i < this.usedSize; i++) {
            if (this.elem[i] == this.elem[pos]) {
                return this.elem[i];
            }
        }
        return -1;
    }
    //判断获取元素的时候位置的合法性
    private void checkGetIndex(int pos) {
        if (pos < 0 || pos > this.usedSize) {
            throw new IndexOutInException("pos 位置不合法!");
        }
    }

    //给pos位置的元素设置为value
    public void set(int pos, int value) {
        checkIndex(pos);
        this.elem[pos] = value;
    }

    //检查给pos位置的元素设置为value时位置的合法性
    private void checkIndex(int pos) {
        if (pos < 0 || pos > this.usedSize) {
            throw new IndexOutInException("该位置不合法!");
        }
    }

    //删除第一次出现的关键字key
    public void remove(int toRemove) {
        int ret = 0;
        for (int i = 0; i < this.usedSize; i++) {
            if (this.elem[i] == toRemove) {
                ret  = i;
            }
        }
        for (int i = ret; i < this.usedSize; i++) {
            this.elem[i] = this.elem[i + 1];
        }
        this.usedSize--;
    }

    //清空顺序表
    public void clear() {
        this.usedSize = 0;
    }
}

接口代码:

public class IndexOutInException extends RuntimeException{
    public IndexOutInException () {

    }
    public IndexOutInException (String msg) {
        super(msg);
    }
}

Test代码:

public class Test {
    public static void main(String[] args) {
        MyArrayList myArrayList = new MyArrayList();
        myArrayList.add(1);
        myArrayList.add(2);
        myArrayList.add(3);
        myArrayList.add(4);
        myArrayList.add(5);
        myArrayList.display();
        System.out.println();
        myArrayList.add(6);
        myArrayList.display();
        System.out.println();
        int ret = myArrayList.size();
        System.out.println(ret);
        boolean ret2 = myArrayList.contains(2);
        System.out.println(ret2);
        int ret3 = myArrayList.indexOf(3);
        System.out.println(ret3);
        myArrayList.add(1,99);
        myArrayList.display();
        System.out.println();
        int ret5 = myArrayList.get(1);
        System.out.println(ret5);
        myArrayList.set(1,33);
        myArrayList.display();
        System.out.println();
        myArrayList.remove(1);
        myArrayList.display();
        System.out.println();
        myArrayList.clear();
        myArrayList.display();
    }
}

结果截图:

2.4ArrayList的使用

虽然List是一个接口不可以实例化,但是我们可以根据ArrList来实现它的具体方法。

代码如下所示:

import java.util.ArrayList;
import java.util.List;

public class Test {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();//在<>中可以指定存储的类型
        list.add("hello");
        list.add(" world");
        list.add("!!!");
        System.out.println(list);//打印里面的元素
        System.out.println(list.size());//获取list中有多少个元素
        //获取和设置index位置上的元素,注意index必须是在[0,size)之间
        String  ret1 = list.get(1);
        System.out.println(ret1);
        list.set(2,"!");
        System.out.println(list);
        //在list位置上插入指定的元素
        list.add(1,"this");
        System.out.println(list);
        //删除指定位置上的元素
        list.remove(1);
        System.out.println(list);
        //检测list中是否包含指定元素
        boolean ret2 = list.contains("hello");
        System.out.println(ret2);
        //查找指定元素第一次出现的位置
        list.add("a");
        list.add("a");
        list.add("b");
        System.out.println(list);
        System.out.println(list.indexOf("a"));//查到就会返回该位置的下标
        //清除所有元素
        list.clear();
        System.out.println(list);
        System.out.println(list.size());
    }
}

结果下所示:

 

2.5ArrayList的三种遍历方式

2.5.1for循环遍历

代码如下所示:

import java.util.List;

public class Test1 {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        //使用for遍历
        for (int i = 0; i < list.size(); i++) {
            System.out.print(list.get(i) + " ");
        }
    }
}

结果如下所示:

 

2.5.2for-each遍历

代码如下所示:

import java.util.ArrayList;
import java.util.List;

public class Test2 {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        list.add(5);
        for (Integer a:list) {
            System.out.print(a + " ");
        }
    }
}

 

结果如下所示:

2.5.3使用迭代器遍历

代码如下所示:

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

public class Test3 {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        list.add(3);
        list.add(4);
        list.add(5);
        list.add(6);
        Iterator<Integer> iterator = list.listIterator();//构造器
        while (iterator.hasNext()) {
            System.out.print(iterator.next() + " ");
        }
    }
}

结果如下所示:

 

结束语:

好了,这节有关于List和ArrayList的知识小编就分享到这里啦!后期小编会出有关于ArrayList的具体使用例子,继续关注小编,小编带你一起学会数据结构哦!希望对大家有所帮助,想要学习的同学记得关注小编和小编一起学习吧!如果文章中有任何错误也欢迎各位大佬及时为小编指点迷津(在此小编先谢过各位大佬啦!)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

努力敲代码的小白✧٩(ˊωˋ*)و✧

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

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

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

打赏作者

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

抵扣说明:

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

余额充值