本章内容
l第一节 声明和使用数组
l第二节 多维数组
l第三节 命令行参数
l第四节 可变参数
第一节 声明和使用数组
数组
数组是多个相同类型数据的组合,实现对这些数据的统一管理
数组中的元素可以是任何数据类型,包括基本类型和引用类型
数组属引用类型,数组型数据是对象(object),数组中的每个元素相当于该对象的成员变量
一维数组声明
一维数组的声明方式:
type var[] 或 type[] var;
例如:
int a[];
int[]a1;
double b[];
Mydate[]c; //对象数组
Java语言中声明数组时不能指定其长度(数组中元素的数),
例如:int a[5];//非法
一维数组初始化
动态初始化:数组声明且为数组元素分配空间与赋值的操作分开进行
int[] arr = new int[3]; arr[0] =3; arr[1] =9; arr[2] =8; | MyDate dates[]; dates= new MyDate[3]; dates[0]= new MyDate(22, 7, 1964); dates[1]= new MyDate(1, 1, 2000); dates[2]= new MyDate(22, 12, 1964); |
静态初始化:在定义数组的同时就为数组元素分配空间并赋值。
int a[] = new int[]{ 3, 9, 8}; int[] a = {3,9,8}; | MyDate dates[] = { new MyDate(22, 7, 1964), new MyDate(1, 1, 2000), new MyDate(22, 12, 1964) } |
创建基本数据类型数组 (1)
lJava中使用关键字new创建数组对象
l创建基本数据类型一维数组对象
public class Test{ public static void main(String args[]){ int[]s;//处内存状态 s= new int[10]; for( inti=0;i<10;i++) { s[i] =2*i+1; System.out.println(s[i]); } } }
创建基本数据类型数组(2)
l创建基本数据类型一维数组对象
public class Test{ public static void main(String args[]){ int[] s; s = new int[10];//处内存状态 //int[] s=new int[10]; //基本数据类型数组如果没有赋初值, //Java自动给他们赋默认值。 for ( int i=0; i<10; i++ ) { s[i] =2*i+1; System.out.println(s[i]); } } }
创建基本数据类型数组(3)
l创建基本数据类型一维数组对象
public class Test{ public static void main(String args[]){ int[] s; s =new int[10]; for ( int i=0; i<10; i++ ) { s[i] =2*i+1; System.out.println(s[i]); } } }
练习
1.练习一
1.创建一个char类型的26个元素的数组,分别放置'A'-'Z‘。
2.使用for循环访问所有元素并打印出来。
3.提示:char类型数据运算'A'+1 -> 'B','0'+1 -> '1‘
2.练习二
1.创建一个char类型的36个元素的数组,前26个元素放置'A'-'Z‘, 后10个元素放置'0'-'9‘。
2.使用for循环访问所有元素并打印出来。
创建对象数组 (1)
l创建元素为引用类型(对象)的数组
class MyDate{ private int day; private int month; private int year; public MyDate(int d, int m, int y){ day= d; month = m; year = y; } public void display(){ System.out.println(year + "-" + month +"-" + day); } }
创建对象数组 (2)
l创建元素为引用类型(对象)的数组演示
public class Test{ public static void main(String args[]){ MyDate[] m; m= new MyDate[10]; for( int i=0; i<10; i++ ) { m[i] =new MyDate(i+1, i+1,1990+i); m[i].display(); } } }
创建对象数组 (3)
l创建元素为引用类型(对象)的数组演示
public class Test{ public static void main(String args[]){ MyDate[] m; m= new MyDate[10]; for( int i=0; i<10; i++ ) { m[i] =new MyDate(i+1, i+1,1990+i); m[i].display(); } } }
创建对象数组 (4)
lJava中使用关键字new 创建数组对象
public class Test{ public static void main(String args[]){ MyDate[] m; m = new MyDate[10]; for ( int i=0; i<10; i++ ) { m[i] =new MyDate(i+1, i+1,1990+i); m[i].display(); } } }
for循环执行三次后内存状态:
数组元素的默认初始化
l数组是引用类型,它的元素相当于类的成员变量,因此数组一经分配空间,其中的每个元素也被按照成员变量同样的方式被隐式初始化。例如:
publicclass Test {
publicstatic void main(String argv[]){
int a[]= new int[5];
System.out.println(a[3]); //a[3]的默认值为0
}
}
对于基本数据类型而言,默认初始化值各有不同
对于引用数据类型而言,默认初始化值为null(注意与0不同!)
数组元素的引用
定义并用运算符new为之分配空间后,才可以引用数组中的每个元素;
数组元素的引用方式:数组名[数组元素下标]
数组元素下标可以是整型常量或整型表达式。如a[3], b[i] ,c[6*i];
数组元素下标从0开始;长度为n的数组合法下标取值范围:
0 -> n-1;
如int
a[] = new int[3]; 可引用的数组元素为a[0]、a[1]、a[2]
每个数组都有一个属性length指明它的长度,例如:a.length 指明数组a的长度(元素个数)
数组一旦初始化,其长度是不可变的
练习
1.声明一个intArray方法,其参数为整型数组。在main方法中创建20个元素的数组,并将其传递给intArray方法。
2.intArray方法中将数组中存放2开始的20个偶数。然后使用增强型for循环访问所有元素并打印出来。
1.定义类Student,包含三个属性:学号number(int),年级state(int),成绩score(int)。 创建20个学生对象,学号为1到20,年级和成绩都由随机数确定,打印出3年级(state值为3)的学生信息。
● 提示:
生成随机数:Math.random(),返回值类型double;
四舍五入取整:Math.round(double d),返回值类型long。
1. 从键盘读入学生成绩,找出最高分,并输出学生成绩等级。
成绩>=最高分-10 等级为’A’
成绩>=最高分-20 等级为’B’
成绩>=最高分-30 等级为’C’
其余 等级为’D’
提示:先读入学生人数,根据人数创建int数组,存放学生成绩。
第二节 多维数组
多维数组
二维数组[][]:数组中的数组 |
格式1(动态初始化):int[][] arr = new int[3][2]; |
定义了名称为arr的二维数组 二维数组中有3个一维数组 每一个一维数组中有2个元素 一维数组的名称分别为arr[0], arr[1], arr[2] 给第一个一维数组1脚标位赋值为78写法是:arr[0][1] = 78; |
格式2(动态初始化):int[][] arr = new int[3][]; |
二维数组中有3个一维数组。 每个一维数组都是默认初始化值null (注意:区别于格式1) 可以对这个三个一维数组分别进行初始化 arr[0] = new int[3]; arr[1] = new int[1]; arr[2] = new int[2]; 注:int[][] arr = new int[][3]; //非法 |
格式3(静态初始化):int[][] arr = new int[][]{{3,8,2},{2,7},{9,0,1,6}}; |
定义一个名称为arr的二维数组,二维数组中有三个一维数组 每一个一维数组中具体元素也都已初始化 第一个一维数组 arr[0] = {3,8,2}; 第二个一维数组 arr[1] = {2,7}; 第三个一维数组 arr[2] = {9,0,1,6}; 第三个一维数组的长度表示方式:arr[2].length; |
注意特殊写法情况:int[] x,y[]; x是一维数组,y是二维数组。 Java中多维数组不必都是规则矩阵形式 |
练习2:获取arr数组中所有元素的和。使用for的嵌套循环即可。
练习3
声明:int[] x,y[]; 以下选项允许通过编译的是:
a ) x[0] = y;
b) y[0]= x;
c) y[0][0]= x;
d) x[0][0]= y;
e) y[0][0]= x[0];
f) x = y;
一维数组:int[]x 或者intx[]
二维数组:int[][]y 或者 int[]y[] 或者int y[][]
练习4
使用二维数组打印一个 10 行杨辉三角.
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
....
【提示】
1. 第一行有 1 个元素, 第 n 行有 n 个元素
2. 每一行的第一个元素和最后一个元素都是1
3. 从第三行开始, 对于非第一个元素和最后一个元素的元素.
yanghui[i][j] = yanghui[i-1][j-1]+ yanghui[i-1][j];
数组中涉及的常见算法
1.求数组元素的最大值、最小值、平均数、总和等
2.数组的复制、反转
3.数组元素的排序
练习5
定义一个int型的一维数组,包含10个元素,分别赋一些随机整数,然后求出所有元素的最大值,最小值,平均值,和值,并输出出来。
练习 6
使用简单数组
(1)创建一个名为TestArray的类,在main()方法中声明array1和array2两个变量,他们是int[]类型的数组。
(2)使用大括号{},把array1初始化为8个素数:2,3,5,7,11,13,17,19。
(3)显示array1的内容。
(4)赋值array2变量等于array1,修改array2中的偶索引元素,使其等于索引值(如array[0]=0,array[2]=2)。打印出array1。
思考:array1和array2是什么关系?
拓展:修改题目,实现array2对array1数组的复制
数组排序
插入排序
直接插入排序、折半插入排序、Shell排序
交换排序
冒泡排序、快速排序(或分区交换排序)
选择排序
简单选择排序、堆排序
归并排序
基数排序
排序方法的选择
(1)若n较小(如n≤50),可采用直接插入或直接选择排序。
当记录规模较小时,直接插入排序较好;否则因为直接选择移动的记录数少于直接插入,应选直接选择 排序为宜。
(2)若文件初始状态基本有序(指正序),则应选用直接插入、冒泡或随机的快速排序为宜;
(3)若n较大,则应采用时间复杂度为O(nlgn)的排序方法:快速排序、堆排序或归并排序。
冒泡排序
排序思想:
相邻两元素进行比较,如有需要则进行交换,每完成一次循环就将最大元素排在最后(如从小到大排序),下一次循环是将其它的数进行类似操作。
数组排序
java.util.Arrays类的sort()方法提供了数组元素排序功能:
import java.util.*; public classSort { public staticvoid main(String[] args){ int[] number ={5,900,1,5,77,30,64,700}; Arrays.sort(number); for(int i= 0; i< number.length;i++) System.out.println(number[i]); } }
操作数组的工具类:Arrays
java.util.Arrays类包含了用来操作数组(比如排序和搜索)的各种方法。Arrays拥有一组static方法。
equals():比较两个array是否相等。array拥有相同元素个数,且所有对应元素两两相等。
fill():将值填入array中。
sort():用来对array进行排序。
binarySearch():在排好序的array中寻找元素。
另:System.arraycopy():array的复制。
数组操作常见问题
数组脚标越界异常(ArrayIndexOutOfBoundsException) |
int[] arr = new int[2]; System.out.println(arr[2]); 访问到了数组中的不存在的脚标时发生。 |
空指针异常(NullPointerException) |
int[] arr = null; System.out.println(arr[0]); arr引用没有指向实体,却在操作实体中的元素时。 |
第三节 命令行参数
理解main方法的语法
由于java虚拟机需要调用类的main()方法,所以该方法的访问权限必须是public,又因为java虚拟机在执行main()方法时不必创建对象,所以该方法必须是static的,该方法接收一个String类型的数组参数,该数组中保存执行java命令时传递给所运行的类的参数。
命令行参数用法举例
publicclass CommandPara{ public static void main(String[] args){ for ( inti= 0; i< args.length;i++) { System.out.println("args["+ i+ "] = " + args[i]); } } } //运行程序CommandPara.java javaCommandPara"lisa" "bily" "MrBrown" 输出结果: args[0]= lisa args[1]= bily args[2]= MrBrown
第四节 可变参数
体会可变个数的形参
//下面采用数组形参来定义方法 publicstatic void test(int a ,String[] books); //以可变个数形参来定义方法 publicstatic void test(int a ,String…books);
说明:
1.可变参数:方法参数部分指定类型的参数个数是可变多个
2.声明方式:方法名(参数的类型名...参数名)
3.可变参数方法的使用与方法参数部分使用数组是一致的
4.方法的参数部分有可变形参,需要放在形参声明的最后
public void test(String[] msg){ System.out.println("含字符串数组参数的test方法 "); } public void test1(String book){ System.out.println("****与可变形参方法构成重载的test1方法****"); } public void test1(String ... books){ System.out.println("****形参长度可变的test1方法****"); } public staticvoid main(String[] args){ TestOverload to = new TestOverload(); //下面两次调用将执行第二个test方法 to.test1(); to.test1("aa", "bb"); //下面将执行第一个test方法 to.test(new String[]{"aa"}); }