java二维数组两种初始化方法

java 同时被 3 个专栏收录
45 篇文章 0 订阅
26 篇文章 0 订阅
3 篇文章 0 订阅

写这篇博客的原因是因为从大一学习c语言开始 就对二维数组的声明 和初始化 一直没有搞懂。。。。直到学到了Java依旧搞得不是很清楚。

先看一道Java的基础题

这道题 错误的选项 是 B.

二维数组的初始化的两种方式

看了很多网上的博客,大部分都说是三种初始化的方式,我这里将其归为两种,有不同想法的小伙伴可以留言讨论。

什么是二维数组:

数组是一个容器,用来存储数据的。现在数组中存储的不再是int,double..的类型了,而是存储的数组。

数组中的元素还是数组,我们把它称之为数组中的数组,也就做二维数组。维度增加了一层。

简单的来说二维数组  就是元素为一维数组的数组。

 

二维数组的第一种初始化方式(静态初始化):

静态初始化:初始化时由程序员显示指定每个数组元素的初始值,由系统决定数组长度

*1-1    int k[][] = {{},{},{},{}};

int a[][] = {{1,2,3},{4,5,6},{7,8,9,10}};
int b[][] = {{},{2},{},{3,5}};
直接赋值,二维数组k内层的每一组大括号就是一个一维数组。有几对大括号那么k数组就有几个一维数组

例如二维数组a 中 有三个一维数组,第一个与第二个一维数组中数组长度为3  第三个一维数组长度为4

可以尝试输出其中具体某个一位数组的长度 
System.out.println(a[1].length);   //3
System.out.println(b[2].length);  //0

二维数组的第二种初始化方式(动态初始化):

动态初始化:初始化时程序员只指定数组长度,由系统为数组元素分配初始值。 

第二种初始化方式  int [][]k = new int[i][j];

*2-1    int [][]m = new int[3][];
*2-2    int [][]n = new int[3][2];

第二种初始化方式
对于二维数组k来说   i这个位置必须赋值,而j 这个位置 可以赋值 也可以空着不赋值。
所以就导致了2-1  与2-2  这两种不同的赋值方式。
文章后面会从内存分配的角度来赘述这2-1与2-2的区别

 


 

深入数组 

(一)定义: 
1、数组是编程语言中最常见的一种数据结构,可用于存储多个数据。 
Java的数组要求所有的数组元素具有相同的数据类型。

2、数组是一个引用数据类型,数组的变量只是一个引用,数组元素和数组变量在内存里是分开存放的。

(二)初始化

1、静态初始化:初始化时由程序员显示指定每个数组元素的初始值,由系统决定数组长度。

2、动态初始化:初始化时程序员只指定数组长度,由系统为数组元素分配初始值。


指定初始值时,系统按如下规则分配初始值:

类型  初始值
byte、short、int、long 0

float、double    0.0

char    ‘\u0000’

boolean false

类、接口、数组 null

(三)数组在内存中存储

1. 静态初始化的存储方式

int [][]a = {{},{},{}};

 

 

 

int a[][] = {{1,2},{3,4,5},{}};

 

 

2.动态初始化的存储方式

*2-1

*2-1    int [][]a = new int[3][];

该代码定义了一个变量为a的二维数组,这个数组变量指向了一个长度为3的的数组,
这个数组中每个元素都是一个int类型的数组,所以默认值为null

 

 

 

 *2-2

*2-2    int [][]a = new int[3][2];

该代码定义了一个a数组变量,这个数组变量指向一个长度为3的数组, 
这个数组的元素又是一个数组类型,它们各指向对应长度为2的int[]数组, 
每个数组元素的值为0。

以上分析的代码验证如下

public class TestArray {

