花费数小时,带你学透Java数组,这些常用方法你还记得吗?

news2024/11/16 3:18:40

在这里插入图片描述

推荐学习专栏:Java 编程进阶之路【从入门到精通】


文章目录

  • 1. 数组
  • 2. 一维数组
    • 2.1 声明
    • 2.2 初始化
    • 2.3 使用
  • 3. 二维数组
    • 3.1 声明
    • 3.2 初始化
    • 3.3 使用
  • 4. 数组在内存中的分布
  • 5. 数组常用的方法
    • 5.1 Arrays.toString方法
    • 5.2 Arrays.copyOf方法
    • 5.3 Arrays.copyOfRange方法
    • 5.4 Arrays.sort方法
    • 5.5 Arrays.fill方法
    • 5.6 Arrays.equals方法
    • 5.7 Arrays.binarySearch方法
  • 6. 总结

1. 数组

数组在 Java 编程中是一个非常基础且重要的概念,简单来说,就是把具有相同数据类型的数据存储在地址连续的内存空间中,目的是在程序设计中方便这一类数据的管理。每一个内容都有编号,这个编号从 0 开始,称为数组下标。

数组分为一维数组和二维数组,还有一些和数组相关的重要内容,例如数组中元素的查找,排序等,下面做详细的讲解。

2. 一维数组

2.1 声明

语法:

元素类型[] 变量名称 示例:int[] intArray; 
元素类型 变量名称[] 示例:int intArray[]; 

上面两种声明方法效果相同,还可以在一行声明多个数组:

int[] array1,array2,array3;

2.2 初始化

数组的初始化过程就是给数据分配内存空间的过程,一维数组有两种初始化方法,分别是静态初始化和动态初始化。

静态初始化:声明数组时,对数组初始化,此时知道数组的内容,数组的大小会根据初始值的个数确定长度。

int[] arr = { 1,2,3,4 }; //省略情况
int[] arr = new int[] { 1,2,3,4 };//可以省略new int[]

动态初始化:此时不知道数组的内容,声明时需要指定数组的长度。

int[] arr = new int[10]; //定义10个int类型的数组

同样,我们可以使用如下的方法创建数组:

int[] array1;
array1 = new int[10];
int[] array2;
array2 = new int[]{10, 20, 30};
// 注意省略格式不可以拆分, 否则编译失败
// int[] array3;
// array3 = {1, 2, 3};

2.3 使用

数组的长度属性:在 Java 中,万物皆对象,比如这里的数组,所以我们可以直接获取数组的长度的属性。

示例:

public class Test {
    public static void main(String[] args) {
        int[] arr = new int[]{1, 2, 3, 4, 5};
        int num = arr.length;
        System.out.println(num);
    }
}

数组元素的访问:数组中每个数据都有自己的编号,称为数组下标,数组下标从0开始,我们可以通过数组下标访问数组元素。

示例:

public class Test {
    public static void main(String[] args) {
       int[] arr=new int[]{1,2,3,4,5};
       System.out.println(arr[3]);
    }
}

同时,我们可以使用数组下标修改数组内容:

arr[0]=0;

数组的遍历:在 Java中有两种方式遍历数组,分别是 for 循环和增强 for 循环。

//for循环遍历数组
int[]array = new int[]{10, 20, 30, 40, 50};
for(int i = 0; i < array.length; i++){
    System.out.println(array[i]);
}
//foreach增强循环遍历数组
int[] array = {1, 2, 3};
for (int x : array) {
System.out.println(x);
}
/**
*int x :array表示的是数组中的数据类型+变量名 : 数组名
*/

3. 二维数组

二维数组本质上是以数组作为数组元素的数组,即“数组的数组”。

3.1 声明

语法格式:

类型说明符 数组名[常量表达式][常量表达式]

示例:

int tempArray[][]=new int[][3]; //错误 
int tempArray[][]=new int[3][]; //正确 
int tempArray[][]=new int[3][4]; //正确

3.2 初始化

静态初始化:

public static void main(String[] args) 
{ 
int[][] Arr={{1,2},{3,4},{5,6}}; 
}

动态初始化:

public static void main(String[] args) 
{ 
  int[][] Arr=new int[10][10]; 
  for(int i=0;i<10;i++){ 
     for(int j=0;j<10;j++){ 
     	myArr[i][j] = (i+1)*j; 
  	} 
  } 
}

3.3 使用

二维数组的遍历:这里和一维数组一样,也可以使用 for 循环和 foreach 循环来遍历。

示例:

