Java数组类型

news2024/9/24 1:16:13

目录

一维数组

一维数组的声明

动态数组初始化

静态数组的初始化

一维数组的访问

数组长度

数组的遍历操作

数组中的默认值

数组中的两个常见异常

越界访问异常ArrayIndexOutOfBoundsException

空指针异常NullPointerException

Java中的内存划分

一维数组的内存分析

二维数组

二维数组的声明

动态初始化

静态初始化

二维数组的访问

二维数组的内存分析


一维数组

一维数组的声明

在Java中,数组属于引用数据类型,并且也属于一种对象,所以需要使用new创建对象

动态数组初始化

在Java中,动态初始化方式有两种,但是这两种没有本质的区别

 1. 数据类型[] 数组名 = new 数据类型[元素个数]
 2. 数据类型 数组名[] = new 数据类型[元素个数]
 ​
 // 动态数组初始化只会为数组开辟对应的空间

需要注意的是,与C/C++语言不同,赋值符左侧的括号中不给元素个数,而在赋值符右侧的括号中给元素个数,并且需要满足赋值符左右两边的数据类型相同

 // 动态初始化数组
 int arr[] = new int[5];// 声明int类型数组arr
 String arr1[] = new String[5];// 声明String类型数组arr1

静态数组的初始化

静态初始化的方式也有两种

 1. 数据类型[] 数组名 = new 数据类型[]{元素1, 元素2, 元素3, 元素4, ...}
 2. 数据类型 数组名[] = new 数据类型[]{元素1, 元素2, 元素3, 元素4, ...}
 ​
 // 赋值符右侧的括号中可以不写元素个数
 // 静态初始化会在开辟空间时存入提供的数据

但是上面的方法在数组元素过多时会显得冗长,所以可以简写成下面的形式

 1. 数据类型[] 数组名 = {元素1, 元素2, 元素3, 元素4, ...}
 2. 数据类型 数组名[] = {元素1, 元素2, 元素3, 元素4, ...}

尽管可以简写,但是本质还是第一种中的两种方式

 // 静态初始化数组
 int arr2[] = {1, 2, 3, 4, 5};
 String arr3[] = {"字符串1", "字符串2"};

一维数组的访问

数组长度

在Java中,需要获取数组的长度可以使用数组的length属性

 package com.epsda.array;
 ​
 /**
  * ClassName: test_array
  * Package: com.epsda.array
  * Description:
  *
  * @author 憨八嘎
  * @version v1.0
  */
 public class test_array {
     public static void main(String[] args) {
         int arr[] = new int[5];
         int length = arr.length;
         System.out.println("length = " + length);
     }
 }
 ​
 输出结果:
 length = 5

注意,在Java中,数组的长度是数组的属性,而不是方法,不同于C/C++中的容器长度是size()

数组的遍历操作

package com.epsda.array;
 ​
 /**
  * ClassName: test_array
  * Package: com.epsda.array
  * Description:
  *
  * @author 憨八嘎
  * @version v1.0
  */
 public class test_array {
     public static void main(String[] args) {
         int arr[] = new int[5];
 ​
         // 插入数据
         for (int i = 0; i < arr.length; i++) {
             arr[i] = i;// 插入数据
             System.out.print(arr[i] + " ");
         }
     }
 }
 ​
 输出结果:
 0 1 2 3 4

数组中的默认值

在Java中,如果数组开辟了空间,但是并没有放入实际值,那么Java会根据对应的数据类型提供默认值,根据数据类型,有以下默认值:

  1. int/byte/short:默认值为0

  2. double/float:默认值为0.0

  3. char'\u0000'(代表空白字符,其整型值为0)

  4. 引用数据类型:null

  5. 布尔类型:false

数组中的两个常见异常

越界访问异常ArrayIndexOutOfBoundsException

越界访问异常出现在数组的索引超出合法界限

 public class Test_array {
     public static void main(String[] args) {
         int[] arr = new int[3];
         arr[0] = 100;
         arr[1] = 200;
         arr[2] = 300;
         //arr[3] = 400;// 索引3不再数组合法下标范围内
 ​
         //arr[-1] = 1000;// 索引-1不再数组合法下标范围内
 ​
         for (int i = 0; i <= arr.length; i++) {
             System.out.println(arr[i]);// 索引3不再数组合法下标范围内
         }
     }
 }
 ​
 报错结果:
 Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
     at com.epsda.array.test_array.main(test_array.java:12)

空指针异常NullPointerException

空指针异常一般出现在数组名为null,但是调用了其属性或者方法

public class Test_array {
    public static void main(String[] args) {
        int[] arr = new int[3];
        arr = null;// 将数组名改为null
        System.out.println(arr.length);// 数组名指向不存在的地址,但是访问了length属性
    }
}

