java数组的格式声明格式是什么


声明一个数组就是要确定数组名、数组的维数和数组元素的
数据类型。数组名是符合Java标识符定义规则的用户自定义标识
符。数组的维数用方括号(“[ ]”)的个数来确定,对于一维数组来
说,只需要一对方括号。数组元素的数据类型可以是Java的任何
接口(interface)等。数组的声明格式如下:

声明一个数组仅仅为这个数组指定数组名和数组元素的类
型,并不为数组元素分配实际的存储空间。这是因为Java的数组
声明中并未指出数组元素的个数,系统无法知道需要给这个数组
分配多大的内存空间。要想使一个数组占有所需要的内存空间,
必须指出数组元素的个数,在Java程序中把这一工作放在数组的
初始化时进行。数组经过初始化后,其长度(即可存放的元素个
数)就不可再改变。Java数组的初始化可以通过直接指定初值的方
式来完成,也可以用new操作符来完成。

用直接指定初值的方式对数组初始化,是在声明一个数组
的同时将数组元素的初值依次写入赋值号后的一对花括号内,
给这个数组的所有数组元素赋上初始值。这样,Java编译器可
通过初值的个数确定数组元素的个数,为它分配足够的存储空
间并将这些值写入相应的存储单元。例如:

这条语句声明数组名为a1,数组元素的数据类型为整型
(int,占4个字节),共有5个初始值,故数组元素的个数为5。这
样一个语句为Java分配存储空间提供了所需要的全部信息,系
统可为这个数组分配5*4=20个字节的连续存储空间。经过初始
其存储空间分配及各数组元素的初始值如图6.1所示。注意Java
中的数组下标从0开始。

用关键字new初始化数组,只为数组分配存储空间而不对数
组元素赋初值。用关键字new来初始化数组有两种方式:
(1) 先声明数组,再初始化数组。这实际上由两条语句构
其中,第一条语句是数组的声明语句,第二条语句是初始化语句。
应该注意的是:两条语句中的数组名、类型标识符必须一致。数
组长度通常是整型常量,用以指明数组元素的个数。例如:

(2) 在声明数组的同时用new关键字初始化数组。这种初始
化实际上是将上面所述的两条语句合并为一条语句罢了。格式
类型标识符 数组名[ ]=new 类型标识符[数组长度];
类型标识符[ ] 数组名=new 类型标识符[数组长度];

当数组初始化后就可通过数组名与下标来引用数组中的每
一个元素。一维数组元素的引用格式如下:
其中:数组名是经过声明和初始化的标识符;数组下标是指元
素在数组中的位置,数组下标的取值范围是0~(数组长度-1),
下标值可以是整数型常量或整数型变量表达式。例如,在有了

是错误的。这是因为Java为了保证安全性,要对引用时的数组元
素进行下标是否越界的检查。这里的数组a在初始化时确定其长
度为10,下标从0开始到9正好10个元素,因此,不存在下标为

在Java语言中,数组也是一种对象。数组经初始化后就确定
了它的长度,对于每个已分配了存储空间的数组,Java用一个数
据成员length来存储这个数组的长度值。
【示例程序c6_1.java】 数组的声明、初始化和其长度的测定。

我们在本章开头提出的计算30名学生平均成绩问题的关键
是一般的变量标识符中没有可变的东西,而数组作为一组变量
的代表者其下标可以使用变量。实际上,我们在示例程序
c6_1.java中已经用到了数组下标的这一特性。下面我们再通过
几个例子来说明数组下标的灵活使用。
项,即使用数组下标表达式求解数学上的迭代问题。

在日常生活中,人们几乎每天都要进行“查找”。例如,在电
话号码簿中查找某单位或某人的电话号码;在字典中查阅某个
词的读音和含义等。查找的关键问题是如何快速地找到待查的
内容。例如,查字典的关键是如何快速地确定待查之字在字典
的哪一页。对于浩如烟海的计算机中的数据,有相当多的数据
是以数组的形式组织与存放的。以数组的形式组织和存放数据
的数据结构被称为顺序表。对于顺序表的查找,人们已经发明
了许多种算法,典型的有顺序查找和二分(折半、对分)查找。
顺序查找是将待查值与顺序表(数组)中的每个元素逐一比
较,直至查找成功或到达数组的最后一个元素还未找到。这种

二分查找是在一个有序表(数据是按其值由小到大或由大到
小依次存放的,这里我们以值由小到大排列为例)中,每次都与
中间的那个元素比较,若相等则查找成功;否则,调整查找范
围,若中间那个元素的值小于待查值,则在表的后一半中查
找;若中间那个元素的值大于待查值,则在表的前一半中查
找;如此循环,每次只与一半中的一个元素比较,可使查找效

