当前位置: 首页 > news >正文

Java数据结构之数组的增删改查

1.数组元素的读取(时间复杂度O(1))

对于数组来说,读取元素是最简单的操作。因为数组在内存中是顺序存储的,只需要给出一个下标,就可以读取到对应得的数组元素

int [] array = new int[]{1,9,6,3,4,8};
//读出下标为3的数组元素
System.out.println(array[3]);

2.数组元素的更新(时间复杂度O(1))

对于数组来说,更新元素也是非常简单的操作。直接利用数组下标就可以把新值赋值给该元素

 int [] array = new int[]{1,9,6,3,4,8};
        //读出下标为3的数组元素
        System.out.println("未修改前"+array[3]);
        System.out.println("未修改前数组");
        for (int i = 0; i < array.length; i++) {
            System.out.print("["+array[i]+"]");
        }
        //换行
        System.out.println();
        //把新值 10086 赋值给数组元素下标为3的元素
        array[3]=10086;
        System.out.println("修改之后"+array[3]);
        System.out.println("修改之后数组");
        for (int i = 0; i < array.length; i++) {
            System.out.print("["+array[i]+"]");
        }

在这里插入图片描述

3.数组元素的插入(时间复杂度O(n))

3.1尾部插入

尾部插入相对简单,直接把插入的元素放入尾部的空闲位置即可

        //准备一个数组
        //下面这种写法是把数组直接写死在内存中,无法再插入元素
        int [] array = new int[]{1,9,6,3,4,8};
        //再次准备一个未满的数组,数组长度为8
        int[] array2 = new int[8];
        array2[0]=1;
        array2[1]=9;
        array2[2]=6;
        //输出原始数组,此时数组有三个元素
        System.out.println("原始数组");
        for (int i = 0; i < array2.length; i++) {
            System.out.print("["+array2[i]+"]");
        }
        //换行
        System.out.println();
        //进行插入,往第四个元素位置插入元素
        array2[3]=8;
        //输出插入元素后数组,此时数组有四个元素
        System.out.println("插入元素后数组");
        for (int i = 0; i < array2.length; i++) {
            System.out.print("["+array2[i]+"]");
        }


在这里插入图片描述

3.2中间插入

中间插入就比较麻烦,由于每个数组元素都有其固定下标,所以不得不把插入位置及以后的元素全部后移
package 数组;

/**

  • @author:MZH
  • @QQ:2563548305
  • @Date:2022/8/31 17:39
    */

/**

  • 中间插入就比较麻烦,由于每个数组元素都有其固定下标,所以不得不把插入位置及以后的元素全部后移
    */
    public class MyArray2 {
    //准备数组
    private int[] array;
    //数组的实际长度,也就是数组里面实际有多少个元素
    private int size;

    /**
    *

    • pram capacity 初始化数组容量
      */

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

    /**

    • @param element 插入的元素
    • @param index 插入的位置
      */
      public void insert(int element,int index) throws Exception{
      //判断插入的位置是否超出范围
      if (index<0||index>size){
      throw new Exception(“超出数组实际范围”);
      }
      //从右往左循环,移动元素
      for (int i=size-1;i>=index;i–){
      array[i+1]=array[i];
      }
      //放入新元素
      array[index]=element;
      //数组的实际长度加一
      size++;
      }
      //打印数组
      public void print(){
      for (int i = 0; i < size; i++) {
      System.out.print(“[”+array[i]+“]”);
      }
      System.out.println();
      }

    public static void main(String[] args) throws Exception{
    MyArray2 myArray2 = new MyArray2(6);
    myArray2.insert(10,0);
    myArray2.insert(18,0);
    myArray2.insert(15,0);
    myArray2.insert(17,0);
    myArray2.insert(99,1);
    myArray2.print();
    }
    }

在这里插入图片描述

3.3超范围插入

假如现在有一个长度为6的数组,想插入第7个元素,怎么办?
扩容!
因为数组一旦创建,长度就确定了,无法改变,所以我们可以准备一个新的数组,长度是原来数组的2倍,再把原来数组中的元素复制到新的数组中,这样就实现了扩容。

package 数组;

/**
 * @author:MZH
 * @QQ:2563548305
 * @Date:2022/8/31 17:39
 */

/**
 * 中间插入就比较麻烦,由于每个数组元素都有其固定下标,所以不得不把插入位置及以后的元素全部后移
 */
public class MyArray2 {
    //准备数组
    private int[] array;
    //数组的实际长度,也就是数组里面实际有多少个元素
    private int size;