报错结果:
Exception in thread "main" java.lang.NullPointerException
	at com.epsda.array.test_array.main(test_array.java:5)

Java中的内存划分

在Java中,一共有五种内存

  1. 栈(Stack):Java中的方法在运行时都会进栈,也称栈帧空间

  2. 堆(Heap):每次使用new创建对象,都会在堆内存中开辟空间,并为此空间自动分配一个地址值。堆中的数据根据对应的类型都有对应的默认值

  3. 方法区(Method Area):代码暂存区,记录了类的信息以及方法的信息,在方法加载到内存之前,会先将方法和类放置在方法区

  4. 本地方法栈:专门运行native方法,本地方法为对Java功能的扩充

  5. 寄存器

一维数组的内存分析

同C/C++中一样,在Java中,数组名代表数组的地址

package com.epsda.array;

/**
 * ClassName: test_array
 * Package: com.epsda.array
 * Description:
 *
 * @author 憨八嘎
 * @version v1.0
 */
public class test_array {
    public static void main(String[] args) {
        int arr[] = new int[5];
        System.out.println("arr = " + arr);
        }
    }
}

输出结果:
arr = [I@154617c

根据前面的Java内存划分,可以分析数组在内存中的结构,以下面的代码为例:

package com.epsda.array;

/**
 * ClassName: test_array
 * Package: com.epsda.array
 * Description:
 *
 * @author 憨八嘎
 * @version v1.0
 */
public class test_array {
    public static void main(String[] args) {
        // 动态初始化
        int arr[] = new int[5];
        // 尽管没有存入数据,但是有空间和默认值
        System.out.println("arr.length = " + arr.length);
        // 插入数据
        for (int i = 0; i < arr.length; i++) {
            arr[i] = i;
            System.out.print(arr[i] + " ");
        }
    }
}

内存中如下:

首先编译为.class文件后放入方法区等待方法加载到栈上

接着执行栈上的方法

赋值之后为:

同样可以推广到多个数组占用不同空间的情况以及两个数组名指向同一块空间的情况

所以Java中的一维数组可以理解为下面的C语言代码

#include <stdio.h>

int main()
{
    // 动态初始化数组
    int* arr = (int*)malloc(sizeof(int) * 5);
    // 对应int[] arr = new int[5]
    return 0;
}

二维数组

二维数组的声明

在Java中,二维数组同一维数组一样,使用new关键字创建数组对象

动态初始化

1. 数据类型[][] 变量名 = new 数据类型[二维数组长度][每一个一维数组长度]
2. 数据类型 变量名[][] = new 数据类型[二维数组长度][每一个一维数组长度]
    
// 也可以写成下面的形式,但是不够美观
数据类型[] 变量名[] = new 数据类型[二维数组长度][每一个一维数组长度]

注意,如果动态初始化一个二维数组时,没有给每一个一维数组长度值,那么此时在堆上只会开辟一个二维数组,而不会在二维数组的空间内开辟一维数组,因为一维数组的长度不确定

如果给定了每一个一维数组长度,那么这个二维数组和C语言的二维数组相同,类似于一张整齐的表格,但是注意C语言的普通二维数组是开辟在栈空间的

静态初始化

1. 数据类型[][] 变量名 = new 数据类型[][]{{元素1,元素2,...}, {元素1,元素2,...}, {元素1,元素2,...}}
2. 数据类型 变量名[][] = new 数据类型[][]{{元素1,元素2,...}, {元素1,元素2,...}, {元素1,元素2,...}}

同样可以简写为

1. 数据类型[][] 变量名 = {{元素1,元素2,...}, {元素1,元素2,...}, {元素1,元素2,...}}
2. 数据类型 变量名[][] = {{元素1,元素2,...}, {元素1,元素2,...}, {元素1,元素2,...}}

静态初始化是根据一维数组个数和一维数组元素个数推演出二维数组的长度,所以每一个一维数组长度可以不同,类似于C语言中使用动态内存函数开辟的模拟二维数组,例如下面的C语言代码

#include <stdio.h>

int main()
{
 // 定义二维数组的长度,二维数组中每一个元素为int*类型
 int* arr = (int*)malloc(sizeof(int*)*元素个数);
 // 定义每一个一维数组的长度,一维数组中每一个元素为int类型
 arr[0] = int(*)malloc(sizeof(int)*元素个数);
 arr[1] = int(*)malloc(sizeof(int)*元素个数);
 arr[2] = int(*)malloc(sizeof(int)*元素个数);
 //...
 return 0;
}

二维数组的访问

二维数组的访问与一维数组基本一致

package com.epsda.array;

/**
 * ClassName: test_array
 * Package: com.epsda.array
 * Description:
 *
 * @author 憨八嘎
 * @version v1.0
 */
public class test_array {
    public static void main(String[] args) {
		// 静态初始化
        int arr[][] = {{1, 2, 3}, {1, 2}, {1, 2, 3, 4, 5}};
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                System.out.print(arr[i][j] + " ");
            }
            System.out.println();
        }
    }
}

