Java数据结构与算法分析(一)数组

简介: 数组是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据

GitHub源码分享

项目主页:https://github.com/gozhuyinglong/blog-demos
本文源码:https://github.com/gozhuyinglong/blog-demos/tree/main/java-data-structures

数组(Array)

数组是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。其特性有:

1、数组是一个线性表,每个线性表上的数据最多只有前和后两个方向。

2、数组的存储元素是连续的,此特性最大的优点是检索速度非常快,但是插入和删除效率很低,为了保证连续性需要做大量的数据搬移工作,下面会有代码示例来说明。

6649b8d98f4e7bcaf1c2ef0c3f9701c3_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2dvemh1eWluZ2xvbmc=,size_16,color_FFFFFF,t_70#pic_center.png

3、数据的大小是固定的,因为在数组定义的时候,需要为它分配连续的内存空间,所以需要预先指定其大小。当存放的数据大于其大小时,我们需要重新分配一块更大的空间,把原来的数据复制过去。下面这段代码解释一个数组arr在必要的时候如何被扩容:

int[] arr = new int[10];
    ...
// 下面我们决定扩大arr
int[] newArr = new int[arr.length * 2];
for(int i = 0, i < arr.length, i++){
   
   
    newArr[i] = arr[i];
}
arr = newArr;

代码示例

插入数据

public static String[] insert(String[] array, int index, String data) {
   
   
    // 判断参数是否合法
    if (array == null || array.length == 0 || index < 0 || index > array.length) {
   
   
        throw new RuntimeException("参数不合法!");
    }
    // 复制出一个长度+1的数组
    String[] newArray = Arrays.copyOf(array, array.length + 1);
    // 将数据从index开始往后移1位;若index为最后一位,则无需移动
    if (array.length > index) {
   
   
        System.arraycopy(newArray, index, newArray, index + 1, newArray.length - index - 1);
    }
    // 将值放到index下标上
    newArray[index] = data;
    return newArray;
}

执行过程(index = 2, data = m)

b5ce8b7b4fca1f53f79b836cf35c411e_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2dvemh1eWluZ2xvbmc=,size_16,color_FFFFFF,t_70#pic_center.png

删除数据

public static String[] remove(String[] array, int index) {
   
   
    // 判断参数是否合法
    if (array == null || index < 0 || index >= array.length) {
   
   
        throw new RuntimeException("参数不合法!");
    }
    // 将数据从index+1处往前移一位
    System.arraycopy(array, index + 1, array, index, array.length - index - 1);
    // 复制出长度-1的数组
    return Arrays.copyOf(array, array.length - 1);
}

执行过程(index = 1)

df23f22016c8c43e5d4294b92f47a291_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2dvemh1eWluZ2xvbmc=,size_16,color_FFFFFF,t_70#pic_center.png

执行结果

public static void main(String[] args) {
   
   
    String[] array = new String[]{
   
   "a", "b", "c", "d"};

    // 在指定下标处插入数据
    String[] insertArray = insert(array, 2, "m");
    for (String arr : insertArray) {
   
   
        System.out.print(arr);
    }
    System.out.println();

    // 删除指定下标的数据
    String[] removeArray = remove(array, 1);
    for (String arr : removeArray) {
   
   
        System.out.print(arr);
    }
}

输出结果:

abmcd
acd

方法学习

Arrays.copyOf

/**
    original: 原数组
    newLength: 副本数组大小
 */
public static <T> T[] copyOf(T[] original, int newLength)

复制指定数组,返回数组副本。需指定副本的大小,若副本长度超过原数组,则多余数组会填充为空;若副本长度少于原数组,则会截断原数组,并且此方法不会改变原数组。

其底层调用了System.arraycopy方法

System.arraycopy

/**
    src: 原数组
    srcPos: 原数组起始位置
    desc: 目标数组
    descPos: 目标数组起始位置
    length: 拷贝的长度
 */
public static native void arraycopy(Object src,  int  srcPos, Object dest, int destPos, int length)

将原数组中的数据拷贝到目标数组中,需指定原数组起始位置、目标数组起始位置和要拷贝的长度

相关文章
|
1天前
|
存储 安全 Java
Java数组(Arrays)详解
Java 中的数组是一种用于存储固定数量同类型数据的高效数据结构,支持连续内存存储和随机访问。数组可以声明并初始化,通过索引访问和修改元素,获取长度,使用循环遍历,支持多维形式,并可通过 `Arrays` 类的方法进行复制和排序。数组具有固定大小和类型安全的特点,但需注意越界等问题。灵活运用数组能显著提升编程效率。
|
14天前
|
存储 Java 数据处理
Java 数组的高级用法
在 Java 中,数组不仅可以存储同类型的数据,还支持多种高级用法,如多维数组(常用于矩阵)、动态创建数组、克隆数组、使用 `java.util.Arrays` 进行排序和搜索、与集合相互转换、增强 for 循环遍历、匿名数组传递以及利用 `Arrays.equals()` 比较数组内容。这些技巧能提升代码的灵活性和可读性,适用于更复杂的数据处理场景。
|
15天前
|
存储 Java
java的Excel导出,数组与业务字典匹配并去掉最后一个逗号
java的Excel导出,数组与业务字典匹配并去掉最后一个逗号
34 2
|
6天前
|
存储 Java
java数据结构,线性表顺序存储(数组)的实现
文章介绍了Java中线性表顺序存储(数组)的实现。线性表是数据结构的一种,它使用数组来实现。文章详细描述了线性表的基本操作,如增加、查找、删除、修改元素,以及其他操作如遍历、清空、求长度等。同时,提供了完整的Java代码实现,包括MyList接口和MyLinearList实现类。通过main函数的测试代码,展示了如何使用这些方法操作线性表。
|
2月前
|
存储 开发者 C#
WPF与邮件发送:教你如何在Windows Presentation Foundation应用中无缝集成电子邮件功能——从界面设计到代码实现,全面解析邮件发送的每一个细节密武器!
【8月更文挑战第31天】本文探讨了如何在Windows Presentation Foundation(WPF)应用中集成电子邮件发送功能,详细介绍了从创建WPF项目到设计用户界面的全过程,并通过具体示例代码展示了如何使用`System.Net.Mail`命名空间中的`SmtpClient`和`MailMessage`类来实现邮件发送逻辑。文章还强调了安全性和错误处理的重要性,提供了实用的异常捕获代码片段,旨在帮助WPF开发者更好地掌握邮件发送技术,提升应用程序的功能性与用户体验。
34 0
|
4天前
|
安全 Java 调度
Java编程时多线程操作单核服务器可以不加锁吗?
Java编程时多线程操作单核服务器可以不加锁吗?
17 2
|
8天前
|
存储 缓存 Java
java线程内存模型底层实现原理
java线程内存模型底层实现原理
java线程内存模型底层实现原理
|
13天前
|
缓存 Java 应用服务中间件
Java虚拟线程探究与性能解析
本文主要介绍了阿里云在Java-虚拟-线程任务中的新进展和技术细节。
|
10天前
|
Java 开发者
Java中的多线程基础与应用
【9月更文挑战第22天】在Java的世界中,多线程是一块基石,它支撑着现代并发编程的大厦。本文将深入浅出地介绍Java中多线程的基本概念、创建方法以及常见的应用场景,帮助读者理解并掌握这一核心技术。
|
6天前
|
Java 调度
Java-Thread多线程的使用
这篇文章介绍了Java中Thread类多线程的创建、使用、生命周期、状态以及线程同步和死锁的概念和处理方法。
Java-Thread多线程的使用
下一篇
无影云桌面