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)

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

相关文章
|
2月前
|
存储 缓存 Java
Java数组全解析:一维、多维与内存模型
本文深入解析Java数组的内存布局与操作技巧,涵盖一维及多维数组的声明、初始化、内存模型,以及数组常见陷阱和性能优化。通过图文结合的方式帮助开发者彻底理解数组本质,并提供Arrays工具类的实用方法与面试高频问题解析,助你掌握数组核心知识,避免常见错误。
|
26天前
|
Java
Java 数组学习笔记
本文整理Java数组常用操作:遍历、求和、查找、最值及二维数组行求和等典型练习,涵盖静态初始化、元素翻倍、去极值求平均等实例,帮助掌握数组基础与应用。
|
4月前
|
存储 算法 安全
Java中的对称加密算法的原理与实现
本文详细解析了Java中三种常用对称加密算法(AES、DES、3DES)的实现原理及应用。对称加密使用相同密钥进行加解密,适合数据安全传输与存储。AES作为现代标准,支持128/192/256位密钥,安全性高;DES采用56位密钥,现已不够安全;3DES通过三重加密增强安全性,但性能较低。文章提供了各算法的具体Java代码示例,便于快速上手实现加密解密操作,帮助用户根据需求选择合适的加密方案保护数据安全。
360 58
|
3月前
|
存储 负载均衡 算法
我们来说一说 Java 的一致性 Hash 算法
我是小假 期待与你的下一次相遇 ~
121 1
|
3月前
|
存储 Java 索引
java 数组
在 Java 中,数组是一种数据结构,用于存储多个相同类型的数据元素。数组的大小一旦创建后就不能改变,因此它是固定长度的。Java 数组是一种 对象,即使它存储的值是基本类型(如 int、double 等),它也是一个对象引用。
82 0
|
3月前
|
存储 监控 算法
企业上网监控场景下布隆过滤器的 Java 算法构建及其性能优化研究
布隆过滤器是一种高效的数据结构,广泛应用于企业上网监控系统中,用于快速判断员工访问的网址是否为违规站点。相比传统哈希表,它具有更低的内存占用和更快的查询速度,支持实时拦截、动态更新和资源压缩,有效提升系统性能并降低成本。
89 0
|
4月前
|
存储 安全 Java
Java 集合面试题从数据结构到 HashMap 源码剖析详解及长尾考点梳理
本文深入解析Java集合框架,涵盖基础概念、常见集合类型及HashMap的底层数据结构与源码实现。从Collection、Map到Iterator接口,逐一剖析其特性与应用场景。重点解读HashMap在JDK1.7与1.8中的数据结构演变,包括数组+链表+红黑树优化,以及put方法和扩容机制的实现细节。结合订单管理与用户权限管理等实际案例,展示集合框架的应用价值,助你全面掌握相关知识,轻松应对面试与开发需求。
204 3
|
存储 Java
Java数据结构:链表
Java数据结构:链表
97 2
java数据结构,双向链表的实现
文章介绍了双向链表的实现,包括数据结构定义、插入和删除操作的代码实现,以及双向链表的其他操作方法,并提供了完整的Java代码实现。
java数据结构,双向链表的实现

热门文章

最新文章