输出结果:
1 2 3 
1 2 
1 2 3 4 5

二维数组的内存分析

同样可以分析出二维数组在内存上的结构:

package com.epsda.array;

/**
 * ClassName: test_array
 * Package: com.epsda.array
 * Description:
 *
 * @author 憨八嘎
 * @version v1.0
 */
public class test_array {
    public static void main(String[] args) {
		// 静态初始化
        int arr[][] = {{1, 2, 3}, {1, 2}, {1, 2, 3, 4, 5}};
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                System.out.print(arr[i][j] + " ");
            }
            System.out.println();
        }
    }
}

类比C语言代码如下:

#include <stdio.h>

int main()
{
    // 定义二维数组的长度,二维数组中每一个元素为int*类型
    int* arr = (int*)malloc(sizeof(int*)*3);
    // 定义每一个一维数组的长度,一维数组中每一个元素为int类型
    arr[0] = int(*)malloc(sizeof(int)*3);
    arr[1] = int(*)malloc(sizeof(int)*2);
    arr[2] = int(*)malloc(sizeof(int)*5);
    
    // 上面的代码相当于int arr[][] = new arr[3][]
    // arr[0] = new int[3]
    // arr[0] = new int[2]
    // arr[0] = new int[5]
    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pdf怎么加密码怎么设置密码?pdf加密码的几种设置方法

在数字化时代&#xff0c;信息的保密性与安全性日益成为我们不可忽视的重要环节。尤其对于包含敏感信息或个人隐私的PDF文档而言&#xff0c;保护其免受未授权访问的侵扰显得尤为重要。通过为PDF文档设置密码保护&#xff0c;我们能够筑起一道坚实的防线&#xff0c;确保只有拥…

危化品安全生产风险监测预警系统的构建与实施

引言 1、背景与重要性 在现代工业生产中&#xff0c;危险化学品&#xff08;简称“危化品”&#xff09;的使用和管理日益广泛。它们在化工、制药、能源等多个领域中扮演着不可或缺的角色。然而&#xff0c;危化品因其固有的易燃、易爆、腐蚀、有毒等特性&#xff0c;一旦管理…

Git使用错误分析

一.fatal: Pathspec is in submodule 我做了这样的错误操作&#xff0c;在一个仓库下的一个子目录&#xff0c;执行了git init 创建了一个子仓库&#xff0c;然后想删掉这个子仓库&#xff0c;就只删除了该子目录下的.git文件夹&#xff0c;而没有删除缓存&#xff0c;执行如下…

java: Internal error in the mapping processor: java.lang.NullPointerExceptio

java: Internal error in the mapping processor: java.lang.NullPointerExceptio 解决办法&#xff1a;idea里面加参数-Djps.track.ap.dependenciesfalse即可

Java程序设计:Java 网络聊天室客户端

相关网络编程前两篇文章&#xff1a;Java程序设计&#xff1a;Java网络编程实验 服务端部分见上一篇文章&#xff1a;Java程序设计&#xff1a;Java网络聊天室服务端 目录 1 实验名称 2 实验目的 3 实验源代码 4 实验运行结果图 5 总结 1 实验名称 Java 网络聊天室客户端 …

纳米软件的电源模块测试系统有什么功能和优势?

纳米软件电源模块自动化测试系统主要实现针对单路进4路出和单路进2路出的非隔离DCDC电源模块进行测试。本次方案包含对以下15个测试项目的自动化测试&#xff0c;分别为输入电压范围VIN的最大值最小值、输出电压范围VOUT的最大值最小值、输出纹波VOPP、电压调整率SV、负载调整率…

基于SpringBoot+Vue的学院商铺管理系统(带1w+文档)

基于SpringBootVue的学院商铺管理系统(带1w文档) 基于SpringBootVue的学院商铺管理系统(带1w文档) 互联网概念的产生到如今的蓬勃发展&#xff0c;用了短短的几十年时间就风靡全球&#xff0c;使得全球各个行业都进行了互联网的改造升级&#xff0c;标志着互联网浪潮的来临。在…

[VBA]使用VBA在Excel中 操作 形状shape 对象

excel已关闭地图插件,对于想做 地图可视化 的,用形状来操作是一种办法,就是要自行找到合适的 地图形状,修改形状颜色等就可以用于 可视化展示不同省市销量、人口等数据。 引言 在Excel中,通过VBA(Visual Basic for Applications)可以极大地增强数据可视化和报告自动化…

Spring Cache在业务系统中最佳实践教程详解及实现原理

1.概述 接着之前总结的如何保证MySQL与Redis数据同步一致性一文中提到在业务代码中一般采用旁路缓存策略方式实现同步&#xff0c;Spring Cache 就是 Spring Framework 基于该策略方式提供的一种缓存抽象&#xff0c;可以帮助开发者简化缓存的使用过程。它支持多种缓存实现&am…

【STM32】DMA数据转运(存储器到存储器)

本篇博客重点在于标准库函数的理解与使用&#xff0c;搭建一个框架便于快速开发 目录 DMA简介 DMA时钟使能 DMA初始化 转运起始和终止的地址 转运方向 数据宽度 传输次数 转运触发方式 转运模式 通道优先级 开启DMA通道 DMA初始化框架 更改转运次数 DMA应用实例-…

Google Mock 和 Google Test编写单元测试入门(环境配置、简单执行)

文章目录 环境的配置方法1&#xff1a;从源代码构建第一步&#xff1a;克隆库的源代码第二步&#xff1a;构建库 方法 2&#xff1a;使用 CMake 的 FetchContent示例 CMakeLists.txt 项目的创建项目结构CMakeLists.txt (根目录)main.cpp (示例程序)tests/CMakeLists.txt (测试部…

更换CentOS中docker的镜像源

如果docker pull镜像出现&#xff1a; error pulling image configuration: download failed after attempts6: dial tcp 173.236.182.137:443: i/o timeout 如果是阿里云&#xff0c;我们进入阿里云官网&#xff1a; 阿里云开发者社区-云计算社区-阿里云 然后点击产品&#…

医疗器械重大网络安全更新是什么?有何价值?

医疗器械重大网络安全更新是指那些影响到医疗器械的安全性或有效性的网络安全更新。这类更新通常涉及重大网络安全功能的变更&#xff0c;旨在提升医疗器械在网络环境中的安全性和稳定性。 一、医疗器械重大网络安全更新的价值 保障患者安全&#xff1a;医疗器械在处理患者数据…

开发学习日记1

用这个系列博客记录下学习开发的一些小收获 git的使用&#xff1a; 说来惭愧&#xff0c;学到了大二&#xff0c;git的使用还是一团糟&#xff0c;记录一下如何使用git进行团队合作开发 当要加入其他人的项目时首先你要创建自己的分支&#xff08;克隆一下其他分支&#xff…

处理Pandas中的JSON数据:从字符串到结构化分析

在数据科学领域&#xff0c;JSON作为一种灵活的数据交换格式&#xff0c;被广泛应用于存储和传输数据。然而&#xff0c;JSON数据的非结构化特性在进行数据分析时可能会带来一些挑战。本文将指导读者如何使用Pandas库将DataFrame中的JSON字符串列转换为结构化的表格数据&#x…

mac 容器化 安装docker es | redis

brew install docker 安装桌面版 docker-destop 在桌面端搜索对应的es 版本 docker 安装elasticsearch 先确保java 已安装 oracle-jdk17 LTS 版本 报错&#xff1a;ERROR: [1] bootstrap checks failed. You must address the points described in the following [1] li…

【esp32】secure boot (安全启动)配置

简介 Secure Boot&#xff0c;即安全启动&#xff0c;是一种确保在一个平台上运行的程序的完整性的过程或机制。它的主要作用是在固件和应用程序之间建立一种信任关系&#xff0c;从而保护操作系统免受恶意攻击。 工作原理 签名验证&#xff1a;Secure Boot使用公钥/私钥对来…

【0304】psql 执行“VACUUM FULL”命令的背后实现过程

1. 概述 在前面讲解Postgres内核中解析器相关(【0297】Postgres内核之 INSERT INTO 原始解析树 转 Query 树 (1))内容时,曾提到过,Postgres内核大致将用户下发的SQL语句分为三大类,这里的VACUUM FULL属于CMD_UTILITY; 因此直接调用utility.c(实用程序)中的对应函数。…

javaEE(2)

一. 过滤器 作用:拦截web服务器向后端发送的数据,使请求地址在到达servlet之前进入到指定的过滤器中,可以对数据进行一些统一的处理,比如设置编码,权限控制等 使用:创建一个类实现Filter接口,并实现里面的doFilter()方法,过滤器要做的作用主要写在doFilter方法中 public clas…

实训日记day24

python基础 环境部署 [root2 ~]# yum list installed|grep python python-libs.x86_64 2.7.5-68.el7 [root2 ~]# yum -y install epel-release #必须要有epel库 [root2 ~]# yum update #更新yum [root2 ~]# yum -y install net-tools [root2 ~]…