下午我们并没有在教室上课,而是在室外进行拓展活动。 我们做了三个活动。 最让我记忆犹新的是第二个活动, 叫做空中板凳。 下午大热的天, 我们组5个人相互扶持着围在一起, 到后来应该说就是抱在一起 。那个汗啊! 应该怎么说呢? 不停的流淌。。。。 我们的左腿坐在左边的人的右腿上, 右腿给右边的人坐着。 呃~ 这还是要有相当扎实的马步功底的。
至于上午讲的数组概念 并讲解了几个例子 没多大印象
数组
数组是相同类型的数据按顺序组成的一种复合数据类型
通过数组名加数组下标来使用数组中的数据。下标从0开始。
1. 声明数组
数组的声明格式:
数组元素类型 数组名[];
数组元素类型[] 数组名;
例:int MyIntArray[];
int[] MyIntArray;
可以声明任何类型的数组──原始类型或类类型
char s[];//或char[] s;
Point p? ?; // where Point is a class
声明数组仅仅指定了数组的名字和数组元素类型,在使用数组前还必须为它分配内存空间,即创建数组。
2. 创建数组
在为数组分配内存空间时必须指明数组的长度。
格式:
数组名 = new 数组元素类型 [数组元素个数];
例:s = new char?4?;
数组s获得了4个用来存放char型数据的内存空间
数组变量s中存放着这些内存单元的首地址
声明数组和创建数组可以一起完成:
int MyIntArray[]=new int[10];
例:
int arr[]=new int[5];
3. 数组元素的使用
一维数组通过下标访问自己的元素,如s[0];
下标从0开始,下标越界将发生异常;
所有的数组都有一个属性length,存储数组元素的个数,利用它可方便地完成很多操作;
float a[]=new float[6];
则a.length的值为6
4. 数组的初始化
创建数组后,系统会给每个数组元素一个默认的值。
元素类型是基本数据类型的数组,在创建数组空间时可给出各数组元素的初值,这时可省略new运算符。
int a[]={1,2,3,4,5,6,7,8,9,10};
给数组元素分配内存并为数组元素赋初值的过程称为数组初始化。初始化可分为动态初始化和静态初始化。
静态初始化
当数组元素的初始化值直接由括在大括号“{ }”之间的数据给出时,就称为静态初始化。
适用于数组的元素不多且初始元素有限时。往往和声明结合在一起使用。
其格式如下:
array_type array_Name={element1[, element2…]};
动态初始化
先用new操作符为数组分配内存,然后才为每一个元素赋初值。
创建数组元素并初始化
对象数组(引用变量数组):对以某一类的对象为元素的数组而言,创建并初始化每个数组元素是必不可少的。
Student[] stu; //定义一个Student类型数组
stu=new Student[10];
注意:
上述语句分配存储空间,创建Student类型数组,每个元素都是默认值为null的引用变量。
内存分配如下图所示:
如何创建数组元素?
执行对象的构造方法,即实例化对象。
for (int i=0;i<10;i++){
stu[i]=new Student();
}
内存分配如图4-6所示:
5. 处理数组
处理数组元素时,会经常使用for循环。
所有数组元素都是同一类型的,可以使用循环以同样的方式反复处理;
由于数组的大小已知,使用for循环比较合理。
(1) 用随机数初始化数组
以下循环用0到99之间的随机整数初始化数组myList
(2) 输出数组
为输出数组,必须使用类似下面的循环,输出数组中的每一个元素。
(3) 对所有元素求和
(4) 查找最大元素
6. 增强的for 循环
在J2SE 5.0中,Java语言增加了一种循环结构,称为增强的for循环,不用下标变量就可以顺序地访问整个数组。
例
例1:输出数组中的最大及最小值 Arraymax.java
例2:读入6个整数,找出其中的最大者,并统计其
出现的次数 TestArray.java
例3:数组元素的复制
ArrCopy.java (程序存在的问题?下页)
例4 :编程模仿扔硬币游戏 rengYingBi.java
例5:抽奖游戏:36选7(给方法传递数组参数)
RandomA1.java
例6:对象数组 ArrOb.java
7. 数组的复制
在Java中,可以使用赋值语句复制基本类型的变量,但不能复制数组。
将一个数组变量复制给另一个数组变量,实际上是一个数组的引用复制给另一个变量,使两个变量指向同样的内在地址。
复制数组有三种方法:
用循环语句逐个复制数组的元素
复制数组有三种方法:
2. 用System类中的静态方法arraycopy,不用循环
复制数组有三种方法:
用clone方法复制数组
clone方法是对象类Object中的方法,可以创建一个有单独内存空间的对象。
不是所有的对象都可以克隆。要成为一个可克隆的对象,它的类必须实现java.lang.Cloneable接口。
clone方法的返回值是Object类型,要使用强制类型转换为适当类型。
给方法传递数组参数
public static void printArray(int[] array) {
for (int i = 0; i < array.length; i++) {
System.out.print(array[i] + " ");
}
}
例
public class Test {
public static void main(String[] args) {
int x = 1; // x represents an int value
int[] y = new int[10]; // y represents an array of int values
m(x, y); // Invoke m with arguments x and y
System.out.println("x is " + x);
System.out.println("y[0] is " + y[0]);
}
public static void m(int number, int[] numbers) {
number = 1001; // Assign a new value to number
numbers[0] = 5555; // Assign a new value to numbers[0]
}
}
调用 m(x, y)时, x 和 y 的值传递给 number和 numbers。 因为 y 包含的是数组的引用值, 所以numbers 包含同一数组的相同引用值。
例:TestPassArray.java图示
从方法返回数组
int[] list1 = new int[]{1, 2, 3, 4, 5, 6};
int[] list2 = reverse(list1);
reverse 方法的运行过程
int[] list1 = {1, 2, 3, 4, 5, 6};
int[] list2 = reverse(list1);
reverse 方法的运行过程
int[] list1 = new int[]{1, 2, 3, 4, 5, 6};
int[] list2 = reverse(list1);
reverse 方法的运行过程
int[] list1 = new int[]{1, 2, 3, 4, 5, 6};
int[] list2 = reverse(list1);
reverse 方法的运行过程
int[] list1 = new int[]{1, 2, 3, 4, 5, 6};
int[] list2 = reverse(list1);
reverse 方法的运行过程
int[] list1 = new int[]{1, 2, 3, 4, 5, 6};
int[] list2 = reverse(list1);
reverse 方法的运行过程
int[] list1 = new int[]{1, 2, 3, 4, 5, 6};
int[] list2 = reverse(list1);
reverse 方法的运行过程
int[] list1 = new int[]{1, 2, 3, 4, 5, 6};
int[] list2 = reverse(list1);
reverse 方法的运行过程
int[] list1 = new int[]{1, 2, 3, 4, 5, 6};
int[] list2 = reverse(list1);
reverse 方法的运行过程
int[] list1 = new int[]{1, 2, 3, 4, 5, 6};
int[] list2 = reverse(list1);
reverse 方法的运行过程
int[] list1 = new int[]{1, 2, 3, 4, 5, 6};
int[] list2 = reverse(list1);
reverse 方法的运行过程
int[] list1 = new int[]{1, 2, 3, 4, 5, 6};
int[] list2 = reverse(list1);
reverse 方法的运行过程
int[] list1 = new int[]{1, 2, 3, 4, 5, 6};
int[] list2 = reverse(list1);
reverse 方法的运行过程
int[] list1 = new int[]{1, 2, 3, 4, 5, 6};
int[] list2 = reverse(list1);
reverse 方法的运行过程
int[] list1 = new int[]{1, 2, 3, 4, 5, 6};
int[] list2 = reverse(list1);
reverse 方法的运行过程
int[] list1 = new int[]{1, 2, 3, 4, 5, 6};
int[] list2 = reverse(list1);
reverse 方法的运行过程
int[] list1 = new int[]{1, 2, 3, 4, 5, 6};
int[] list2 = reverse(list1);
reverse 方法的运行过程
int[] list1 = new int[]{1, 2, 3, 4, 5, 6};
int[] list2 = reverse(list1);
reverse 方法的运行过程
int[] list1 = new int[]{1, 2, 3, 4, 5, 6};
int[] list2 = reverse(list1);
reverse 方法的运行过程
int[] list1 = new int[]{1, 2, 3, 4, 5, 6};
int[] list2 = reverse(list1);
reverse 方法的运行过程
int[] list1 = new int[]{1, 2, 3, 4, 5, 6};
int[] list2 = reverse(list1);
reverse 方法的运行过程
int[] list1 = new int[]{1, 2, 3, 4, 5, 6};
int[] list2 = reverse(list1);
reverse 方法的运行过程
int[] list1 = new int[]{1, 2, 3, 4, 5, 6};
int[] list2 = reverse(list1);
练习
改写36选7的抽奖游戏程序,用方法实现抽奖操作,方法的返回值为以获奖号码为元素的数组。
改写求二维数组最大值的程序,用方法来求得二维数组的最大值,二维数组作为参数。
二维数组
可以使用二维数组表示矩阵或表格。
声明二维数组的语法:
数据类型[][] 数组名;
数据类型 数组名[][];
例:声明int型的二维数组变量matrix
int[][] matrix; 或 : int matrix[][];
创建二维数组:
matrix=new int[5][5];
数组元素赋值:
matrix[2][1]=7; //每个下标必须放在一对方括号中
可以使用静态初始化来声明、创建和初始化二维数组。
二维数组
Java中没有真正的**数组,但因为数组元素可以声明为任何类型,所以可以建立数组的数组(的数组……),由此得到**数组;
n维数组是n-1维数组的数组;
声明**数组时使用类型及多对方括号,如:
int[] [] 二维数组,每个元素是int类型的。
创建二维数组的格式
type arrayN[][]=new type[arrleng1][];
arrayN[0]=new type[arrleng2];
arrayN[1]=new type[arrleng2];
…… ……
arrayN[arrleng1-1]=new type[arrleng2];
创建非矩阵数组
int twoDim[][]=new int[4][];
twoDim[0]=new int[2];
twoDim[1]=new int[4];
twoDim[2]=new int[6];
twoDim[3]=new int[8];