当前位置: 首页 > 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();}}

输出为:

http://www.lryc.cn/news/354762.html

相关文章:

  • 音视频开发9 FFmpeg 解复用框架--如何将一个影音文件(mp4文件/wav文件) 最终播放起来
  • vue实现页面渲染时候执行某需求
  • Python小游戏——俄罗斯方块
  • Moto和Inter字节序
  • 外汇天眼:野村证券和Laser Digital与GMO互联网集团合作发行日元和美元稳定币
  • Python怎么使用getattr?
  • [算法] 优先算法(三):滑动窗口(上)
  • [蓝桥杯 2020 省 A1] 超级胶水
  • 读书笔记分享
  • 考试宝典——软件过程与管理重点知识总结
  • 穿越时空的工厂之旅:探索可视化三维场景的奥秘
  • 2024年推荐的适合电脑和手机操作的线上兼职副业平台
  • 传感器的静态特性
  • 如果jupyter notebook不能实现网页自动跳转,参考下面的链接
  • 顺序表实现通讯录项目
  • 【ai】pycharm设置软件仓库编译运行基于langchain的chatpdf
  • LeetCode:279.完全平方数
  • Python面试宝典:Python中与ORM技术(对象关系映射)相关的面试笔试题(1000加面试笔试题助你轻松捕获大厂Offer)
  • VUE3+TS+elementplus创建table,纯前端的table
  • UE驻网失败问题(二)
  • 【MySQL】第三周作业
  • 香橙派 Kunpeng Pro使用教程:从零开始打造个人私密博客
  • 深入探索:中文字符的编码与转移字符的奥秘
  • Ubuntu中 petalinux 安装 移植linux --tftp/tftp-hpa服务的方法
  • JVM(内存区域划分、类加载机制、垃圾回收机制)
  • C语言---基础内容(万字)
  • c语言从入门到函数速成(完结篇)
  • 关于linux磁盘告警问题
  • 冯喜运:5.27黄金暴跌大阴后出现“暂定符”今日黄金原油操作策略
  • 前端JS必用工具【js-tool-big-box】学习,获取全球重点城市时间