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

【Java】手把手学会数组的使用

数组的基本用法

创建数组

基本语法:

// 动态初始化
数据类型 [] 数组名称 = new 数据类型 [] { 初始化数据 };
// 静态初始化
数据类型 [] 数组名称 = { 初始化数据 };

代码示例:

int[] array1 = {1,2,3,4,5};int[] array2 = new int[]{1,2,3,4,5};int[] array3 = new int[5];
array3 = new int[]{1,2,3,4,5};

 数组的使用

int[] array = {1,2,3,4,5};Systrm.out.println(array.length);    //打印数组的长度//获取数组中的元素array[1] = 6;  //将下标为1位置的数更换为6

 注意事项

1. 使用 arr.length 能够获取到数组的长度,   这个操作为成员访问操作符   后面在面向对象中会经常用到
2. 使用 [ ] 按下标取数组元素, 需要注意, 下标从 0 开始计数
3. 使用 [ ] 操作既能读取数据, 也能修改数据 .
4. 下标访问操作不能超出有效范围 [0, length - 1] , 如果超出有效范围 , 会出现下标越界异常

遍历数组

int[] arr = {1, 2, 3};for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}//输出结果为:1,2,3

 使用  for - each 循环来遍历数组,也叫做增强循环。

int[] array = {1,2,3,4,5,6};for(int x : array){
System.out.println(x);
}
for-each for 循环的另外一种使用方式, 能够更方便的完成对数组的遍历, 可以避免循环条件和更新语句写错,一般只用于遍历数组当中。

数组作为方法的参数进行传参

代码示例:

public static void printArray(int[] a) {
for (int x : a) {
System.out.println(x);
}
}public static void main(String[] args) {
int[] arr = {1, 2, 3};
printArray(arr);
}

该代码就是利用数组的传参来进行遍历数组

  • int[] a 是方法的形参, int[] arr 是方法实参
  • 如果需要获取到数组长度, 同样可以使用 a.length

理解引用类型

代码示例:

public static void main(String[] args) {
int num = 0;
func(num);
System.out.println("num = " + num);
}
public static void func(int x) {
x = 10;
System.out.println("x = " + x);
}

在 main 方法中调用方法 func() 的时候会创建一个 func() 的栈帧,变量 X 是在 func() 中创建的,在调用完之后就销毁了,所以并不影响 main() 方法里面的变量。

参数传参数组类型

代码示例:

public static void main(String[] args) {
int[] arr = {1, 2, 3};
func(arr);
System.out.println("arr[0] = " + arr[0]);
}
public static void func(int[] a) {
a[0] = 10;
System.out.println("a[0] = " + a[0]);
}

我们来简易画一下该代码的调用图:

我们可以看到在传参之后 arr 和 a 都指向了堆中的该数组。因此我们可以用 a 来改变数组里面的内容

初识 JVM 内存区域划分

JVM 的内存被划分成了几个区域 , 如图所示:
  • 程序计数器 (PC Register): 只是一个很小的空间, 保存下一条执行的指令的地址。
  • 虚拟机栈(JVM Stack): 重点是存储局部变量表(当然也有其他信息). 我们刚才创建的 int[] arr 这样的存储地址的引用就是在这里保存。
  • 本地方法栈(Native Method Stack): 本地方法栈与虚拟机栈的作用类似. 只不过保存的内容是Native方法的局 部变量. 在有些版本的 JVM 实现中(例如HotSpot), 本地方法栈和虚拟机栈是一起的。
  • (Heap): JVM所管理的最大内存区域. 使用 new 创建的对象都是在堆上保存 (例如前面的 new int[]{1, 2, 3} )。
  • 方法区(Method Area): 用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数 据. 方法编译出的的字节码就是保存在这个区域。
  • 运行时常量池(Runtime Constant Pool): 是方法区的一部分, 存放字面量(字符串常量)与符号引用. (注意 JDK 1.7 开始, 运行时常量池在堆上)。

数组作为方法的返回值

public static int[] func1(int[] array,int key){for (int i = 0; i < array.length-1; i++) {for (int j = 0; j < array.length; j++) {if(i != j && array[i] + array[j] == key){return new int[]{i,j};}}}return new int[]{-1,-1};}public static void main(String[] args) {int[] array = {2,7,11,15};int[] b = func1(array,9);System.out.println(Arrays.toString(b));}

该代码的含义是在 array 数组中找到两个相加等于 9 的数的下标,并作为方法的返回值一次性将两个下标通过数组来返回出来。

java.util.Arrays  包

我们来讲解一下关于 java.util.Arrays 这个包中的一些方法的使用。

数组转字符串

代码示例:

    public static void main(String[] args) {int[] array = {1,2,3,4,5,6};String str = Arrays.toString(array);System.out.println(str);}

我们通过 Arrays.toString() 该方法将一个数组转换成一个字符串了,最后将该字符串输出。

数组拷贝

代码示例:

    public static void main(String[] args) {int[] array1 = {1,2,3,4,5,6};int[] array2 = new int[array1.length];array2 = Arrays.copyOf(array1,array1.length);System.out.println(Arrays.toString(array2));}

我们利用 Arrays.copyOf() 方法将数组 array1 里面的内容拷贝到了 array2 里面。

范围拷贝:

代码示例:

    public static void main(String[] args) {int[] array1 = {1,2,3,4,5};int[] array2 = new int[array1.length];array2 = Arrays.copyOfRange(array1,1,3);System.out.println(Arrays.toString(array2));}