	public static void main(String[] args) {
		System.out.println("**********验证 静态初始化 二维数组*****************");
		int a[][] = {{},{},{}};
		System.out.println(a);
		System.out.println(a[0]);
		System.out.println(a[1]);
		System.out.println(a[2]);
		for (int[] is : a) {
			for (int is2 : is) {
				System.out.print(is2 + " ");
			}
			System.out.println("");
		}
		//System.out.println(a[0][0]);  //Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
		
		System.out.println("--------------------");
		int b[][] = {{1,2},{},{3,4,5}};
		System.out.println(b);
		System.out.println(b[0]);
		System.out.println(b[1]);
		System.out.println(b[2]);
		for (int[] is : b) {
			for (int is2 : is) {
				System.out.print(is2 + " ");
			}
			System.out.println("");
		}
		
		
		System.out.println("**********验证 动态初始化 二维数组*****************\"");
		System.out.println("**********2-1***********");
		int c[][] = new int[3][];
		System.out.println(c);
		System.out.println(c[0]);
		System.out.println(c[1]);
		System.out.println(c[2]);
		
		//Exception in thread "main" java.lang.NullPointerException
//		for (int[] is : c) {
//			for (int is2 : is) {
//				System.out.print(is2 + " ");
//			}
//			System.out.println("");
//		}
		
		
		System.out.println("**********2-2***********");
		int d[][] = new int[3][2];
		System.out.println(d);
		System.out.println(d[0]);
		System.out.println(d[1]);
		System.out.println(d[2]);
		for (int[] is : d) {
			for (int is2 : is) {
				System.out.print(is2 + " ");
			}
			System.out.println("");
		}
			
	}
}



输出结果如下 