请输入要查找的整数 68
所查整数在数组中的位置下标是:7

这个程序的查找过程及其查找元素的位置(数组下标)的变
化如图6.3所示。在这个程序中,为了让读者能从键盘输入“整
数”(这里对整数二字加引号是因为Java把键盘的任何输入都当
成字符流来处理),使用了尚未学到的输入输出流语句:
关于输入输出流的知识请参阅第12章“文件和流”,这里只简要

图6.3 二分查找的比较与下标调整过程

向成员方法传递数组元素
向成员方法传递数组元素也就是用数组元素作为成员方法
的实参。由于实参可以是表达式,而数组元素可以是表达式的
组成部分,因此,数组元素可以作为成员方法的实参。数组元
素作为成员方法的实参与用变量作为实参一样,是单向值传
递,即只能由数组元素传递给形参,程序中对形参的任何修改
并不改变数组元素的值。
【示例程序c6_5.java】 数组元素作为成员方法的实参,在
成员方法中改变形参x和y的值,方法调用结束后实参数组元素

在定义成员方法时可以用数组作为它的形参,且只指定数
组名和它的数据类型,而不指定数组的长度。在这种情况下引
用该成员方法时,必须用具有相同数据类型的数组名作为成员
方法对应位置的实参,即向成员方法传递数组。更应强调的是:
数组名作为成员方法的实参时,是把实参数组的起始地址传递
给形参数组,即两个数组共用同一段内存单元,因此,在成员
方法中对形参数组中各元素值的修改,都会使实参数组元素的
值也发生同样的变化。这种参数的传递方式被称为“双向地址传
【示例程序c6_6.java】 两个数组相加,将结果存入第二个

从程序的执行结果中可以看出,数组arY的值在调用成员方
法add前后是不同的。这是因为成员方法add中的形参数组arB与
实参数组arY共用同一块存储单元,因此,在成员方法add中对
形参数组arB各数组元素值的修改,也就是对实参数组arY中各
数组元素的修改。这一过程如图6.4所示。

图6.4 数组名用作实参的“双向地址传递”
0
0
0
开始调用成员方法add时
成员方法add调用结束时

同类型不同长度的数组引用同一个成员方法
在Java语言中,数组也是一种对象,因此,只要数组元素
的数据类型相同,而不论其长度是否一致,都可以引用同一个
成员方法,完成所需要的操作。
【示例程序c6_7.java】 有两个一维数组s1和s2,s1存放着8
名学生的成绩,s2存放着5名学生的成绩,分别求出这两组学生

在这个程序中,尽管两个数组的长度不同(分别为8和5),但
其数据类型相同,因此,可以引用同一个成员方法(计算平均成
绩)来完成所需要的操作。这是由于在定义该成员方法时要求以
数组作为参数。我们已经知道,数组名作为成员方法的实参
时,是把实参数组的起始地址连同它所占据的存储空间传递给
形参数组,使形参数组与实参数组共用同一段内存单元,实参
数组的长度也就是形参数组的长度,因此,不论该实参数组的
长度如何,只要其数据类型相同,都可以引用同一个成员方法。

排序是把一组数据按照值的递增(由小到大,也称为升序)
或递减(由大到小,也称为降序)的次序重新排列的过程,它是
数据处理中极其常用的运算。利用数组的顺序存储特点,可方
便的实现排序。排序算法有多种,这里只讨论较易理解的冒泡
排序和选择排序两种,且要求排序结果为升序。

冒泡排序的关键点是从后向前对相邻的两个数组元素进行
比较,若后面元素的值小于前面元素的值,则将这两个元素交
换位置,否则不进行交换。依次进行下去,第一趟排序可将数
组中值最小的元素移至下标为0的位置。对于有n个元素的数
组,循环执行n-1趟扫描便可完成排序。(当然,也可以从前向
后对相邻的两个数组元素进行比较,但此时应注意将大数向后
移,与小者前移的冒泡法相对应,可将这种大者后移的排序称
为下沉法)。图6.5演示了有6个元素的数组实施冒泡法排序(小数
前移)的前两趟比较与交换过程。可以看出,第一趟排序后最小
数12已移到了下标为0的正确位置;第二趟排序后次小数17移到
了下标为1的正确位置。

图6.5 冒泡法对6个数据排序的两趟扫描中比较与交换的过程

请从键盘输入8个整数,一行只输入一个数

