解析java中的数组
文章目录
- 一 数组的定义
- 二 数组的基本语法
- 三 数组的使用
- 1 数组获取长度与访问元素
- 注意事项:
- 2 数组的遍历
- (1)for循环遍历
- (2)for-each遍历数组
- 四 数组作为方法的参数
- (1)基本用法
- (2)理解引用类型
- 总结:
- 五 认识null
- 例题
- 注意:
- 六. 数组作为方法的返回值
- 七 数组的拷贝
- 1 copyof
- 2 copyRange
- 3 clone()
- 4 System.arraycopy
- 八. 二维数组
- 1 基本语法
- 2 二维数组的遍历
- (1)for循环进行遍历
- (2)for-each循环遍历
- (3)调用Arrays
- 3 不规则的二维数组
一 数组的定义
数组:本质上就是一组相同类型的变量。
二 数组的基本语法
1) 数据类型[] 数组名称 = new 数据类型 [] { 初始化数据 };
例:int[] arr = new int[]{1, 2, 3};
2) 数据类型[] 数组名称 = { 初始化数据 };
例: int[] arr = {1, 2, 3};
3) 数据类型[] 数组名称 = new int[定义数组长度];//这种定义数组里面全部初始化为零
例:int[] arr = new int[10];
三 数组的使用
1 数组获取长度与访问元素
int[] arr = {1, 2, 3};
// 获取数组长度
System.out.println("length: " + arr.length); // 执行结果: 3
// 访问数组中的元素
System.out.println(arr[1]); // 执行结果: 2
注意事项:
(1): 访问数组元素的下标是从0开始的
(2):下表访问的数不能超过【0,length-1】,否则会出现数组越界,这样程序会报错。
(3):利用[]可以对数组的内容进行更改与读取操作
2 数组的遍历
(1)for循环遍历
int[] arr = {1, 2, 3};
for (int i = 0; i < arr.length; i++) {System.out.println(arr[i]);
}
(2)for-each遍历数组
int[] arr = {1, 2, 3};
for (int x : arr) {System.out.println(x);
}
四 数组作为方法的参数
(1)基本用法
public static void main(String[] args) {int[] arr = {1, 2, 3};printArray(arr);
}
public static void printArray(int[] a) {for (int x : a) {System.out.println(x);}
}
// 执行结果
1
2
3
在以上的这个数组中,int[] a 是函数的形参, int[] arr 是函数实参.
(2)理解引用类型
参数传数组类型就是属于引用类型
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]);
}
// 执行结果
a[0] = 10
arr[0] = 10
我们发现, 在方法内部修改数组内容, 主函数数组内容也发生改变.
此时数组名 arr 是一个 “引用” . 当传参的时候, 是按照引用传参.
这个就需要我们从内存这个知识去解释了,在内存中,局部变量创建是放在JVM的栈上
,对象是在堆上。在上面这个代码中,首先进入main函数,为arr开辟一个内存空间,放到栈上,里面存放的是对象的地址(0x789),而这里的对象就是对数组的内容(1,2,3)会被放到堆上地址为(0x789),通过地址,arr就能够访问到对象,而之后用到方法,arr会把它的地址传给a,此时JVM的栈上有开辟了一个空间(0x789),通过a,也可以访问到arr的对象,可以进行改写与读操作。
图例:
总结:
所谓的 “引用” 本质上只是存了一个地址. Java 将数组设定成引用类型
五 认识null
null 在 Java 中表示 “空引用” , 也就是一个无效的引用
例题
int[] arr = null;
System.out.println(arr[0]);
// 执行结果
Exception in thread "main" java.lang.NullPointerException
at Test.main(Test.java:6)
null 的作用类似于 C 语言中的 NULL (空指针), 都是表示一个无效的内存位置. 因此不能对这个内存进行任何读写操作. 一旦尝试读写, 就会抛出 NullPointerException.
注意:
Java 中并没有约定 null 和 0 号地址的内存有任何关联
六. 数组作为方法的返回值
// 返回一个新的数组
class Test {public static void main(String[] args) {int[] arr = {1, 2, 3};int[] output = transform(arr);printArray(output);
}
public static void printArray(int[] arr) {for (int i = 0; i < arr.length; i++) {System.out.println(arr[i]);}
}
public static int[] transform(int[] arr) {int[] ret = new int[arr.length];for (int i = 0; i < arr.length; i++) {ret[i] = arr[i] * 2;}return ret;}
}
从以上代码分析可以得出,数组可以作为返回值类型,从而返回一个数组,特别注意一下这个ret数组,这个ret数组里面存放的地址不在是arr内存中的地址,此时的ret数组里面的内容会与arr的内容一致。
七 数组的拷贝
1 copyof
import java.util.Arrays;//这个是导入的包,在下面使用Arrays后自动导入public class java1027 {public static void main(String[] args) {int[] arr = {1,2,3,4,5};int[] ret = Arrays.copyOf(arr,arr.length);//arr表示要进行拷贝的数组,arr.length表示拷贝的长度}
注意这里拷贝的长度可以是乘以一个实数,比如乘以2,那么拷贝后ret数组就变成{1,2,3,4,5,0,0,0,0,0}这个就是扩容处理
2 copyRange
import java.util.Arrays;public class java1027 {public static void main(String[] args) {int[] arr = {1,2,3,4,5};int[] ret = Arrays.copyOfRange(arr,2,4);//arr表示原数组,2表示的是拷贝的起始位置,4表示拷贝结束的位置}
3 clone()
public class java1027 {public static void main(String[] args) {int[] arr = {1,2,3,4,5};int[] ret = arr.clone();}
4 System.arraycopy
import java.util.Arrays;public class java1027 {public static void main(String[] args) {int[] arr = {1,2,3,4,5};int[] ret = new int[arr.length];System.arraycopy(arr,0,ret,0,arr.length);System.out.println(Arrays.toString(ret));//数组以字符串的形式输出}//arr表示的是原数组,0表示从原数组0下标开始拷贝,ret表示目的数组,0表示从下标0开始,arr.length表示结束下标
以上四种拷贝方式都是属于浅拷贝,至于深拷贝,后续的内容我们会详解
八. 二维数组
1 基本语法
1)数据类型[][] 数组名称 = new 数据类型 [行数][列数] { 初始化数据 };
2)数据类型[][] 数组名称 ={ 初始化数据 };
public class java1027 {public static void main(String[] args) {int[][] arr = {{1,2,4},{1,2,3}};System.out.println(arr.length);System.out.println(arr[0].length);}
运行结果
2
3
二维数组arr从这张图就可以看出二维数组是一个特殊的一维数组,结合上诉代码就可以看出arr.length代表的是整个行的长度,arr[0].length(或者arr[1].length)代表的是列的长度。知道这个之后就可以遍历二维数组的内容了,
2 二维数组的遍历
(1)for循环进行遍历
public class java1027 {public static void main(String[] args) {int[][] arr = {{1,2,4},{1,2,3}};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 4
1 2 3
(2)for-each循环遍历
public class java1027 {public static void main(String[] args) {int[][] arr = {{1,2,4},{1,2,3}};for (int[] ret:arr) {for (int x:ret) {System.out.print(x+" ");}System.out.println();}}
(3)调用Arrays
import java.util.Arrays;public class java1027 {public static void main(String[] args) {int[][] arr = {{1,2,4},{1,2,3}};System.out.println(Arrays.deepToString(arr));}
运行结果
[[1, 2, 4], [1, 2, 3]]
3 不规则的二维数组
public class java1027 {public static void main(String[] args) {int[][] arr = new int[2][];arr[0]=new int[3];arr[1]=new int[2];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();}}
运行结果
0 0 0
0 0
解析java中的数组相关推荐
- js解析java对象数组_js接收并转化Java中的数组对象的方法
在做项目时,要向ocx控件下发命令,就要在js中得到java中的对象,然后拼成一种格式,下发下去...当对象是一个时比较简单,但如果对象是一个数组时,就略显麻烦了. 开始我以为有简单的方式,可以直接进 ...
- java 获取spring对象数组_解析Java中如何获取Spring中配置的bean
解析Java中如何获取Spring中配置的bean Java中如何获取Spring中配置的bean?下面是由百分网小编为大家整理的解析Java中如何获取Spring中配置的bean,喜欢的可以收藏一下 ...
- Java中一维数组的内存解析(浅显易懂,新手必看)
1.初识JVM 要认识Java中一维数组的内存存储情况,首先应该简单了解一下JVM这个概念 1.1什么是JVM JVM是JavaVirtualMachine(Java虚拟机)的缩写,JVM是一种用于计 ...
- java面试题24 关于Java中的数组,
java面试题24 关于Java中的数组,下面的一些描述,哪些描述是准确的:( ) A 数组是一个对象,不同类型的数组具有不同的类 B 数组长度是可以动态调整的 C 数组是一个连续的存储 ...
- Java中的数组,java开发面试笔试题
我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家. 扫描二维码或搜索下图红色VX号,加VX好友,拉你进[程序员面试学习交流群]免费领取.也欢迎各位一起 ...
- java method field_java_解析Java中的Field类和Method类,Field类
Field类中定义了一些方 - phpStudy...
解析Java中的Field类和Method类 Field类Field类中定义了一些方法,可以用来查询字段的类型以及设置或读取字段的值.将这些方法与继承而来的member方法结合在一起.就可以使我们能够 ...
- java数组创建后大小能改变吗,在Java中,数组创建成功以后,其大小(??? )(能/不能)改变...
在Java中,数组创建成功以后,其大小(??? )(能/不能)改变 答: 不能 新民主主义革命最基本的动力是(). 答:中国无产阶级 病人,男性,36岁.尿蛋白(++++),全身水肿1个月,测血压16 ...
- 四十三、深入Java中的数组流,数据流和对象流操作
@Author:Runsen @Date:2020/6/8 作者介绍:Runsen目前大三下学期,专业化学工程与工艺,大学沉迷日语,Python, Java和一系列数据分析软件.导致翘课严重,专业排名 ...
- Java中 byte[]数组序列化和fastjson序列化区别
Java中 byte[]数组序列化和fastjson序列化区别 Java中,对于对象可以通过序列化成byte数组或者序列化成json形式,这里做下两者的对比. 首先看下实现方式: 1 byte数组序列 ...
最新文章
- gradle常用命令
- jQuery unbind 删除绑定事件 / 移除标签方法
- 计算机网络校园网建设设计摘要,计算机网络专业论文校园网建设设计.doc
- boost::graph模块实现bfs算法的测试程序
- BSP tag in CRM and JSP tag in Hybris
- python中升级pip报错_linux系统下pip升级报错的解决方法
- 通用大数据架构为什么不适合处理物联网数据?
- Spring Restful Web服务示例 - 使用JSON/Jackson和客户端程序
- asp.net后台管理系统-登陆模块-路由权限控制_1
- python中类里self_Python类中的self到底是干啥的
- java 改变文件路径_在C#中改变文件路径
- doubango安卓端的帧率太低,解决办法
- AR/VR learning (1)--artoolkit在android studio 上的配置
- CROW-5 WEB APP引擎商业计划书(HTML5方向)-微信网页版微信公众平台登录-水仙谷...
- 3mx转osgb_如何将无人机Las点云数据转为Osgb数据
- EMI、EMS以及EMC的区别
- 2022年湖北省光电子信息和生命健康领域科技计划成果路演征集条件以及申报时间流程汇总!
- docker容器和镜像的区别
- 挑逗Java程序员的那些Scala绝技
- (4)tiny4412移植uboot_2018_07