int[][] arr1 = { {1,2,3},{4,5,6} };
//for
for (int i = 0; i < arr1.length; i++) {
    for (int j = 0; j < arr1[i].length; j++) {
 
         System.out.print(arr1[i][j] + " ");
     }
     System.out.println();
}
    //foreach
    for (int[] x : arr1) {
        for (int y : x) {
            System.out.print(y + " ");
        }
        System.out.println();
    }

4. 数组在内存中的分布

在学习 Java 数组时,我们一定要弄明白其在内存中的分布情况,这对于我们理解数组和使用数组都是十分重要的。为什么我们要说二位数组其实也可以理解为一维数组?

在我们弄清楚了数组在内存中的分布以后,这个问题就不难理解了。

要弄清楚数组在内存中的分布,首先要明白 JVM 内存分布情况。为了方便管理内存,JVM对内存进行了划分,Java 作为一门面向对象语言,实际上JVM 内存是以类和对象的分布划分的。

在这里插入图片描述

上图大致的表示了Java虚拟机运行时的数据区,Java经过编译后产生的.class文件被加载到 JVM 虚拟机里面的本地方法栈里面运行,Java虚拟机栈通常存放局部变量等,堆区是 Java 中最大的一块内存,用来存放对象,且不用手动释放内存,后面我们会学到Java垃圾处理机制,他会自动释放这一部分的内存,方法区用来存放常量,静态变量等。

这里我们主要看堆区和 Java 虚拟机栈。数组作为引用数据类型,在创建时,其实是创建了一个对象的引用,这个引用用来存放数组对象的首地址,例如:

int[] array = new int[]{1, 2, 3, 4};//静态初始化

此时,Java虚拟机栈上会开辟一块内存空间,存放引用数据类型的变量 array ,并且在堆区中开辟了内存空间存放 new 出来的对象,array 指向堆区中的这个对象,即存储对象的地址。如图:

在这里插入图片描述

此时,对于二维数组来说也不难理解,在 Java 虚拟机栈上的引用类型的变量指向了堆区的对象,其实在 Java 中当栈中的变量不在指向该对象时,说明该对象已经不在需要,此时堆区的对应内存就会被释放,无需手动释放。

在这里插入图片描述

5. 数组常用的方法

Java 中的 Arrays 工具类包括了数组常用的一些方法,比如数组的查找,排序,数组的拷贝等方法,而这些方法,是数组中非常基础且重要的部分,同样在我们的程序中也经常使用到。当然在使用之前需要导入:

import java.util.Arrays;

5.1 Arrays.toString方法

作用:将一维数组转化为字符串。如果你要将二维数组转化为字符串,请使用 Arrarys.deepToString

示例:

import java.util.Arrays;

public class Test {
    public static void main(String[] args) {
            int[] array = new int[] { 1,2,3,4 };
            System.out.println(Arrays.toString(array));//[1,2,3,4]
    }
}

5.2 Arrays.copyOf方法

作用:从下标0开始复制数组中的内容到一个新的数组。

示例:

import java.util.Arrays;

public class Test {
    public static void main(String[] args) {
        int[] array = new int[] { 1,2,3,4 };
        int[] ret = Arrays.copyOf(array,2);
        System.out.println(Arrays.toString(ret));//[1,2]
    }
}

5.3 Arrays.copyOfRange方法

作用:和上一个方法相似,这个方法的作用是指定了复制的范围,并且这个方位是左闭右开的范围。

示例:

import java.util.Arrays;

public class Test {
    public static void main(String[] args) {
        int[] array = new int[] { 1,2,3,4 };
        int[] ret = Arrays.copyOfRange(array,2,4);
        System.out.println(Arrays.toString(ret));//[3,4]
    }
}

5.4 Arrays.sort方法

作用:对数组中的元素升序排列。

示例:

import java.util.Arrays;

public class Test {
    public static void main(String[] args) {
        int[] array = new int[] { 4,3,2,1 };
        Arrays.sort(array);
        System.out.println(Arrays.toString(array));//[1,2,3,4]
    }
}

5.5 Arrays.fill方法

作用:把数组内容全部填充为一个值。如果你想填充数组中指定位置的值,请使用重载的方法:

public static void fill(int[] a, int fromIndex, int toIndex, int val)

其中四个参数的含义分别是:要填充的数组,要填充的数组的第一个元素的索引(包括该元素),要填充数组的最后一个元素的索引(不包括该元素),要填充在数组中的值。

示例:

import java.util.Arrays;

public class Test {
    public static void main(String[] args) {
        int[] array = new int[10];
        Arrays.fill(array,10);
        Arrays.fill(array,2,8,20);
        System.out.println(Arrays.toString(array));
    }
}

