⛳ Java数组

Java数组的目录

  • ⛳ Java数组
    • 🎨 一,一维数组
      • 👣 1.1,概念
      • 📢 1.2,基本用法
        • 1,语法格式
        • 2,代码
      • 💻 1.3,内存结构
      • 📝 1.4,练习
    • 🎁 二,二维数组
      • 🏭 2.1,概念
        • 1,语法格式
          • 格式1:
          • 格式2:
          • 格式3:
      • 🐾 2.2,二维数组的使用
      • 🎉 2.3,内存结构
    • 🏭 三,数组中常见的算法
      • 📐 3.1,二分查找
      • 💬 3.2,排序算法
      • 💖 3.3,冒泡排序
      • 🚜 3.4,Arrays工具类

⛳ Java数组

数组是一种数组结构,用于存储相同类型的多个元素。它提供了一个连续的内存块,用于存储数组元素。

数组的特点和数组结构:

  1. 连续内存:Java数组的元素在内存中是连续存储的。这意味着数组的每个元素在内存中占据相同大小的空间,并且可以通过索引进行快速访问。
  2. 零基索引:Java数组的索引是从0开始,即第一个元素的索引为0,第二次元素的索引为1,以此类推。通过索引,可以访问数组中的特定元素。
  3. 固定长度:在创建数组是,需要指定数组的长度。数组的长度在创建后是固定不变的,不饿能动态改变。如果需要存储更多或更少的元素,需要创建一个新的数组。
  4. 同一类型元素:Java数组要求所有元素具有相同的数据类型。例如,一个整数数组只能存储整数类型的元素。
  5. 随机访问:由于数组的元素在内存中连续存储,并且可以通过索引进行访问,所以可以在O(1)的时间复杂度内随机访问数组中的元素。
  6. 长度属性:每个Java数组都有一个 length 属性,用于表示数组的长度,即数组中元素的数量。这个属性实在拆高纳进数组时自动生成的,并且在数组的整个生命周期中保持不变。length是一个存储在数组中的常量。

总的来说,Java数组是一种简单而有效的数据结构,用于存储和访问多个相同类型的元素。它提供了快速的随机访问和固定长度的特性。然而,由于数组长度固定且连续存储,插入和删除操作相对较慢,需要重新分配内存和复制元素。如果需要频繁进行插入和删除操作,需要考虑其他数据结构,如ArrayList或LinkedList。

🎨 一,一维数组

👣 1.1,概念

数组(Array),是多个相同类型数据按一定顺序排列的集合, 并使用一-个名字命名,并通过编号的方式对这些数据进行统一管理。

变量:在内存中开辟一块空间。

数组:也是变量,在内存中开辟遗传连续的内存空间。数组长度一旦确定,就不能修改。

拓展:

  • 局部变量
    • 基本数据类型
      • 如:int i = 1; char a = ‘a’; 存储在栈里边。
    • 引用数据类型
      • 如: int[] arr = new int[4]; 引用变量arr存储在栈里面,引用的对象存储在堆里面。

数组的常见概念:

  • 数组名

  • 下标(或索引)

  • 元素

  • 数组的长度

    image-20230719103453981

📢 1.2,基本用法

1,语法格式

  • 格式1:数据类型[]数组名,属于只创建了数组引用名,并未在内存创建数组空间

    int[] arr1; //声明
    arr1 = new int[4]; // 数组长度一旦确定,不可改变
    
  • 格式2:数据类型[]数组名称= new数据类型[数组长度];

    double[] arr2 = new double[5];
    
  • 格式3:数据类型[]数组名称= {数组内容1,数组内容2,数组内容3…数组内容n};

    int[] arr3 = {1,2,3,4};
    
  • 格式4:数据类型[]数组名称= new数据类型[]{内容1,内容2,内容…内容n}

    int[] arr4 = new int[]{1,2,3,4};
    

2,代码

    public static void main(String[] args) {
        // 1,声明数组
        // 1.1,先声明,后开辟空间:数据类型 [] 数组名称;
        int[] arr1; //声明
        arr1 = new int[4]; // 开辟空间 , 数组长度一旦确定,不可以改变
        
        // 1.2 声明数组的同时开辟空间
        double[] arr2 = new double[5];
        System.out.println(arr1);
        System.out.println(arr2);
        
        // 1.3 声明数组
        String[] arr3; // 只有声明,没有在内存中开辟数组空间
//        System.out.println(arr3);
        // 1.4 声明数组的同时赋值
        int[] arr4 = new int[]{1,2,3,4};
        System.out.println(arr4);
        
        // 1.5 声明数组的同时赋值
        // 此时数组的长度由赋值的个数决定
        double[] arr5 = {1,2,34,5,7};
    }