我们利用 copyOfRange() 方法将数组 array1 的一部分拷贝到数组 array2 中。

查找数组中指定元素(二分查找)

代码示例:

    public static void main(String[] args) {int[] array = {1,2,3,4,5,6,7,8};int a = Arrays.binarySearch(array,4);System.out.println(a);}

我们利用 binarySearch() 方法查找到数组 array 中指定的一个数,并返回下标。如果没有找到则返回一个负数。

数组排序

代码示例:

    public static void main(String[] args) {int[] array = {5,3,7,9,2,4,6,7,2};Arrays.sort(array);System.out.println(Arrays.toString(array));}

我们利用 sort() 方法将一个乱序的数组从小到大排序出来。

判断两个数组是否相等

代码示例:

    public static void main(String[] args) {int[] array1 = {1,2,3,4,5};int[] array2 = {1,2,3,4,5};boolean f = Arrays.equals(array1,array2);System.out.println(f);}

我们用方法 equqls() 来判断两个数组是否相等。如果相等则返回一个布尔值 true ,不相等返回false。

二维数组

二维数组本质上也就是一维数组 , 只不过每个元素又是一个一维数组。
数据类型 [][] 数组名称 = new 数据类型 [ 行数 ][ 列数 ] { 初始化数据 };

代码示例:

 

int[][] array1 = {{1,2,3},{4,5,6}};int[][] array2 = new int[][]{{1,2,3},{4,5,6}};int[][] array3 = new int[2][];

将二维数组转换成字符串

代码示例:

    public static void main(String[] args) {int[][] array = {{1, 2, 3}, {4, 5, 6}};System.out.println(Arrays.deepToString(array));}

运行结果为:

遍历二维数组

    public static void main(String[] args) {int[][] array = {{1, 2, 3}, {4, 5, 6}};for (int i = 0; i < array.length; i++) {for (int j = 0; j < array[i].length; j++) {System.out.print(array[i][j]);}System.out.println();}}

array.length 是数组 array 的行数,array[i].length 是数组 array 第 i 行的列数。

在Java中是允许不规则的二维数组出现的:

    public static void main(String[] args) {int[][] array = {{1, 2, 3}, {4, 5, 6,7},{8,9,10,11,12,13,14}};for (int i = 0; i < array.length; i++) {for (int j = 0; j < array[i].length; j++) {System.out.print(array[i][j]+" ");}System.out.println();}}

输出为:

相关文章:

  • react使用AntV
  • IPD在卷烟工业企业研发管理中应用
  • 深入 Rust 标准库,Rust标准库源代码系统分析
  • YOLOv8实例分割离线数据增强,标签可视化!
  • 切换分支报错:Untracked Files Prevent Checkout
  • mysql实战——mysql5.7保姆级安装教程
  • MySQL——存储过程,触发器
  • C++的文件I/O与流stream
  • 【静态分析】在springboot使用太阿(Tai-e)01
  • Paddle 稀疏计算 使用指南
  • CP AUTOSAR之ASWS_TransformerGeneral详细说明(更新中...)
  • 项目集成SkyWalking,基于k8s搭建
  • Linux实验五:进程间通信(一)
  • 【博客主页】博客主旨 精华
  • 最小生成树要点和难点具体应用
  • Android系统模拟器绘制实现概述
  • ComponentOne 2017 V2版本正式发布
  • gcc介绍及安装
  • JavaScript新鲜事·第5期
  • java取消线程实例
  • js算法-归并排序(merge_sort)
  • Odoo domain写法及运用
  • PHP 小技巧
  • win10下安装mysql5.7
  • 排序算法之--选择排序
  • 深入 Nginx 之配置篇
  • 吴恩达Deep Learning课程练习题参考答案——R语言版
  • 再谈express与koa的对比
  • 深度学习之轻量级神经网络在TWS蓝牙音频处理器上的部署
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • $.ajax()
  • (03)光刻——半导体电路的绘制
  • (C语言)共用体union的用法举例
  • (定时器/计数器)中断系统(详解与使用)
  • (附源码)php新闻发布平台 毕业设计 141646
  • (规划)24届春招和25届暑假实习路线准备规划
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (四) Graphivz 颜色选择
  • (转)重识new
  • .java 9 找不到符号_java找不到符号
  • .NET Framework Client Profile - a Subset of the .NET Framework Redistribution
  • .NET Framework 服务实现监控可观测性最佳实践
  • .Net Winform开发笔记(一)
  • [ C++ ] STL---仿函数与priority_queue
  • [ 渗透测试面试篇 ] 渗透测试面试题大集合(详解)(十)RCE (远程代码/命令执行漏洞)相关面试题
  • [Bugku]密码???[writeup]
  • [C++] vector list 等容器的迭代器失效问题
  • [Cloud Networking] Layer3 (Continue)
  • [CSDN首发]鱿鱼游戏的具体玩法详细介绍
  • [HTML]Web前端开发技术12(HTML5、CSS3、JavaScript )——喵喵画网页
  • [JAVA设计模式]第二部分:创建模式
  • [jQuery]10 Things I Learned from the jQuery Source
  • [JS]JavaScript 注释 输入输出语句
  • [Linux] MySQL数据库之索引
  • [Machine Learning] 领域适应和迁移学习