    /**
     *
     * pram capacity 初始化数组容量
     */

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

    /**
     * @param element 插入的元素
     * @param index 插入的位置
     */
    public void insert(int element,int index) throws Exception{
        //判断插入的位置是否超出范围
        if (index<0||index>size){
            throw new Exception("超出数组实际范围");
        }
        if (size>=array.length){
            reSize();
        }
        //从右往左循环,移动元素
        for (int i=size-1;i>=index;i--){
            array[i+1]=array[i];
        }
        //放入新元素
        array[index]=element;
        //数组的实际长度加一
        size++;
    }

    /**
     * 数组扩容
     */
    public void reSize(){
        //准备大一点的数组
        int[] newArray = new int[array.length * 2];
        //把旧的数组复制到新的数组
        System.arraycopy(array,0,newArray,0,array.length);
        array=newArray;
    }

    //打印数组
    public void print(){
        for (int i = 0; i < size; i++) {
            System.out.print("["+array[i]+"]");
        }
        System.out.println();
    }

    public static void main(String[] args) throws Exception{
        MyArray2 myArray2 = new MyArray2(6);
        myArray2.insert(10,0);
        myArray2.insert(18,0);
        myArray2.insert(15,0);
        myArray2.insert(17,0);
        myArray2.insert(99,1);
        myArray2.insert(78,1);
        myArray2.insert(80,1);
        myArray2.print();

    }
}

在这里插入图片描述

4.数组元素的删除(时间复杂度O(n))

数组的删除不涉及扩容,所以较为简单

/**
     * 
     * @param index 删除的位置
     * @throws Exception
     */
     public  void delete(int index)throws  Exception{
         //判断删除的位置是否超出范围
         if (index<0||index>=size){
             throw new Exception("超出数组实际范围");
         }
         //从左往右循环,元素左移
         for (int i = index;i<=size-1;i++){
             array[i]=array[i+1];
         }
         size--;
     }

在这里插入图片描述

相关文章:

  • 函数栈桢原理
  • JSP面试题(重要)
  • 华为FreeBuds pro2大风场景下降噪差原因
  • 网课搜题接口对接教程
  • ORM基本操作
  • 数据结构-压缩软件核心-C++(利用哈夫曼树进行编码,对文件进行压缩与解压缩)
  • SSM学生成绩管理系统毕业设计-附源码070942
  • springboot宴会预定平台毕业设计-附源码231718
  • springboot大学新生小助手小程序毕业设计-附源码060917
  • LeetCode50天刷题计划(Day 35—不同路径II (8.00-9.20)
  • C语言的输入和输出
  • 大数据环境下使用机器学习算法的入侵检测模型
  • Vue3 从入门到放弃 (第三篇.组件的使用)
  • 跑通DIMP(Windows10)
  • 02-Ajax入门
  • Android Volley源码解析
  • JavaScript新鲜事·第5期
  • JDK 6和JDK 7中的substring()方法
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • Mac转Windows的拯救指南
  • tab.js分享及浏览器兼容性问题汇总
  • Vue 动态创建 component
  • vue-cli3搭建项目
  • vue-router 实现分析
  • windows下如何用phpstorm同步测试服务器
  • Zepto.js源码学习之二
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 算法-插入排序
  • 用简单代码看卷积组块发展
  • 2017年360最后一道编程题
  • $(selector).each()和$.each()的区别
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (2022版)一套教程搞定k8s安装到实战 | RBAC
  • (9)STL算法之逆转旋转
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (转)IOS中获取各种文件的目录路径的方法
  • .NET Core WebAPI中使用Log4net 日志级别分类并记录到数据库
  • .NET Micro Framework 4.2 beta 源码探析
  • .net 生成二级域名
  • .NET中的Event与Delegates,从Publisher到Subscriber的衔接!
  • .sh
  • // an array of int
  • :如何用SQL脚本保存存储过程返回的结果集
  • [ 手记 ] 关于tomcat开机启动设置问题
  • [2018][note]用于超快偏振开关和动态光束分裂的all-optical有源THz超表——
  • [23] GaussianAvatars: Photorealistic Head Avatars with Rigged 3D Gaussians
  • [383] 赎金信 js
  • [ABC294Ex] K-Coloring
  • [C++]类和对象【下】
  • [daily][archlinux][game] 几个linux下还不错的游戏
  • [DAU-FI Net开源 | Dual Attention UNet+特征融合+Sobel和Canny等算子解决语义分割痛点]
  • [delphi]保证程序只运行一个实例