**********验证 静态初始化 二维数组*****************
[[I@15db9742
[I@6d06d69c
[I@7852e922
[I@4e25154f



--------------------
[[I@70dea4e
[I@5c647e05
[I@33909752
[I@55f96302
1 2 

3 4 5 
**********验证 动态初始化 二维数组*****************"
**********2-1***********
[[I@3d4eac69
null
null
null
**********2-2***********
[[I@42a57993
[I@75b84c92
[I@6bc7c054
[I@232204a1
0 0 
0 0 
0 0 

 

https://blog.csdn.net/lxf512666/article/details/52819906

https://blog.csdn.net/qijingwang/article/details/83620602

  • 10
    点赞
  • 3
    评论
  • 30
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

主要内容: 1. 数组的定义 2. 数组的分类[按维数] 3. 数组的用法 4. 数组的常见操作 java中的foreach实现方式 一维数组 1. 定义:省略 2. 用法: 声明并赋值: //方法一:先声明,再赋值 int [] arr=new int[5]; arr[0]=10; arr[4]=100; arr[5]=10;//语法无误,编译时报错:java.lang.ArrayIndexOutOfBoundsException System.out.println(arr[5]);//语法无误,编译时报错:错误同上 //方法:使用for循环动态赋值 //导入java.util.*;包 Scanner input=new Scanner(System.in); int [] arr=new int[5]; for(int i=0;i<arr.length;i++) { System.out.println("请输入第"+(i+1)+"个值"); arr[i]=input.nextInt(); } //方法三:声明时赋值 int [] arr=new int[]{23,45,56,67}; int [] arr1={23,45,56,67}; int [] arr2= new int[5]{23,45,56,67};//错误,此时不能给确定的长度 输出: int [] arr=new int[]{23,45,56,67}; //方法一:使用for循环输出 for(int i=0;i<arr.length;i++) { System.out.println(arr[i]); } //方法:使用foreach输出:此为JDK5.0 新特性 for(int item : arr) { System.out.println(item); } 常见算法: 1. 求一维数组中的最大[小]值 2. 求一维数组中的总和,平均值 3. 添加,删除,修改,搜索等 具体请参考本人FTP\\5.0S1\\JAVA\\数组完整操作范例。[重复让人如此崩溃!] 数组 1. 定义:省略 2. 用法: 声明并赋值: //声明时赋值 int [][]arr={ {1,2,3}, {4,5,6}, {7,8,9} }; 输出: //方法一:使用嵌套for循环输出数组 for(int i=0;i<3;i++) { for(int j=0;j<3;j++) { System.out.print(arr[i][j]+" "); } System.out.println(); } //方法:使用嵌套foreach输出数组 for(int row[] :arr) //此时不难看出,数组可以看作是每个元素都是一个一维数组的一维数组 { for(int item: row) { System.out.print(item+ " "); } System.out.println(); } 补充: //动态创建规则数组 int R=10;//行 int N=5;//列 int [][]arr=new int ­[N]; //动态创建不规则数组 int arr[][]; arr=new int[2][]; arr[0
<p> <strong><span style="font-size:18px;">课程介绍:</span></strong> </p> <p> 这是一门Java语言入门课程,针对的是Java初学者或者从事其他计算机语言开发但希望转到Java开发工作上来的软件工程师,是所有想入java之门的朋友首先要学的第一门课,也是整个Java开发的核心和基础,也就是大家常说的JAVA SE版本中涵盖的知识; </p> <p> <br /> 本门课程将采用 windows平台下的intellij IDEA开发环境作为主要的讲解平台,对于熟悉其他Java开发环境的学友们,当然也可以选择自己熟悉的平台;本门课程希望达到的目标是给大家打语言基础,但不希望一上来给大家太重的学习负担,分阶段,逐步的学习,是更好的学习方式,所以在本门课程中,我们将只涉及到基础的语言,以及面向对象程序设计的一些基础概念,更多的知识和概念我们将放在进阶课程中讲解,这一点望大家知晓;<br /><br /> 在Java诞生的不到30年时间里,Java开发人员的市场需求已经增长到了一个非常惊人的程度,至少目前来看,没有任何一门开发技术能够和java比,从待遇方面,高级Java开发人员的薪资也是相当的高,大概只有c++能够和Java掰一掰手腕,其他的开发技术的薪资待遇,很难与Java比较。<br /><br /> 很多想学习java的同学,会有一种困惑,感觉Java知识特别零散,除基本的Java语言外,各种概念、各种框架层出不穷,那我们怎么入学习之门,学到什么程度,能找到什么样的工作,这些问题就会困扰着我们;针对这种情况,我将不断推出一系列的Java课程,通过这一系列的课程,为大家搭建一条比较完整的Java学习链条,我并不准备回答大家“学到什么程度,能找到什么样的工作这种问题“,因为当你学到一定的程度之后,你自然就会找到答案,但有一点可以确定:仅仅学习完本门课程还不够,还需要继续深入学习下去!<br /><br /> 讲解中所安装的是jdk版本是jdk 12版本,但这并不意味着我们要把这个版本中的所有知识讲解的面面俱到,把最有用、最实用,最能帮助大家加薪的知识挑选出来讲解是老师的重要责任; </p> <p> <br /></p> <p> <br /></p> <p> <strong><span style="font-size:18px;">讲师介绍:</span></strong><span style="font-size:18px;"></span> </p> <p> 王健伟老师,网名:狂想(KuangXiang),1995年毕业于哈尔滨工程大学计算机及应用专业,20多年软件开发经验,经历过数十个软件项目开发包括网络通信、网络安全、网络游戏等领域,多年的摸爬滚打使自身具备了极其深厚的开发实力和实战经验。<br /><br /> 深圳知名网络安全公司安络科技(www.cnns.net)有限公司创始人之一、中国首套网络安全在线扫描评估系统项目负责人,电子工业出版社2003年《Crystal Reports水晶报表设计与开发实务》书籍作者,全球同服独立游戏《冒险之路》制作人。<br /><br /> 在教学上,老师自带讲课天赋,善于用最清晰、最通俗的语言把复杂问题简单化,让你听了就能懂,当节学完基本就能掌握,老师能够为你节省大量的学习时间并能达到极好的教学效果!<br /><br /></p> <p> <br /></p>
©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值