Java 数据结构深入理解ArrayList与顺序表

Java 数据结构深入理解ArrayList与顺序表攻略

1. 什么是ArrayList?

ArrayList是Java集合框架中的一个类,是一个基于动态数组实现的可变大小的容器。

与传统的静态数组相比,ArrayList可以动态地增加和减少元素的个数,而无需预先指定数组的大小,并且ArrayList是支持泛型的,能够存储任意类型的对象。

ArrayList的接口定义如下所示:

public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable {

    // 构造函数
    public ArrayList()

    ... // 其他方法

}

2. ArrayList的实现原理

ArrayList的底层是一个Object类型的数组,它动态地扩容和收缩。

ArrayList已经占满了当前数组的空间,再往其中添加元素时,会先创建一个新的底层数组,长度是旧数组的1.5倍,并将旧的数组中的元素复制到新的数组中,然后再将新的元素添加进去。如果插入或删除元素时,ArrayList的大小低于1/4,则会将底层数组的长度缩减到当前长度的1/2。

由于ArrayList底层是数组,因此它查询元素的速度非常快,但是插入和删除元素的操作速度相对较慢。如果涉及到大量的元素插入和删除操作,使用链表类的集合可能更加适合。

3. 顺序表的实现

顺序表是一种常见的线性数据结构,它由一组连续的存储空间构成,用来存储同类型的元素。顺序表中的每个元素都可以通过下标来访问,所以查询元素的时间复杂度为O(1)。但是插入和删除元素的操作速度相对较慢,需要移动其他元素的位置。

以下是一个简单的顺序表的实现:

public class MyArrayList<T> {

    private T[] array;
    private int size;

    public MyArrayList(int capacity) {
        this.array = (T[])new Object[capacity];
        this.size = 0;
    }

    ...
}

其中,array是用来存储元素的数组,size是当前元素的个数。可以通过在构造函数中传入参数capacity来指定数组的大小。

实现顺序表的基本操作,如插入元素、删除元素、查询元素等,可以参考以下代码:

public class MyArrayList<T> {

    ...

    // 在指定位置插入元素
    public void add(int index, T element) {
        if (index < 0 || index > size) {
            throw new ArrayIndexOutOfBoundsException();
        }

        // 判断容量,如果已经满了,需要进行扩容
        if (size == array.length) {
            int newCapacity = array.length * 2;
            T[] newArray = (T[])new Object[newCapacity];
            System.arraycopy(array, 0, newArray, 0, array.length);
            array = newArray;
        }

        // 将index之后的元素往后移一位
        for (int i = size; i > index; i--) {
            array[i] = array[i-1];
        }

        // 将元素插入到index处
        array[index] = element;
        size++;
    }

    // 删除指定位置的元素
    public void remove(int index) {
        if (index < 0 || index >= size) {
            throw new ArrayIndexOutOfBoundsException();
        }

        // 将index之后的元素往前移一位
        for (int i = index; i < size - 1; i++) {
            array[i] = array[i+1];
        }

        size--;
    }

    // 查询指定位置的元素
    public T get(int index) {
        if (index < 0 || index >= size) {
            throw new ArrayIndexOutOfBoundsException();
        }

        return array[index];
    }

    // 返回当前元素的数量
    public int size() {
        return size;
    }
}

4. 示例说明

示例1:使用ArrayList存储字符串

import java.util.ArrayList;

public class TestArrayList {

    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();

        list.add("apple");
        list.add("banana");
        list.add("orange");

        System.out.println(list); // 输出:[apple, banana, orange]
    }

}

在这个示例中,我们使用ArrayList存储了三种水果的名称,然后通过System.out.println输出了整个列表。

示例2:使用自定义的顺序表存储整数

public class TestMyArrayList {

    public static void main(String[] args) {
        MyArrayList<Integer> list = new MyArrayList<>(3);

        list.add(0, 1);
        list.add(1, 2);
        list.add(2, 3);
        list.add(1, 4);

        System.out.println(list.get(0)); // 输出:1
        System.out.println(list.get(1)); // 输出:4
        System.out.println(list.get(2)); // 输出:2
        System.out.println(list.get(3)); // 输出:3

        list.remove(1);

        System.out.println(list.get(0)); // 输出:1
        System.out.println(list.get(1)); // 输出:2
        System.out.println(list.get(2)); // 输出:3
    }

}