💻 1.3,内存结构

JMM : JVM的内存结构

int[] arr1; 的内存状态

image-20230719113211488

arr1 = new int[4];  的内存状态

image-20230719113507467

image-20230719113542057

下列代码的内存结构

int[] arr1 = new int[5];
arr1[0] = 10;
arr1[2] = 20;
String[] arr2 = new String[3];
arr2[1] = "刘杰";
arr2 = new String[5];

请添加图片描述

拓展:

JMM(Java内存模型)是Java平台定义的一种规范,用于描述多线程并发访问共享内存时的行为。JMM定义了线程如何与主内存和工作内存进行交互,以及如何同步和协调共享数据的访问。

以下是JMM的一些关键概念:

  1. 主内存(Main Memory):主内存是Java程序中所有线程共享的内存区域。所有变量(包括实例变量,静态变量和数组元素)都是存储在主内存中。
  2. 工作区域(Working Memory):工作内存是每个线程独立拥有的内存区域。线程的工作内存包含了主内存中的部分变量副本,用于线程的实际操作和计算。
  3. 内存间的交互:线程对共享变量的操作必须在主内存和工作内存之间进行交互。当一个线程需要使用共享变量时,它首先将变量从内存复制到自己的工作内存中。在工作内存中对变量进行操作后,线程可以选择将变量的最新值刷新回主内存。
  4. 原子性,可见性和有序性:JMM定义了操作的原子性,可见性,有序性的规则。原子性指一个操作时不可分割的,要么全部执行成功,要么不执行。可见性指一个线程对共享变量的修改对其他线程是可见的。有序性指程序的执行循序必须符合一定的规则,不能出现乱序执行的情况。
  5. 同步操作:JMM提供了一些同步操作来确保线程之间的协调和共享数据的一致性,如synchronize关键字,volatile关键字,Lock接口等。

JMM的目标是提供一个统一的内存模型,使得程序在不同的平台和编译器上都能以一致的方式工作。通过JMM的规范,开发则可以编写正确且线程安全的多线程程序。了解JMM的规则和特性对于编写高效且正确的多线程代码非常重要。

image-20230719134932533

📝 1.4,练习

从键盘读入学生成绩,找出最高分,并输出学生成绩等级。

  • 成绩>=最高分-10等级为’A’
    成绩>=最高分20等级为’B’
    成绩>=最高分30等级为C’
    其余等级为’D’

image-20230719125722408

    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入学生人数:");

        int persons = scanner.nextInt();

        int[] scores = new int[persons];
        System.out.println("请输入" + persons + "个学生的分数");
        // 定义一个最大值变量
        int maxScore = 0;
        for (int i = 0; i < scores.length; i++) {
            scores[i] = scanner.nextInt();
            if (scores[i] > maxScore){
                maxScore = scores[i];
            }
        }

        System.out.println("分数的最大值为:" + maxScore);

        for (int i = 0; i < scores.length; i++) {
//            switch (scores[i]){
//                case scores[i] > maxScore - 10 :
//
//            }
            if (scores[i] >= maxScore - 10){
                System.out.println("分数为" + scores[i] + "的等级为A");
            } else if (scores[i] >= maxScore - 20) {
                System.out.println("分数为" + scores[i] + "的等级为B");
            }else if (scores[i] >= maxScore - 30) {
                System.out.println("分数为" + scores[i] + "的等级为C");
            }else {
                System.out.println("分数为" + scores[i] + "的等级为D");
            }
        }
    }

🎁 二,二维数组

🏭 2.1,概念

对于二维数组的理解,我们可以看成是一维数组array1又作为另一个一维数组array2的元素而存在。其实,从数组底层的运行机制来看,没有多维数组的存在。

1,语法格式

格式1:
int[][] arr = new int[3][2];
  • 定义了名称为arr的二维数组
  • 二维数组中有3个以为数组
  • 每个一维数组中有2个元素
  • 一维数组的名称分别为arr[0],arr[1],arr[2]
  • 给第一个一维数组1脚标位赋值为78写法是:arr[0][1] = 78
格式2:
int[][] arr = new int[3][];
  • 二维数组中有3个一维数组。
  • 每个一维数组都是默认初始化值null(注意:区别于格式1)
  • 可以对这三个一维数组分别进行初始化arr[0] = new int[3]; arr[i] = new int[i]; arr[2] = new int[2];

注:int[][] arr = new int[][3]是非法的

