第6章创建和使用数组

本章内容

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"}); }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值