在这个示例中,我们使用自定义的MyArrayList存储了四个整数,然后通过System.out.println输出了指定位置的元素。接着,我们删除了第二个位置的元素,并再次输出了所有元素。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java 数据结构深入理解ArrayList与顺序表 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • Java实现的傅里叶变化算法示例

    我很高兴为你讲解“Java实现的傅里叶变化算法示例”的完整攻略。下面是详细过程: 1. 傅里叶变换简介 傅里叶变换是数字信号处理中一种非常常见的算法。它可以将时域信号转换为频域信号,方便我们分析信号的频谱结构和特性。在实际应用中,傅里叶变换在图像处理、音频信号处理等领域有着广泛的应用。傅里叶变换可以表示为以下形式: $$X(k) = \sum_{n=0}^{…

    Java 2023年5月19日
    00
  • 浅谈SpringMVC之视图解析器(ViewResolver)

    下面我将为大家详细讲解 “浅谈SpringMVC之视图解析器(ViewResolver)”的完整攻略,包含以下几个方面: 什么是ViewResolver 在Spring MVC中,ViewResolver用于将逻辑视图解析为实际视图,即将Controller层中返回的逻辑视图名(可以是JSP、Velocity等模板引擎生成的视图名称)解析为实际的可视化视图,…

    Java 2023年5月16日
    00
  • idea中创建jsp项目的详细实战步骤

    下面是在IDEA中创建JSP项目的详细实战步骤: 步骤一 创建项目 打开IDEA,点击“Create New Project”按钮。 选择“Java Enterprise”项目类型,然后点击“Next”。 在“Project SDK”下拉框中选择JDK版本,然后点击“Next”。 输入项目名称和项目路径,然后点击“Finish”。 步骤二 添加Web模块 打…

    Java 2023年6月15日
    00
  • SMBMS超市订单管理系统的网站源码

    “SMBMS超市订单管理系统的网站源码”完整攻略 介绍 SMBMS超市订单管理系统的网站源码是一个基于JSP+Servlet+MySQL的Web开发项目。该项目主要实现了超市的订单管理功能,包括用户登录、商品信息的CRUD操作、订单的增删改查等功能。项目使用了MVC设计模式,分为模型层、控制层和视图层,使得项目的代码结构更加清晰。 环境准备 开发工具:Ecl…

    Java 2023年6月15日
    00
  • MyBatis逆向⼯程的生成过程

    下面我将为你详细讲解”MyBatis逆向工程的生成过程”的完整攻略。 1. 确定逆向工程生成的目标文件 逆向工程是根据数据库中的表自动生成基于MyBatis框架的Java代码。因此,在进行逆向工程之前,我们需要先确定逆向工程生成的目标文件,包括要使用哪个数据库、要生成哪些表的代码等。 2. 配置逆向工程的生成参数 在进行逆向工程之前,我们需要先配置生成参数。…

    Java 2023年5月20日
    00
  • java连接数据库(代码分享)

    下面是“Java连接数据库”的完整攻略。 准备工作 首先,需要安装相应的数据库和相应的JDBC驱动包。本文以MySQL数据库为例,下面是安装步骤: 下载并安装MySQL数据库管理系统。 下载相应版本的JDBC驱动包。 将JDBC驱动包加入到Java引用库中。 编写Java代码 下面是一个连接MySQL数据库的Java程序示例: import java.sql…

    Java 2023年5月19日
    00
  • Java 二分法检索算法代码实现详解

    Java 二分法检索算法代码实现详解 什么是二分法检索算法 二分法(Binary Search)又称折半查找法,它要求待查找的序列是有序的,每次查找都取中间位置的值进行比较,然后将查找的区域缩小为左边或右边的一半,直到找到目标值为止。 代码实现 下方是 Java 语言实现的二分法算法代码: public static int binarySearch(int…

    Java 2023年5月19日
    00
  • 【SSM】一、了解Sping 框架

    〇、Maven 0.1 什么是Maven? Apache Maven is a software project management and comprehension tool. Based on the concept of a project object model (POM), Maven can manage a project’s build…

    Java 2023年4月25日
    00
合作推广
合作推广
分享本页
返回顶部