格式3:
int[][] arr = new int[][]{{3,4,2},{3,4},{9,0,3,4}}
  • 定义一个名称为arr的二维数组,二维数组中有三个以为数组
  • 每个一个数组中具体元素也都已初始化
  • 第一个一维数组arr[0] = {3,4,2};
  • 第二个一维数组arr[0] = {3,4};
  • 第三个一维数组arr[0] = {9,0,3,4};
  • 第三个一维数组的长度表示方式:arr[2].length;

🐾 2.2,二维数组的使用

public static void main(String[] args) {
        //1、声明二维数组
        //1.1声明数组的同时开辟空间:数据类型[门][]数组名称=new 数据类型[行] [列] ;
        int[][] nns = new
                int[3][4];
        //列的值:可以有:所有的行的列的个数相同,相当于矩形
        //可以省略, 每一-行都是nu11,需要自己去开辟空间--了解
        //1.2先声明数组再开辟空间
        int[][] nns2;
        nns = new int[3][4];
        //1.3声明数组的同时赋初值:行列的长度由赋值的个数决定了
        int[][] nns3 = new int[][]{{1, 2}, {3, 4}, {5, 6}};

        //1.4
        int[][] nns4 = new int[3][];
        nns4[0] = new int[]{1, 2};
        System.out.println(Arrays.toString(nns4));
        System.out.println(Arrays.toString(nns4[0]));

        //2、赋值
        //使用循环赋值
        for (int i = 0; i < nns.length; i++) {
            for (int j = 0; j < nns[i].length; j++) {
                nns[i][j] = i + j + 4;
            }
        }
        //3、取值
        for (int i = 0; i < nns3.length; i++) {
            for (int j = 0; j < nns3[i].length; j++) {
                System.out.print(nns3[i][j] + " ");
            }
            System.out.println();
        }
    }

🎉 2.3,内存结构

image-20230719142738264

🏭 三,数组中常见的算法

📐 3.1,二分查找

数组的复制,反转,查找(线性查找,二分查找)

