目录
一、数组的定义及使用
数组是一组相关数据的集合,一个数组实际上就是一连串的变量,数组按照使用可以分为一维数组、二维数组、多维数组。
1、一维数组
一维数组可以存放上千万个数据,并且这些数据的类型是完全相同的。
使用数组的两个步骤:(1)声明数组(2)分配内存。
1.1、声明数组(栈内)
1.数据类型 数组名[] = null ;
int score[] = null;à //null表示引用数据类型的默认值
2.数据类型[] 数组名= null ;
“数据类型”是声明数组元素的数据类型,常见类型有整型、浮点型、字符型等。
“数组名”是统一这组相同数据类型的元素的名称,其命名规则和变量的相同。
数组声明后实际上是在栈内存中保存了此数组的名称,接下来便是要在堆内存中配置数组所需的内存。
![](https://i-blog.csdnimg.cn/blog_migrate/aab211ab1bde97556ff50084b86384e7.png)
1.2、分配内存(堆内)
1.数组名 = new 数据类型[长度];
score = new int[3];
2.数据类型 数组名[] = new 数据类型[个数]
int score[] = new int[3];
堆栈内存
数组操作中,在栈内存中保存的永远是数组的名称,只开辟了栈内存空间数组是永远无法使用的,必须有指向的堆内存才可以使用。之后只是将此堆内存的使用权交给了对应的栈内存空间。
开辟新的堆内存则必须使用new关键字,命令编译器根据括号里的长度开辟空间。“长度”是告诉编译器,所声明的数组要存放多少个元素。
一个堆内存空间可以同时被多个栈内存空间指向,即:一个人可以有多个名字,人就相当于堆内存,名字就相当于栈内存。
![](https://i-blog.csdnimg.cn/blog_migrate/7ad40c9554dd538df09d8051467b6406.png)
![](https://i-blog.csdnimg.cn/blog_migrate/bb90da77edf7baf0306a30ced836adfd.png)
声明一个元素个数为10的整型数组score,同时开辟一块内存空间供其使用。
在Java中,由于整数数据类型所占用的空间为4个bytes,而整型数组score可保存的元素有10个,所以上例中占用的内存共有4 * 10 = 40个字节
![](https://i-blog.csdnimg.cn/blog_migrate/8e67b29410a36b9761207cfdb5d60434.png)
2、数组中元素的表示方法
访问数组里的元素可以利用索引。数组索引编号由0开始。
以一个的score[10]的整形数组为例,score[0]代表第1个元素,score[1]代表第2个元素,score[9]为数组中第10个元素(最后一个元素)。
score[10]:score[0]...score[9]
![](https://i-blog.csdnimg.cn/blog_migrate/4120fb1f912d5c1d37a2f8399ed28699.png)
【例】数组的声明和输出
![](https://i-blog.csdnimg.cn/blog_migrate/91cd74e239dfaae2f51e5889c5af8848.png)
运行结果:
![](https://i-blog.csdnimg.cn/blog_migrate/b4ff440162e395cde48ca233e359dceb.png)
【例】为数组中的元素赋值并进行输出
![](https://i-blog.csdnimg.cn/blog_migrate/ed7d90cdde446b1dd21b7dbfce435b8a.png)
运行结果:
![3e48ff72891a47108697015cbd5bd0ef.png](https://i-blog.csdnimg.cn/blog_migrate/004617e38bac8210a73d3ad338f1aad3.png)
取得数组长度
数组名称.length //返回一个int型数据
【例】取得一个数组的长度
![](https://i-blog.csdnimg.cn/blog_migrate/d3a3bd223504af7d9c7b7e58ae83d876.png)
运行结果:
![47c1ab0482e54e52b3121378f46e8c89.png](https://i-blog.csdnimg.cn/blog_migrate/f12f97752762a20d8ad4ad6cc900289f.png)
3、数组的静态初始化
数组的内容分为动态初始化和静态初始化两种,动态初始化:先声明数组,再为每个内容赋值。静态化初始:声明数组时指定其具体内容
数据类型 数组名[] = {初值0 , 初值1 , … , 初值n}
int score[] = {91,92,93,94,95,96};//声明并赋初值
【例】数组的静态初始化
![](https://i-blog.csdnimg.cn/blog_migrate/2938720771ef0c203bc662becb4a6eec.png)
运行结果:
![36cd5cf0f6dd4828a84da19414c9f069.png](https://i-blog.csdnimg.cn/blog_migrate/7bbe460475c4bb1e7cfc26179d4f2c83.png)
4、数组应用范例
【例】求出数组中的最大值和最小值
![](https://i-blog.csdnimg.cn/blog_migrate/e3ebcffb5256ab17d1188061380c775c.png)
运行结果:
![4503d9ff7ff2450eb0f011bc9f1a719d.png](https://i-blog.csdnimg.cn/blog_migrate/703e9048cfef47923effbf4c55ce88ba.png)
【例】对整型数组按照由小到大的顺序进行排列(冒泡)
![](https://i-blog.csdnimg.cn/blog_migrate/5bd8882af7b1c85f6dcb8372ee763c90.png)
运行结果:
![](https://i-blog.csdnimg.cn/blog_migrate/f53b76b49daeae0881661fe85c58a4d7.png)
【例】修改前代码,显示每次排序结果
![](https://i-blog.csdnimg.cn/blog_migrate/edb9e6084e9a8e0fc0721409220139c4.png)
运行结果:
![](https://i-blog.csdnimg.cn/blog_migrate/55a9a67fc6ab61fb90753b3f17f17dab.png)
5、二维数组
如果把一维数组当成几何中的线性图形,那么二维数组就相当于一个表格。二维数组声明的方式和一维数组类似,内存的分配也是用new这个关键字。
5.1、动态初始化
1.数据类型 数组名[][];
数组名 = new 数据类型[行的个数][列的个数];
int score[][];//声明数组
score = new int[4][3];//配置内存
2.数据类型 数组名[][] = new 数据类型[行的个数][列的个数];
int score[][] = new int[4][3];
【例】二维数组的定义及使用
![](https://i-blog.csdnimg.cn/blog_migrate/41dad33c751bed15e166867a34fd24a7.png)
运行结果:
![bf9180cd59b445e18a277dcba900f2a8.png](https://i-blog.csdnimg.cn/blog_migrate/2e8dbdd02ec384da0783ae1b473aedd9.png)
5.2、静态初始化
数据类型 数组名[][] = { {第0行初值},{第1行初值},…{第n行初值},};
int score[][] = { { 67, 61 }, { 78, 89, 83 }, { 99, 100, 98, 66, 95 } };
![](https://i-blog.csdnimg.cn/blog_migrate/3f7d4be1a3d2656b58db8412576ff3d8.png)
【例】使用静态初始化声明一个二维数组
运行结果:
6、多维数组
提高数组的维数,只需在声明数组的时候将索引与中括号再加一组,三维数组的声明为int score[][][],而四维数组为int score[][][][] …,以此类推。
【例】定义和使用三维数组
![](https://i-blog.csdnimg.cn/blog_migrate/29a2a9c7502bb93beebe06fe021e8134.png)
运行结果:
![](https://i-blog.csdnimg.cn/blog_migrate/f94e1da730488c5dd973f67470329a3f.png)
二、方法的声明及使用
1、方法的定义
方法:一段可重复调用的代码段
定义格式:
![](https://i-blog.csdnimg.cn/blog_migrate/adff7717f3dc2a0921d1271bdb41b45c.png)
public static void main(String[] args){}
【例】在主方法中调用一个方法
![](https://i-blog.csdnimg.cn/blog_migrate/37cfa3a37b0f3dc17ae3bbbe4bf98550.png)
运行结果:
![fb0eaf9308ec472ba37b016bb10699cd.png](https://i-blog.csdnimg.cn/blog_migrate/2912741163dc0dc8be6ccc62f9a2bf20.png)
printInfo()方法执行流程图
![](https://i-blog.csdnimg.cn/blog_migrate/96934f09e8538cf6bb043ad89cc9fcde.png)
当调用printInfo()方法的时候,程序就会跳转到printInfo()方法中执行,当printInfo()方法全部执行完之后就会返回调用处向下继续执行。
方法命名规范要求
第一个单词的首字母小写,之后每个单词的首字母大写。
【例】有返回值的方法
![](https://i-blog.csdnimg.cn/blog_migrate/30a3d332161a3c816490c999eff755ca.png)
运行结果:
![3b83b93a7e1d46418d52192a13cf2560.png](https://i-blog.csdnimg.cn/blog_migrate/323ff0a815297b5000a459d7935bd91b.png)
2、方法的重载
方法名称相同,参数的类型和个数不同,通过传递参数的个数及类型不同以完成不同功能的方法调用。
【例】验证方法的重载
![](https://i-blog.csdnimg.cn/blog_migrate/47eabbffbb1b4e3875dd2548da516359.png)
运行结果:
![](https://i-blog.csdnimg.cn/blog_migrate/009d17b21b0fc5f882083f24d22b2957.png)
方法重载的调用
从程序中可以发现add()方法被重载了三次,而且每次重载时的参数类型或个数都有不同,所以在调用的时候,会根据参数的类型和个数自动进行区分。
![](https://i-blog.csdnimg.cn/blog_migrate/d1e1231c31c3a8094a63aa824fe2f9ec.png)
System.out.println()方法也属于重载方法
对于屏幕打印语句:System.out.print()方法来说可以打印任何的数据:
System.out.println(3); // 输出整数
System.out.println(33.3); // 输出浮点数
System.out.println('3'); // 输出字符
System.out.println(true); // 输出布尔型
System.out.println(3 + 3); // 输出计算结果
重载的注意事项
方法的重载一定只是在参数上的类型或个数不同,而下面的代码根本不叫方法重载:
![](https://i-blog.csdnimg.cn/blog_migrate/6fe4b74a2465d68bbd7c9e9d76da3875.png)
3、使用return结束一个方法
在java的方法定义中,可以使用return语句直接结束方法
【例】使用return语句直接结束方法
![](https://i-blog.csdnimg.cn/blog_migrate/88b3f476a2aa38f1470d8d20cb447836.png)
运行结果:
![](https://i-blog.csdnimg.cn/blog_migrate/c952df15e3c4442508211aa1bc7b7e43.png)
4、方法的递归调用
递归调用是一种特殊的调用形式,是方法自己调用自己 。
![e15c7c303afc4ea69b17579202a76253.png](https://i-blog.csdnimg.cn/blog_migrate/fc3093eb74c864aa7d679629a5358a1e.png)
【例】递归调用 —— 数字的累加操作
![](https://i-blog.csdnimg.cn/blog_migrate/cb8f396765de800ea80197f6b6de6378.png)
运行结果:
![9d204766852a407fa39cc2dd4dbf208a.png](https://i-blog.csdnimg.cn/blog_migrate/9407fbfeafe8557c5e7d2bf854acacd6.png)
三、数组的引用传递
1、传递及返回数组
之前的方法操作传递和返回的都是基本数据类型,但是方法中也可用来传递和返回数组。 如果要向方法中传递一个数组,则方法的接收参数处必须是符合其类型的数组。
而且数组属于引用数据类型,在把数组传递进方法之后,如果方法对数组本身做了任何修改,修改结果都是会保存下来的。
【例】向方法中传递数组
![](https://i-blog.csdnimg.cn/blog_migrate/ff2ea1f1c1a070847501a62fb5ad43c9.png)
运行结果:
![3199c968a0414ceb8b3798098e4689bc.png](https://i-blog.csdnimg.cn/blog_migrate/0df188a37e7778dc2643c4bcd4adf1c8.png)
内存状态
使用方法返回一个数组
方法可以接收一个数组,也可以返回一个数组,只需要在返回值类型声明处明确的写出返回的数组类型即可。
【例】使用方法返回一个数组
![](https://i-blog.csdnimg.cn/blog_migrate/114af8f77cab657ed77daa7caefc633c.png)
运行结果:
![](https://i-blog.csdnimg.cn/blog_migrate/2babc810afc11ef566a3597a2544d4fe.png)
2、范例 数组排序
【例】数组排序
![](https://i-blog.csdnimg.cn/blog_migrate/a3603445c72d32e0a581bd62250b181e.png)
运行结果:
![](https://i-blog.csdnimg.cn/blog_migrate/af63d184207e8c99833a7f421ba00576.png)
引用传递
![](https://i-blog.csdnimg.cn/blog_migrate/3a7f6c53d02e44ad7df55ca4f44dc3eb.png)
【例】使用Java类库完成数组的排序操作
![](https://i-blog.csdnimg.cn/blog_migrate/ad9662118b803036b26729b9b93fbafc.png)
运行结果:
![](https://i-blog.csdnimg.cn/blog_migrate/79f7777e9bdba972f2361be05df8babf.png)
3、范例 数组复制
给定两个数组,可以将其中一个数组的指定位置的内容拷贝另外一个数组。
使用方法,在方法中接收五个参数:“源数组名称、源数组开始点、目标数组名称、目标数组开始点、拷贝长度”,则按照以上的思路完成代码。
【例】数组复制
![](https://i-blog.csdnimg.cn/blog_migrate/b5a02cd1fea826c670d34ff41ffb6e4e.png)
运行结果:
![](https://i-blog.csdnimg.cn/blog_migrate/9d5ca182cd7e393d267c52fd1595bf25.png)
【例】使用Java类库完成数组的复制操作
Arraycopy()
![](https://i-blog.csdnimg.cn/blog_migrate/2c0b962f1a2352d36b47f00fc0bd6a02.png)
运行结果:
![](https://i-blog.csdnimg.cn/blog_migrate/5da2e3cd3e8093b1218ddb7052f0b784.png)
四、Java新特性对数组的支持
1、可变参数
在调用一个方法时,必须根据方法的定义传递指定的参数,但是在JDK 1.5(JAVA SE 5.0)之后产生了新的概念 —— 可变参数,即:方法中可以接收的参数不再固定,而是随着需要传递的,可变参数的定义格式如下:
返回值类型 方法名称(类型…参数名称){}
【例】使用可变参数定义方法
运行结果:
2、foreach输出
数组的输出,一般都会使用for循环输出,但在JDK 1.5之后为了方便数组的输出,提供了一种foreach语法,此语法的使用格式如下:
for(数据类型 变量名称 : 数组名称){
…
}
【例】使用foreach语法输出数组内容
运行结果: