Java中数组的使用与注意事项详解(推荐)
一.初始数组
数组的概念:数组就是一个用来存储相同类型数据的一个容器。
为什么要使用数组?
当我们要存储大量相同类型的时候,通过配合循环来使用就会大量减少代码复杂程度
数组的特点:
(1)数组是一种引用类型.
(2)数组的长度是固定的.
(3)数组中每个元素的类型都是相同的.
二.数组的创建
对于数组的创建,这里和c/c++还是有些不同的,这里创建数组的方法共有三种方法,下面就以数组里面元素为int类型,数组大小为5的举例,如下所示:
(1) 静态初始化
int[] arr = {1,2,3,4,5}
int[] arr = new int[]{1,2,3,4,5};
(2)动态初始化
int[] arr = new int[5];
在这里对于数组的初始化,千万要注意下面这种情况是错误的初始化
int[] arr = new int[5]{1,2,3,4,5};
在这里是不能同时初始化两次,这样会编译不通过,出现错误。
三.使用数组时的注意事项
(1)初始化问题
在创建数组后,如果没有进行赋初值,Java会默认对数组进行初始化,这里对于每种类型的初始值都有不同。
数据类型 | 默认初始值 |
byte | 0 |
short | 0 |
int | 0 |
long | 0 |
float | 0.0 |
double | 0.0 |
char | ‘\u0000' |
String | null |
boolean | false |
(2)数组长度的使用
在Java中,可以直接调用Java中自带的方法来求得数组的长度,使用的方法为
数组名.length
String[] f= new String[5]; int len = f.length; System.out.println(len);//5
(3)有关数组长度的问题
对于数组的长度来说,在进行开辟数组空间的时候就已经确定了,但是在数组长度定义的问题上这里和c/c++有不同的区别,在Java中可以使用变量来进行数组的初始化,例如下面的代码,在Java中是被允许的。
int size = 10; int[] arr = new int[size];
(4)对于数组的访问
数组的索引相当于门牌号,对每一个元素来说都有对应的位置,如果要进行访问就需要使用指定的索引位置来进行访问
对于数组的访问范围为[0,arr.length),左开右闭的区间范围
但是使用这样的方法来进行访问数组中的每一个元素比较麻烦,下来有一种简单的方法来进行数组的遍历与访问每一个元素
(5)数组的遍历
方法1:
使用普通的for循环来进行来进行访问每一个元素
方法2:
使用增强的for循环来进行遍历数组的每一个元素,相当于对数组的拷贝
两种方法的区别:
在遍历数组的时候,两种方法是没有任何区别的,但是在进行改变数组元素值的时候方法1就可以直接进行数组元素的改变,但是方法2对于基本数据类型的数组是没法来进行改变的。
例题:
给一个数组的每一个元素都乘以2,这里只能用方法1来进行改变,代码如下:
//改变数组中的值 public static void transformArr(int[] arr){ for (int i = 0; i < arr.length; i++) { arr[i] *=2; } }
三.数组的类型
关于类型来分,共有两种类型,一种是基本数据类型一种是引用数据类型
两种类型的概念和区别
基本数据类型:基本数据类型创建的变量,称为基本变量,该变量空间中直接存放的是其所对应的值。
引用数据类型:引用数据类型创建的变量,一般称为对象的引用,其空间中存储的是对象所在空间的地址。
在Java中,数组的数据类型是引用数据类型,那么数组是如何进行使用和分配空间的,首先我们需要知道jvm的内存分布
分布图如下所示:
1、每个部分数据区的概念:
(1) 程序计数器 (PC Register): 只是一个很小的空间, 保存下一条执行的指令的地址。
(2)虚拟机栈(JVM Stack): 与方法调用相关的一些信息,每个方法在执行时,都会先创建一个栈帧,栈帧中包含有:局部变量表、操作数栈、动态链接、返回地址以及其他的一些信息,保存的都是与方法执行时相关的一些信息。比如:局部变量。当方法运行结束后,栈帧就被销毁了,即栈帧中保存的数据也被销毁了。
(3)本地方法栈(Native Method Stack): 本地方法栈与虚拟机栈的作用类似. 只不过保存的内容是Native方法的局部变量. 在有些版本的 JVM 实现中(例如HotSpot), 本地方法栈和虚拟机栈是一起的。
(4)堆(Heap): JVM所管理的最大内存区域. 使用 new 创建的对象一般在堆上保存 (例如前面的 new int[]{1, 2,3} ),堆是随着程序开始运行时而创建,随着程序的退出而销毁,堆中的数据只要还有在使用,就不会被销毁。
(5)方法区(Method Area): 用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据. 方法编译出的的字节码就是保存在这个区域。
在数组这里我们只需要知道虚拟机栈和堆就可以了
2.数组在JVM当中的使用情况
在这里以使用数组交换两个数来了解数组在虚拟机是如何运行的
(1)代码:
public class Demo{ public static void swap(int[] a){ int tmp = a[0]; a[0] = a[1]; a[1] = tmp; } public static void main(String[] args) { int[] arr = {1,2}; System.out.println("-----交换前------"); System.out.println(Arrays.toString(arr)); swap(arr); System.out.println("-----交换后------"); System.out.println(Arrays.toString(arr)); } }
(2)运行结果:
(3)在虚拟机中的运行步骤
交换前执行的结果:
数组开辟的空间是在堆中进行开辟,但是在栈中相当于存储的是数组的首地址,所以在上面例子中,交换的是引用类型中的值,所以能够进行交换原来数组中值。
3.引用类型的注意事项
在使用引用类型数组的时候我们要注意我们改变的是引用类型中的引用还是引用类型中的内容。
在上面的值交换中,我们改变的是引用类型中的内容,那么接下来我们举个例子来说明一下改变引用类型的引用
代码如下:
改变数组中的值
public class Demo{ public static void chaArr(int[] a){ int[] b= new int[3]; a = b; a[0]=100; a[1] = 200; } public static void main(String[] args) { int a[] = {10,20}; System.out.println("改变前--------"); System.out.println(Arrays.toString(a)); chaArr(a); System.out.println("改变后--------"); System.out.println(Arrays.toString(a)); } }
运行结果:
我们可以发现,在chaArr()方法中我们改变的值在数组中没有发生变化,这是为什么,这是因为,我们在chaArr()中将a的引用地址进行了改变,之后操作的是新创建的数组b中的结果,所以a中的结果没有发生改变,图示如下:
所以在使用数组时要注意是否在中间发生了引用地址的改变。
四.关于引用类型的返回值
在之前学过的返回值都是基本数据类型中的返回值,在学过数组之后,我们知道引用类型也有返回值,接下来我使用返回值来求一个存放斐波那契数列结果的数组,如果所需要的数组大小<=0,则返回null,否则返回一个数组。
代码如下:
public class Demo{ //返回一个斐波纳契数列的数组 public static int[] fibArr(int n){ if(n<=0){ return null; } int[] fiArr = new int[n]; fiArr[0] = 1; if(n==1){ return fiArr; } fiArr[1] = 1; for(int i=2;i<n;i++){ fiArr[i]=fiArr[i-1]+fiArr[i-2]; } return fiArr; } public static void main(String[] args) { System.out.println(Arrays.toString(fibArr(10))); } }
前10项的输出结果如下:
总结
到此这篇关于Java中数组的使用与注意事项的文章就介绍到这了,更多相关Java数组使用与注意内容请搜索猪先飞以前的文章或继续浏览下面的相关文章希望大家以后多多支持猪先飞!
相关文章
- 这篇文章主要介绍了如何利用java语言实现经典《复杂迷宫》游戏,文中采用了swing技术进行了界面化处理,感兴趣的小伙伴可以动手试一试...2022-02-01
- 在php中eval是一个函数并且不能直接禁用了,但eval函数又相当的危险了经常会出现一些问题了,今天我们就一起来看看eval函数对数组的操作 例子, <?php $data="array...2016-11-25
java 运行报错has been compiled by a more recent version of the Java Runtime
java 运行报错has been compiled by a more recent version of the Java Runtime (class file version 54.0)...2021-04-01- 这篇文章主要介绍了在java中获取List集合中最大的日期时间操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-15
- 这篇文章主要介绍了Python 图片转数组,二进制互转操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-09
- 这篇文章主要介绍了教你怎么用Java获取国家法定节假日,文中有非常详细的代码示例,对正在学习java的小伙伴们有非常好的帮助,需要的朋友可以参考下...2021-04-23
- 这篇文章主要介绍了Java如何发起http请求的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-31
- 本文章提供在量的数据中级操作实例有如对键名比较计算数组的差集 计算差集 给指定数组中插入一个元素 反转数组 交集赋值新的数组实例。 //定义回调函数 funct...2016-11-25
- 这篇文章主要介绍了C#二维数组基本用法,以实例形式分析了C#中二维数组的定义、初始化、遍历及打印等用法,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
- 说起C#和Java这两门语言(语法,数据类型 等),个人以为,大概有90%以上的相似,甚至可以认为几乎一样。但是在工作中,我也发现了一些细微的差别...2020-06-25
- Array数组在C#中同样是最基本的数据结构,下面为大家C#数组的常用操作方法小结,皆为细小的代码段,欢迎收看收藏...2020-06-25
- 下面一段代码给大家介绍php curl模拟post请求的示例代码,具体代码如下: <?php$uri = "http://www.cnblogs.com/test.php";//这里换成自己的服务器的地址// 参数数组$data = array ( 'name' => 'tanteng'// 'passwor...2015-11-24
- 这篇文章主要介绍了解决Java处理HTTP请求超时的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-29
- 这篇文章主要介绍了java 判断两个时间段是否重叠的案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-15
- 下面小编就为大家带来一篇C# 拷贝数组的几种方法(总结)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
- 这篇文章主要介绍了超简洁java实现双色球若干注随机号码生成(实例代码),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-04-02
- 本文记录的要实现的功能类似于 MySQL 中的 ORDER BY,上个项目中有遇到这样的一个需求。 要求:从两个不同的表中获取各自的4条数据,然后整合(array_merge)成一个数组,再根据数据的创建时间降序排序取前4条。 遇到这个...2014-06-07
java 画pdf用itext调整表格宽度、自定义各个列宽的方法
这篇文章主要介绍了java 画pdf用itext调整表格宽度、自定义各个列宽的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-01-31- 这篇文章主要介绍了Java生成随机姓名、性别和年龄的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-10-01
- 这篇文章主要介绍了C#实现字符串转换成字节数组的简单实现方法,仅一行代码即可搞定,非常简单实用,需要的朋友可以参考下...2020-06-25