public static void main(String[] args) {
        String[] arr = new String[]{"JJ","DD","MM","BB","GG","AA"};

        // 数组的复制(区别于数组变量的赋值:arr1 = arr)
        String[] arr1 = new String[arr.length];
        for (int i = 0; i < arr.length; i++) {
            arr1[i] = arr[i];
        }
        // 遍历
        for (int i = 0; i < arr1.length; i++) {
            System.out.println(arr1[i]);
        }
        System.out.println("=======================");

        // 数组的反转
        for (int i = 0,j = arr.length-1; i < j; i++,j--) {
            String temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
        // 遍历
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
        System.out.println("=======================");
        // 查找(或搜索)
        // 线性查找
        String dest = "BB";

        boolean isFlag = true;
        for (int i = 0; i < arr.length; i++) {
            if (dest.equals(arr[i])){
                System.out.println("找到了指定元素" + dest + "下标为:" + i);
                isFlag = true;
                break;
            }
        }
        if (isFlag){
            System.out.println("没有找到目标元素");
        }
        System.out.println("=======================");
        // 二分查找
        // 前提:所要查找的数组必须有序
        int [] arr2 = new int[]{-98,-34,2,34, 54,66,79,105,210 ,333};

        // 目标值
        int dest1 = 34;
        int start = 0;  // 开始下标
        int end = arr2.length-1; //结束下标
        boolean isFlage1 = true;  // 是否找到的标识
        while (start <= end) {
            int min = (start + end)/2;

            if (arr2[min] == dest1){
                System.out.println("找到了目标元素:" + dest1 + "下标为:" + min);
                isFlage1 = false;
                break;
            } else if (dest1 > arr2[min]) {
                start = min + 1;
            } else {
                end = min - 1;
            }
        }

        if (isFlage1){
            System.out.println("没有找到目标元素");
        }

    }

image-20230719151647263

💬 3.2,排序算法

衡量排序算法的优劣:

  • 时间复杂度:分析关键字的比较次数和记录的移动次数。
  • 空间复杂度:分析排序算法中需要多少辅助内存
  • 稳定性:若两个记录A和B的关键字值相等,但排序后A,B的先后次序保持不变,则称这种排序算法是稳定的。

💖 3.3,冒泡排序

c0e12b5830cd2a91e9c52b298ec194a5

    public static void main(String[] args) {
        int[] arr = new int[]{43,32,76,-98,0, 64,33,-21,32,99};

        for (int i = 0; i < arr.length - 1; i++) {
            for (int j = 0; j < arr.length -1 - i; j++) {
                if (arr[j] > arr[j+1]){
                    int temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
        }

        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + "\t");
        }


    }

🚜 3.4,Arrays工具类

public static void main(String[] args) {
        // 1,boolean equals(int[] a,int[] b) :判断两个数组是否相等
        int[] arr1 = {1, 2, 3, 4};
        int[] arr2 = {1, 3, 2, 4};
        boolean isEquals = Arrays.equals(arr1, arr2);
        System.out.println(isEquals);

        // 2, String toString(int[] a) : 数除数组信息。
        System.out.println(Arrays.toString(arr1));

        // 3, void fill(int[] a,int val) : 将指定值填充到数组之中
        // 将指定的int值赋给指定的int数组的每个元素。
        Arrays.fill(arr1,10);
        System.out.println(Arrays.toString(arr1));

        // 4, void sort(int[] a) : 对数组进行排序
        Arrays.sort(arr2);
        System.out.println(Arrays.toString(arr2));

        // 5, int binarySearch(int[] a, int key)
        int[] arr3 = new int[]{43,32,76,-98,0, 64,33,-21,32,99};
        int index = Arrays.binarySearch(arr3, 0);
        if (index >= 0){
            System.out.println("找到了目标值" + "下标为:" + index);
        } else {
            System.out.println("未找到");
        }
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/39536.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

DB-Engines排名公布 GBASE南大通用入围国产数据库TOP 3

什么是DB-Engines排名&#xff1f; DB-Engines排名是数据库领域的流行度榜单&#xff0c;它对全球范围内的419款数据库&#xff08;截至2023年7月&#xff09;进行排名&#xff0c;每月更新一次&#xff0c;排名越靠前&#xff0c;则表示越流行。在很多技术选型的场合&#xf…

亚信科技荣任「DBL电信行业工作组」副组长单位,AntDB数据库连年入选《中国数据库产品图谱》

日前&#xff0c;“2023可信数据库发展大会”在京圆满召开。亚信科技凭借自研的电信级核心交易数据库AntDB在通信行业15年的技术积累和行业贡献&#xff0c;成功当选为数据库应用创新实验室&#xff08;DBL&#xff09;电信行业工作组副组长单位。AntDB数据库连续两年入选《全球…

Stable Diffusion - 编辑生成 (OpenPose Editor) 相同人物姿势的图像

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/131818943 OpenPose Editor 是 Stable Diffusion 的扩展插件&#xff0c;可以自定义人物的姿势和表情&#xff0c;以及生成深度、法线和边缘图等信…

学会在重装系统前如何备份软件,再也不怕失去珍贵的应用!

​Windows系统是电脑的重要组成部分&#xff0c;它不仅提供了友好的用户界面&#xff0c;还承担着许多关键的功能和任务&#xff0c;为我们提供了一个稳定、安全和效率的工作环境&#xff0c;使我们能够充分发挥电脑的潜力&#xff0c;优化工作效率和生活品质。 随着系统使…

浅谈测试工程化 - 以并发自动化框架为例

目录 前言 测试工程化 一、测试需求分析 二、测试设计 三、测试实现和落地 四、测试维护 扩展 前言 测试工程化是指将软件测试过程中的各个环节进行自动化和标准化&#xff0c;以提高测试效率、质量和可持续性。在测试工程化中&#xff0c;使用并发自动化框架是一个重要…

kotlin中使用Room数据库(包含升降级崩溃处理)

目录 1.导入依赖库 2.数据实体类 3.数据访问对象 (DAO) 4.数据库类 5.调用DAO里面的“增、删、改、查”方法 6.数据库升降级处理 升级&#xff08;保存数据库历史数据&#xff09;&#xff1a; 升级&#xff08;不保存数据库历史数据&#xff09;&#xff1a; 降级&…

NUXT3学习笔记2

1、配置Ant design Vue (两个安装方式随便选一种&#xff0c;yarn会安装的更快) npm i ant-design-vue --save yarn add ant-design-vue 2、使⽤的 Vite&#xff0c;你可以使⽤ unplugin-vue-components 来进⾏按需加载。 yarn add unplugin-vue-components --save 在nuxt.…

【iOS】探索ARC的实现

ARC ARC在编译期和运行期做了什么&#xff1f;编译期&#xff1a;运行期&#xff1a;block 是如何在 ARC 中工作的&#xff1f; ARC的实现分析__strong自己生成并持有storeStrongSideTable散列表objc_retainobjc_releasesidetable_releaseretainCount非自己生成并持有 ARC在编译…

python3GUI--仿win10任务管理器By:PyQt5(附UI源码)

文章目录 一&#xff0e;前言二&#xff0e;展示1.主界面1.进程2.性能1.CPU2.内存 3.简略信息4.详细信息5.新建任务 三&#xff0e;设计思路1.UI设计1.主界面1.进程2.性能3.详细信息4.新建任务5.图表信息组件 2.代码整体设计1.项目设计心得2.项目设计其他心得 3.其他心得 四&am…

华为无线ac+ap旁挂二层组网常用配置案例

AC控制器理解配置步骤&#xff1a; capwap source interface Vlanif 100 //源IP回包地址 wlan ssid-profile name test //新建个模版名称为test ssid test //wifi名称 wlan security-profile name test //建立安全模版也叫test security wpa-wpa2 psk pass-phrase admin123 a…

【PDFBox】PDFBox操作PDF文档之读取指定页面文本内容、读取所有页面文本内容、根据模板文件生成PDF文档

这篇文章&#xff0c;主要介绍PDFBox操作PDF文档之读取指定页面文本内容、读取所有页面文本内容、根据模板文件生成PDF文档。 目录 一、PDFBox操作文本 1.1、读取所有页面文本内容 1.2、读取指定页面文本内容 1.3、写入文本内容 1.4、替换文本内容 &#xff08;1&#xf…

在 Amazon 上以高可用性模式实现 Microsoft SQL 数据库服务现代化的注意事项

许多企业都有需要 Microsoft SQL Server 来运行关系数据库工作负载的应用程序&#xff1a;一些应用程序可能是专有软件&#xff0c;供应商可使用它强制 Microsoft SQL Server 运行数据库服务&#xff1b;其他应用程序可能是长期存在的、自主开发的应用程序&#xff0c;它们在最…

XUbuntu22.04之vim无法复制内容到系统(一百八十四)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

将大模型集成到语音识别系统中的例子

概述 本文旨在探索将大型语言模型&#xff08;LLMs&#xff09;集成到自动语音识别&#xff08;ASR&#xff09;系统中以提高转录准确性的潜力。 文章介绍了目前的ASR方法及其存在的问题&#xff0c;并对使用LLMs的上下文学习能力来改进ASR系统的性能进行了合理的动机论证。 本…

VIM文本如何复制到系统剪切板?

今天从vim上用鼠标复制代码&#xff0c;发现把VIM当中的行号也复制进去了&#xff0c;就很麻烦&#xff0c;于是简单研究了下&#xff0c;如果vim支持clipboard的话就比较好办&#xff0c;具体支持与否&#xff0c;使用命令查看&#xff1a; vim --version | grep "clipb…

Android系统启动流程分析

当按下Android系统的开机电源按键时候&#xff0c;硬件会触发引导芯片&#xff0c;执行预定义的代码&#xff0c;然后加载引导程序(BootLoader)到RAM&#xff0c;Bootloader是Android系统起来前第一个程序&#xff0c;主要用来拉起Android系统程序&#xff0c;Android系统被拉起…

基于Java+Swingl实现拼图游戏

基于JavaSwingl实现拼图游戏 一、系统介绍二、效果展示三、其他系统实现四、获取源码 一、系统介绍 拼图游戏是一个简单的小程序&#xff0c;游戏规则如下&#xff1a;将一张大图分成9张小图&#xff0c;然后任意挑8张图&#xff0c;随意放在3行3列的矩阵中。 通过点击鼠标移动…

Maven 项目构建生命周期

Maven 项目构建生命周期 一句话: Maven 构建生命周期描述的是一次构建过程经历了多少个事件 生命周期的3 大阶段 clean 清理工作 default 核心工作&#xff0c;例如编译&#xff0c;测试&#xff0c;打包&#xff0c;部署等 site 产生报告&#xff0c;发布站点等 生命周期…

react和vue2/3父子组件的双向绑定(sync、emit、v-model)

目录 Vue .sync&#xff08;2.3.0&#xff09; $emit &#xff08;2.3后&#xff09; 自定义组件的 v-model 2.2.0 v-modelemits(3.0取消了.sync) React 父组件回调函数 相关基础 框架 MVC &#xff08;Model View Controller&#xff09;/MVP&#xff08;Model View…

RHCSA——Linux网络、磁盘及软件包管理

ZY目录 Linux操作系统讲解&#xff1a;一、网络管理1、NetworkManager1.1、nmtui界面&#xff1a;1.2、nmcli使用方法&#xff1a; 2、配置网络2.1、网络接口以及网络连接2.2、配置方法&#xff1a;2.3、ping命令&#xff1a;2.4、wget命令 二、磁盘管理2.1、分区得两种格式2.1…