冒泡法排序相对比较容易理解,但排序过程中元素的交换
次数较多,特殊情况下每次比较都要进行交换(例如,若要将以
择法排序每执行一次外循环只进行一次数组元素的交换,可使
选择法排序的基本思想是首先从待排序的n个数中找出最小
对换,依此类推。每比较一轮,找出待排序数中最小的一个数
进行交换,共进行n-1次交换便可完成排序。图6.6演示了这一过

图6.6 选择法排序的交换过程

前面讨论的数组的数据类型都是简单的基本类型,即数组
元素是简单数据类型。但实际问题中往往需要把不同类型的数
据组合成一个有机的整体,以便于引用。例如,一名学生的姓
名、性别、年龄和各科学习成绩等都与这名学生紧密相关,而
一个班(乃至更多)的学生又都具有这些属性,如表6.1所示。如
果将这些数据项定义为相互独立的简单变量是难以反映它们之
间的内在联系的,应当将它们组织在一起形成一种数据结构。
这种数据结构在过去的结构化程序设计中被称为记录或结构
体,而在面向对象的程序设计中把这种结构也称为对象。

由自定义的对象作为数组元素所构成的数组被称为对象数
组,也就是说,对象数组是指数组的每一个元素都是具有相同属
性的对象,或者说,如果一个类有若干个对象,我们可以把这一
系列同类的对象用一个数组来存放。
【示例程序c6_10.java】 设有若干名学生,每个学生有姓名、
性别和成绩三个属性,要求将每个学生作为一个对象,建立获取
对象名字的成员方法getName和获取对象性别的成员方法
getSex,以及输出对象的全部数据成员的成员方法studPrint。

这里要注意的是:Java中只有一维数组,却不存在称为“二
维数组”的明确结构。然而对一个一维数组而言,其数组元素可
以是数组,这就是概念上的二维数组在Java中的实现方法。也
就是说,在Java语言中,把二维数组实际上看成是其每个数组
元素是一个一维数组的一维数组。其实,这里面的最根本原因
是计算机存储器的编址是一维的,即存储单元的编号从0开始一
直连续编到最后一个最大的编号。因此,如果把图6.7所示的矩
阵用6.8所示的二维数组表示,则在计算机中的存放形式如图6.9
所示。在图6.9中把每一行看成一个数组元素,则有三行的数组
可看成只有三个数组元素,只不过这三个元素又是由三个元素

图6.9 二维数组在Java中的实现

二维数组的声明与一维数组类似,只是需要给出两对方括
类型说明符 数组名[ ][ ];
类型说明符[ ][ ] 数组名;
其中:类型说明符可以是Java的基本类型、类或接口;数组名是
用户遵循标识符命名规则给出的一个标识符;两个方括号中前面
的方括号表示行,后面的方括号表示列。

二维数组声明同样也是为数组命名和指定其数据类型的。
它不为数组元素分配内存,只有经初始化后才能为其分配存储
空间。二维数组的初始化也分为直接指定初值和用new操作符
用new操作符来初始化数组有两种方式:

(1) 先声明数组再初始化数组。在数组已经声明以后,可用
下述两种格式中的任意一种来初始化二维数组。
数组名=new 类型说明符[数组长度][ ];
数组名=new 类型说明符[数组长度][ 数组长度];
其中:对数组名、类型说明符和数组长度的要求与一维数组一

上述两条语句声明并创建了一个3行4列的数组arra。也就是
说arra数组有3个元素,而每一个元素又都是长度为4的一维数组。
实际上共有12个元素,共占用12*4=48个字节的连续存储空间。

也就是说,在初始化二维数组时也可以只指定数组的行数
而不给出数组的列数,每一行的长度由二维数组引用时决定。
但不能只指定列数而不指定行数。
上述语句的作用如图6.10所示。

在数组声明时对数据元素赋初值就是用指定的初值对数组
声明并初始化数组arr1,它有3个元素,每个元素又都是有3个元
用指定初值的方式对数组初始化时,各子数组元素的个数

测定数组的长度及数组赋值
与一维数组一样,也可以用.length成员方法测定二维数组的
长度,即元素的个数。只不过当使用“数组名.length”的形式测定
的是数组的行数;而使用“数组名[i].length”的形式测定的是该行
的列数。例如,若有如下的初始化语句:


按一定格式排列起来的,具有相同类型的数据元素的集合。

若线性表中的数据元素为非结构的简单元素,则称为一维数组。

线性结构。定长的线性表。

数据类型 变量名称[长度];

若一维数组中的数据元素又是一维数组结构,则称为二维数组。

非线性结构:每一个数据元素即在一个行表中,又在一个列表中。

线性结构-定长的线性表:该线性表的每个数据元素也是一个定长的线性表。

数据类型 变量名称[行数][列数];

在C语言中,一个二维数组类型也可以定义为一维数组类型(其分量类型为一维数组类型),即:

若二维数组中的元素又是一个一维数组,则称作三维数组。

n维数组:若n-1维数组中的元素又是一个一维数组结构,则称作n维数组。

线性表结构是数组结构的一个特例,而数组结构又是线性表结构的扩展。

结构固定——定义后,维数和维界不再改变。

除了结构的初始化和销毁之外,只有取元素和修改元素值的操作。

 二维数组的行序优先表示

 以行序为主序:

三维数组的元素存储位置

其中:i1*m2*m3表示前i1页总元素个数;i2*m3表示第i1页的前i2行总元素个数;i3表示第i2行前i3列元素个数。

n维数组的元素存储位置

设有一个二维数组A[m][n]按行优先顺序存储,假设A[0][0]存放位置在644(10),A[2][2]存放位置在676(10),每个元素占一个空间,问A[3][3](10)存放在什么位置?(脚注(10)表示用10进制表示)

矩阵:一个由m * n 个元素排成的m行n列的表。

矩阵的常规存储:将矩阵描述为一个二维数组。

矩阵的常规存储的特点:可以对其元素进行随机存取;矩阵运算非常简单;存储的密度为1。

不适宜常规存储的矩阵:值相同的元素很多且呈某种规律分布;零元素多。

矩阵的压缩存储:为多个相同的非零元素只分配一个存储空间;对零元素不分配空间。

 什么是压缩存储

若多个数据元素的值都相同,则只分配一个元素值的存储空间,且零元素不占存储空间。

一些特殊矩阵,如:对称矩阵,对角矩阵,三角矩阵,稀疏矩阵等。

矩阵中非零元素的个数较少(一般小于5%)。

在n*n的矩阵a中,满足如下性质:

只存储下(或者上)三角(包括主对角线)的数据元素。共占用n(n+1)/2个元素空间。

对称矩阵上下三角中的元素数均为:n(n+1)/2,可以以行序为主序将元素存放在一个一维数组sa[n(n+1)/2]中。

例如:以行序为主序存储下三角:

对角线一下(或者以上)的数据元素(不包括对角线)全部为常数c。

 对角矩阵(带状矩阵)

在n*n的方阵中,所有非零元素都集中在以主对角线为中心的带状区域中,区域外的值全为0,则称为对角矩阵。常见的有三对角矩阵、五对角矩阵、七对角矩阵等。

下图是一个7*7的三对角矩阵: 

使用二维数组存储,以对角线顺序存储

设在m*n的矩阵中有t个非零元素,

三元组(i, j, aij)唯一确定矩阵的一个非零元。

存各非零元的值、行列位置和矩阵的行列数。

三元组的不同表示方法可决定稀疏矩阵不同的压缩存储方法。

 注意:为更可靠描述,通常在0位置再加一个“总体”信息:即总行数、总列数、非零元素总个数

对于下面用三元组表示的稀疏矩阵,请分别写出它们所对应的稀疏矩阵。

 从三元组表还原稀疏矩阵时,首先根据表的第1行得出稀疏矩阵的行数和列数,否则,我们无法确定所求的稀疏矩阵的维数,然后根据三元组表所提供的行号和列号在稀疏矩阵的对应位置上写上相应的元素的值,在其他地方补零即可,根据上述原则,此题答案如图(1),(2)所示。

三元组顺序表又称有序的双下标法。

三元组顺序表的优点:非零元在表中按行序存储,因此便于进行依次顺序处理的矩阵运算。

三元组顺序表的缺点:不能随机存取。若按行号存取某一行中的非零元,则需从头开始进行查找。

优点:它能够灵活地插入因运算而产生的新的非零元素,删除因运算而产生的新的零元素,实现矩阵的各种运算。

·  在十字链表中,矩阵的每一个非零元素用一个结点表示,该结点除了(row, col, value)以外,还要有两个域:

right:用于链接同一行中的下一个非零元素;

down:用以链接同一列中的下一个非零元素。

十字链表中结点的结构示意图

简介: 一天学完spark的Scala基础语法教程七、数组(idea版本)

Scala 语言中提供的数组是用来存储固定大小的同类型元素,数组对于每一门编辑应语言来说都是重要的数据结构之一。

声明数组变量并不是声明 number0、number1、...、number99 一个个单独的变量,而是声明一个就像 numbers 这样的变量,然后使用 numbers[0]、numbers[1]、...、numbers[99] 来表示一个个单独的变量。数组中某个指定的元素是通过索引来访问的。

数组的第一个元素索引为【0】,最后一个元素的索引为元素总数减1。

以下是 Scala 数组声明的语法格式:

// 计算数组所有元素的总和 // 查找数组中的最大元素

到这里有关一天学完spark的Scala基础语法教程七、数组(idea版本)就结束了

Scala数组这里的用法相对来说比较讨厌,不是很容易掌握,需要多练练啊。

希望能对大家有所帮助。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《》和《》。如果您发现本社区中有涉嫌抄袭的内容,填写进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

我要回帖

更多关于 java数组的格式 的文章

 

随机推荐