首页  >  文章  >  Java  >  Java中ArrayList与顺序表怎么定义与实现

Java中ArrayList与顺序表怎么定义与实现

WBOY
WBOY转载
2023-05-18 14:04:46734浏览

    1、线性表

    定义

    线性表是最基本、最简单、也是最常用的一种数据结构。一个有限序列,其中包含n个具有相同特性的数据元素,被称为线性表(linear list),是数据结构的一种。

    常见的线性表:顺序表、链表、栈、队列...

    线性表在逻辑上是线性结构,也就说是连续的一条直线。线性表在物理上的存储形式通常是数组或链表结构,但并不一定是连续的。

    特征

    • 集合中必存在唯一的一个“第一元素”。

    • 集合中必存在唯一的一个 “最后元素” 。

    • 除最后一个元素之外,均有唯一的后继(后件)。

    • 除第一个元素之外,均有唯一的前驱(前件)。

    2、顺序表

    定义

    通常采用数组形式存储的线性结构叫做顺序表,它将数据元素依次存储在一片物理地址连续的存储单元中。在数组上完成数据的增删查改。

    实现

    首先我们需要创建一个数组来存放数据。

    Java中ArrayList与顺序表怎么定义与实现

    备注:因为我为了方便就先创建的整形数组,为了能更好的适应各种类型,大家可以创建泛型的数组,我这里就没写了。

    Java中ArrayList与顺序表怎么定义与实现

    接下来就是对顺序表的各种操作。例如:基本的CURD,打印顺序表,获取顺序表长度,清空顺序表等等。

    打印数组

    因为是数组,所以直接遍历数组打印就好了

    Java中ArrayList与顺序表怎么定义与实现

    新增元素

    在增加元素时,考虑数组是否已满状态是必要的,因此我们需要进行判断,若数组空间已满,则需要进行扩容。另外,我们还需要判断在这个pos位置是否合法。

    判断空间是否已满方法

    Java中ArrayList与顺序表怎么定义与实现

    这里我们简化代码为:

    Java中ArrayList与顺序表怎么定义与实现

    如果要扩容的话,在扩容完成之后,因为顺序表是连续的结构,所以在pos位置新增元素的话,那么pos位置之后的元素就要依次往后挪。这样才能把元素新增进去。

    Java中ArrayList与顺序表怎么定义与实现

     注意:在扩容之后我们需要更改CAPACITY和usedSize的大小。

    判断是否包含某个元素

    在这我们需要考虑到此时数组是否为空的情况。

    Java中ArrayList与顺序表怎么定义与实现

    之后还是直接遍历数组的操作。

    Java中ArrayList与顺序表怎么定义与实现

    查找元素

    在这里也需要一次判空操作。

    Java中ArrayList与顺序表怎么定义与实现

    获取pos位置的元素

    这里可能会出现数组为空的情况和pos不合法的情况,所以需要判断。

    我这里是手动抛出的异常,没有另外写了。

    Java中ArrayList与顺序表怎么定义与实现

    更改pos位置的值

    Java中ArrayList与顺序表怎么定义与实现

    删除操作

    删除某个位置上的元素,可直接让其后面的元素覆盖掉它,实现删除。

    Java中ArrayList与顺序表怎么定义与实现

    获取顺序表长度

    Java中ArrayList与顺序表怎么定义与实现

    清空顺序表

    Java中ArrayList与顺序表怎么定义与实现

    后面这几个操作比较简单就不多叙述了。

    3、ArrayList

    简介:

    在集合框架中,ArrayList是一个普通的类,实现了List接口,具体框架图如下:

    Java中ArrayList与顺序表怎么定义与实现

    [说明]

    1. ArrayList实现了RandomAccess接口,表明ArrayList支持随机访问。

    2. ArrayList实现了Cloneable接口,表明ArrayList是可以clone的。

    3. ArrayList实现了Serializable接口,表明ArrayList是支持序列化的。

    4. 和Vector不同,ArrayList不是线程安全的,在单线程下可以使用,在多线程中可以选择Vector或者CopyOnWriteArrayList。

    5.  ArrayList底层是一段连续的空间,并且可以动态扩容,是一个动态类型的顺序表。

    使用

     public static void main(String[] args) {
            // ArrayList创建,推荐写法
            // 构造一个空的列表
            List<Integer> list1 = new ArrayList<>();
     
            // 构造一个具有10个容量的列表
            List<Integer> list2 = new ArrayList<>(10);
            list2.add(1);
            list2.add(2);
            list2.add(3);
     
            // list2.add("hello"); // 编译失败,List<Integer>已经限定了,list2中只能存储整形元素
            // list3构造好之后,与list中的元素一致
            ArrayList<Integer> list3 = new ArrayList<>(list2);
     
            // 避免省略类型,否则:任意类型的元素都可以存放,使用时将是一场灾难
            List list4 = new ArrayList();
            list4.add("111");
            list4.add(100);
        }

     一些常见方法

    方法 解释
    boolean add(E e) 尾插e
    void add(int index, E element) 将 e 插入到 index 位置
    boolean addAll(Collection2d4902c92e1e7bfd574f59708c57776a 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 的下标
    Listd2441b8e744ba5a800e028f5ee28d143 subList(int fromIndex, int toIndex) 截取部分 list

     ArrayList的遍历

    循环遍历

    Java中ArrayList与顺序表怎么定义与实现

    foreach遍历

    Java中ArrayList与顺序表怎么定义与实现

    迭代器

            System.out.println("======迭代器1=========");
     
            ElementObservableListDecorator<Object> list;
            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());
            }

    顺序表和数组的区别:

    上面说,顺序表的底层可以理解为一个数组,但是相比于数组,更加的高级。

    顺序表可以自己扩容;

    顺序表严格区分数组容量和元素的个数。

    所以数组其实就是一种不完备的顺序表。

    顺序表中的注意点:

    • 我们需要区分顺序表中的两个概念:容量(capacity)和元素个数(size)。

    • 容量可以理解为数组的大小(长度),元素个数是size中记录的有效元素个数。

    • 顺序表中,数据的存储是需要连续的,不可以元素和元素之间存在“空隙”,当进行插入、删除等操作时,操作完成后,也要保证顺序表的连续。

    以上是Java中ArrayList与顺序表怎么定义与实现的详细内容。更多信息请关注PHP中文网其他相关文章!

    声明:
    本文转载于:yisu.com。如有侵权,请联系admin@php.cn删除