5.6 Arrays.equals方法

作用:判断连个数组的内容是否相等,调用时需要传入两个需要比较的数组作为参数。

示例:

import java.util.Arrays;

public class Test {
    public static void main(String[] args) {
        int[] arr1 = new int[] { 4,3,2,1 };
        int[] arr2 = new int[] { 1,2,3,4 };
        int[] arr3 = new int[] { 1,2,3,4 };
        System.out.println(Arrays.equals(arr1, arr2));//false
        System.out.println(Arrays.equals(arr2, arr3));//true
    }
}

5.7 Arrays.binarySearch方法

作用:利用二分查找查找数组中的元素,数组中的元素需要升序排列。

import java.util.Arrays;

public class Test {
    public static void main(String[] args) {
        int[] arr1 = new int[] { 1,2,3,4};

        System.out.println(Arrays.binarySearch(arr1, 2));//下标是1
    }
}

6. 总结

理解数组的思想,熟练使用数组的常用方法和明确 Java 数组在内存中的分布情况是 Java 基础篇中十分重要的一部分。


在这里插入图片描述

欢迎订阅学习Java编程进阶之路专栏,专栏文章持续更新!

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

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

相关文章

麦克斯韦(Maxwell)方程组的由来

美国著名物理学家理查德费曼&#xff08;Richard Feynman&#xff09;曾预言&#xff1a;“人类历史从长远看&#xff0c;好比说到一万年以后看回来&#xff0c;19世纪最举足轻重的毫无疑问就是麦克斯韦发现了电动力学定律。” 这个预言或许对吧。可是费曼也知道&#xff0c;麦…

疫情三年划上终止符,好易点却把个人健康写入了产品基因

作者 | 牧之 编辑 | 小沐 出品 | 智哪儿 zhinaer.cn随着12月26日国家卫健委发布的一纸公告&#xff0c;新冠肺炎正式更名为新冠感染。而从次年1月8日起&#xff0c;新冠将被实施「乙类乙管」。同时出入境也将采取开放性政策。这意味着&#xff0c;持续三年的「疫情时期」&#…

大数据技术——HBase简介

文章目录1. HBase定义2. HBase数据模型2.1 逻辑存储结构2.2 HBase 物理存储结构3. HBase基础架构1. HBase定义 HBase – Hadoop Database&#xff0c;是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统&#xff0c;利用HBase技术可在廉价PC Server上搭建起大规模结构化存…

