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)

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

相关文章
|
4天前
|
监控 算法 网络协议
Java 实现局域网电脑屏幕监控算法揭秘
在数字化办公环境中,局域网电脑屏幕监控至关重要。本文介绍用Java实现这一功能的算法,涵盖图像采集、数据传输和监控端显示三个关键环节。通过Java的AWT/Swing库和Robot类抓取屏幕图像,使用Socket进行TCP/IP通信传输图像数据,并利用ImageIO类在监控端展示图像。整个过程确保高效、实时和准确,为提升数字化管理提供了技术基础。
35 15
|
10天前
|
缓存 算法 搜索推荐
Java中的算法优化与复杂度分析
在Java开发中,理解和优化算法的时间复杂度和空间复杂度是提升程序性能的关键。通过合理选择数据结构、避免重复计算、应用分治法等策略,可以显著提高算法效率。在实际开发中,应该根据具体需求和场景,选择合适的优化方法,从而编写出高效、可靠的代码。
25 6
|
2月前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
68 5
|
2月前
|
存储 人工智能 算法
数据结构实验之C 语言的函数数组指针结构体知识
本实验旨在复习C语言中的函数、数组、指针、结构体与共用体等核心概念,并通过具体编程任务加深理解。任务包括输出100以内所有素数、逆序排列一维数组、查找二维数组中的鞍点、利用指针输出二维数组元素,以及使用结构体和共用体处理教师与学生信息。每个任务不仅强化了基本语法的应用,还涉及到了算法逻辑的设计与优化。实验结果显示,学生能够有效掌握并运用这些知识完成指定任务。
60 4
|
3月前
|
存储 缓存 算法
Java 数组
【10月更文挑战第19天】Java 数组是一种非常实用的数据结构,它为我们提供了一种简单而有效的方式来存储和管理数据。通过合理地使用数组,我们能够提高程序的运行效率和代码的可读性。更加深入地了解和掌握 Java 数组的特性和应用,为我们的编程之旅增添更多的精彩。
39 4
|
3月前
|
存储 缓存 算法
提高 Java 数组性能的方法
【10月更文挑战第19天】深入探讨了提高 Java 数组性能的多种方法。通过合理运用这些策略,我们可以在处理数组时获得更好的性能表现,提升程序的运行效率。
45 2
|
3月前
|
存储 Java
Java“(array) <X> Not Initialized” (数组未初始化)错误解决
在Java中,遇到“(array) &lt;X&gt; Not Initialized”(数组未初始化)错误时,表示数组变量已被声明但尚未初始化。解决方法是在使用数组之前,通过指定数组的大小和类型来初始化数组,例如:`int[] arr = new int[5];` 或 `String[] strArr = new String[10];`。
104 2
|
3月前
|
存储 算法 Java
带你学习java的数组军队列
带你学习java的数组军队列
41 0
|
3月前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
99 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
3月前
|
机器学习/深度学习 存储 缓存
数据结构与算法学习十:排序算法介绍、时间频度、时间复杂度、常用时间复杂度介绍
文章主要介绍了排序算法的分类、时间复杂度的概念和计算方法,以及常见的时间复杂度级别,并简单提及了空间复杂度。
50 1
数据结构与算法学习十:排序算法介绍、时间频度、时间复杂度、常用时间复杂度介绍