基于BP神经网络的电力负荷预测(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑…

SpringBoot系列之数据库初始化-jpa配置方式

【DB系列】数据库初始化-jpa配置方式 | 一灰灰Blog 上一篇博文介绍如何使用spring.datasource来实现项目启动之后的数据库初始化&#xff0c;本文作为数据库初始化的第二篇&#xff0c;将主要介绍一下&#xff0c;如何使用spring.jpa的配置方式来实现相同的效果 I. 项目搭建 1…

qt windeployqt打包 带多个dll的可执行程序时 应用程序无法正常启动

前提&#xff1a; 我的工程中包含5个子项目&#xff0c;项目1生成 camer.exe 项目2生成 dll1.dll &#xff0c;其中项目1 依赖后面的四个子项目。 但我在打包程序时&#xff0c;只运行了windeployqt F:\workspace\\bin-ne\camer.exe 将打包的程序放在纯净版本上时&#xff0…

Django开发

1.创建项目 创建项目&#xff1a; 删除内容&#xff1a; 2.创建APP 创建APP 注册APP&#xff1a; 3.设计表结构 4.在SQL中生成表 工具连接MySQL生成数据库&#xff08;在cmd中执行&#xff09;&#xff1a; create database Day1 DEFAULT CHARSET utf8 COLLATE utf8_…

融云获 51CTO 年终评选「中国 IT 行业政企数智办公优秀解决方案奖」

今日&#xff0c;51CTO 主办的“2022 年第十七届中国企业年终评选”榜单新鲜出炉&#xff0c;融云凭借百幄数智办公平台在政企信创办公领域的创新方案和独特设计&#xff0c;斩获“2022 年度中国 IT 行业政企数智办公优秀解决方案奖”。关注【融云 RongCloud】&#xff0c;了解…

B站年度产品榜 | 10项行业品类全面透析Z世代消费偏好

12月19日&#xff0c;哔哩哔哩官方发布“2022年 BILIBILI Z100”&#xff0c;这是B站官方推出的「UP主在用」年度产品榜&#xff0c;榜单包含10项产品类目87件产品&#xff0c;囊括美妆个护、数码3C、食品饮料、家居家电、交通出行、办公用品、鞋服箱包饰品、宠物用品、运动健康…

Linux线程控制

写在前面 我们今天来看线程的知识点&#xff0c;这个博客的内容很多&#xff0c;主要就是为了我们后面的网络做铺垫&#xff0c;最关键的是相比较于进程而言&#xff0c;线程是更加优秀的&#xff0c;我们现在的计算机大多采用的就是线程. 线程 我之前谈过在创建子进程的时候…

操作系统期末考试必会题库4——设备管理

1、DMA方式和中断控制方式的主要区别是什么&#xff1f; 2、面向块设备和面向流设备有何区别&#xff1f;各举一些例子 面向块的设备将信息保存在块中&#xff0c;块的大小通常是固定的&#xff0c;传送过程中一次传送一块。通常可以通过块号访问数据。磁盘和USB智能卡都是面向…

【Linux】Linux权限(一)文件权限和目录权限

Linux权限1.Linux权限的概念2.Linux的用户分类3.Linux的文件类型3.1如何看待Linux下的文件后缀4.Linux的文件权限5.Linux下切换用户指令6.Linux文件访问者的分类&#xff08;拥有者、所属组、other&#xff09;6.1root 和普通用户 与 拥有者和所属组和其他人的关系6.2 如何描述…

matlab中ginput函数的用法

仅用来记录自己学习中不会的函数 ginput函数&#xff1a;来自鼠标或光标的图形输入 一、语法 [x,y] ginput(n) [x,y] ginput [x,y,button] ginput(…) 二、说明 ginput 提高当前坐标区中的交叉线以供您标识图窗中的点&#xff0c;从而使用鼠标定位光标。图窗必须具有焦点…

【Linux】 第八部分 Linux常用基本命令

【Linux】 第八部分 Linux常用基本命令 文章目录【Linux】 第八部分 Linux常用基本命令8. Linux常用基本命令8.1 帮助命令8.2 文件目录类命令pwd 显示当前工作目录的绝对路径cd 切换目录ls 列出目录的内容mkdir 创建目录rmdir 删除目录touch 创建文件cp 复制文件或者目录rm 删除…

网络编程 异步选择模型

目录 1.概念 2.代码样例 1.概念 基本概念&#xff0c;在这一个模型中的代码使用到了vs中窗口应用程序&#xff0c;可以看这一片文章https://blog.csdn.net/weixin_62859191/article/details/128415737?spm1001.2014.3001.5501https://blog.csdn.net/weixin_62859191/article/d…

站在2023起跑线,政企数字化如何深入“核心地带”?

今天&#xff0c;各行各业都积极开展数字化变革&#xff0c;以云为底座开展数字化已成为行业共识。而更进一步观察会发现&#xff0c;大型政企作为数字化转型的先行者和主力军&#xff0c;已经从资源上云、应用上云阶段&#xff0c;率先抵达了数字化深水区&#xff0c;迈入了深…

UDS-Data transmission functional unit

11 数据传输功能单元 11.1 概述 表185指定了数据传输功能单元。 注&#xff1a; ReadDataByIdentifier&#xff1a;客户端通过提供的dataIdentifier去请求读取标识记录的当前值。ReadMemoryByAddress&#xff1a;客户端请求读取所提供的内存范围的当前值。ReadScalingData…

机器学习100天(十九):019 分类模型评价指标-混淆矩阵

机器学习100天,今天讲的是:分类模型评价指标-混淆矩阵。 《机器学习100天》完整目录:目录 一、准确率(Accuracy) 逻辑回归是一个分类模型,那么对于分类模型,如何评估它的优劣呢? 好,我们先来认识一个名词:混淆矩阵(confusion matrix)。混淆矩阵是用来衡量一个分…

C语言预处理器

C 预处理器不是编译器的组成部分&#xff0c;但是它是编译过程中一个单独的步骤。简言之&#xff0c;C 预处理器只不过是一个文本替换工具而已&#xff0c;它们会指示编译器在实际编译之前完成所需的预处理。我们将把 C 预处理器&#xff08;C Preprocessor&#xff09;简写为 …

pybind11学习 | 使用CMake构建系统并生成pyd文件

文章目录一 通过Visual Studio生成二 通过CMake生成一 通过Visual Studio生成 在我之前的一篇文章pybind11学习 | VS2022下安装配置中&#xff0c;描述了如何通过配置VS2022实现pybind11项目构建和编译成Python拓展模块。 二 通过CMake生成 项目结构如下&#xff1a; 其中py…