数组
- 一:数组的定义
- 重点:数组的第一个值的下标为0
- 二:数组声明和创建
- 重点:数组的元素是通过索引访问的 数字索引是从0开始的 获取数组长度:array.length
- 三:数组的四个基本特点
- 易错:从数组定义中可以看出数组一共有十个变量 那么如果在代码中取出第十一个变量的时候 程序会报错(下标越界) 如果代码没有定义数字的第十个变量的值 那么就输出数组类型的默认值
- 练习
- 四:内存分析
- 重点:java.lang.ArrayIndexOutOfBoundsException 报错表明:数组下标越界
- 重点一:从下图可以看出 数组变量属引用类型,数组也可以看成是对象,数组中的每个元素相当于该对象的成员变量。(先定义一个数组 然后定义数组变量时开始引用)
- 重点二:数组本身就是对象,Java中对象是在堆中的,因此数组无论保存原始类型还是其他对象类型, 数组对象本身是在堆中的。
- 五:数组的三种初始化
- 重点:数组的默认初始化 数组是引用类型,它的元素相当于类的实例变量,因此数组一经分配空间,其中的每个元素也被按照实例变量同样的方式被隐式初始化。
- 练习
- 六:数组的四个基本特点
- 七:数组的边界
- 重点:避免数组下标越界的错误 当下标越界时会出现:ArrayIndexOutOfBoundsException
- 重点小结: 数组是相同数据类型(数据类型可以为任意类型)的有序集合 数组也是对象。数组元素相当于对象的成员变量 数组长度的确定的,不可变的。如果越界,则报: ArrayIndexOutofBounds
- 练习
- 练习重点: 可以看到数组的长度为8 而数组第一个索引下的标志为0 (下标的合法区间为[0,a.length] 如果越界就会报错) 那么 i就不能等于 a.length 否则就会出现下标越界
- 八:数组的使用
- 练习
- 普通for循环练习:
- 重点练习(数组作为方法入参 数组作为返回值 增强for循环):
- 内容讲解: 重点理解代码内容 增强for循环 JDK1.5 增强for循环没有下标 array 表明数组下标值的命名 arrays 表明数组 所有对于打印数组哪个下标的值 增强for循环就不适合(增强for循环适合打印数组的结果)
- 注意代码中第二个方法的返回值为数组 而数组不能直接打印 所以要先定义数组的命名然后再通过for循环打印出来 // reverse(arrays); 即从该代码转换到以下代码 // int[] reverse = reverse(arrays); int[] reverse = reverse(arrays); printArray(reverse);//打印数组
- 数组作为返回值可以通过反转数组方法(reverse方法)来描述 重点:数组的长度arrays.length 永远比数组最后一个的arrays[max]中的max大于一个数字所以理解以下两句话
- 九:多维数组
- 练习
- array 【4】【2】 /* 1,2 array[0]数组一 2,3 array[1]数组二 3,4 array[2]数组三 4,5 array[3]数组四 */ 二维数组的意思为一共有几个一维数组 比如下面:有四个一维数组 每个数组里有两个值 //int[][] array={{1,2},{2,3},{3,4},{4,5}}; 三维数组意思为 一共几个二维数组 比如下面 一共有三个二维数组 每个二维数组里面有三个一维数组 //int [][][] array1={ {{1,2},{2,3},{3,4}} ,{{1,2},{2,3},{3,4}},{{1,2},{2,3},{3,4}}};
- 十:Arrays类
- 重点: 查看JDK帮助文档 Arrays类中的方法都是static修饰的静态方法,在使用的时候可以直接使用类名进行调用,而"不用"使用对象来调用(注意:是"不用”而不是“不能")
- 具有以下常用功能: ◆给数组赋值:通过fill方法。 ◆对数组排序:通过sort方法,按升序。 ◆比较数组:通过equals方法比较数组中元素值是否相等。 ◆查找数组元素:通过binarySearch方法能对排序好的数组进行分查找法操作。 具体一些使用在以下练习代码中学习
- 练习
- 重点理解: 数组不能直接打印 System.out.println(a);//如果直接打印出现[I@b4c966a 打印数组元素Arrays.toString System.out.println(Arrays.toString(a));
- 十一:冒泡排序
- 冒泡排序重点: 如何调换两个值的左右顺序 可以调用一个对象 将A对象赋予这个对象 然后将B对象赋予A对象 再然后将A赋予的这个对象赋予给B 类似于两杯水互换借用一个空杯子
- Java中不能用 a=b b=a 因为:当b赋值于a时 那么a b 两个值是相等的
- 练习:
- 代码重点: 调用完我们自己写的排序方法后 返回一个排序后的数组(为排序后的数组定义一个新名字) int[] sort = sort(a); 然后输出数组里面的元素 System.out.println(Arrays.toString(sort));
- //外层循环 判断我们这个要走多少次; //第一次一定走array.length-1次 for (int i = 0; i < array.length-1; i++)
- //内层循环 比较判断两个数 如果第一个数比第二个数大 则交换位置 //并且每次比较的次数一次比一次少一(重点了解为什么是array.length - 1 - i) for (int j = 0; j < array.length - 1 - i; j++)
- 定义一个flag标识位 减少没有意义的比较 boolean flag=false; //重点:如果中间已经排序好大小 那么下一次比较flag不变 // 然后直接跳出总循环(这对于交换了几个数就已经有序来说,还是有用的) //所以要放在第一个for循环级别下 if (flag==false){ break; };
- 稀疏数组(数据结构)
- 上图五子棋黑白棋的稀疏数组
- 练习
- 代码解释重点: 创建一个稀疏数组的数组(五子棋盘转换为稀疏数组为三行三列)
- 定义count的意思:将数组中非零的值放到 稀疏数组中对应的行中和对应的列中 比如:当二维数组中第一个数组中有非零值 i=0 则count+1(count+1 代表非零值加1) array2[count][0]=i 第一个数组的第二个值非零 j=1 则 [count][1]=j 对应着稀疏数组的位置 易错 i j 为: i为二维数组中的第i个数组 j为二维数组中第i个数组的j个元素 只是要把二维数组转换为稀疏数组 对应的i j转换为 稀疏数组里面的行和列(重点理解)
- //遍历二维数组 将非零的值存放在稀疏数组中 int count=0; for (int i = 0; i < array1.length; i++) { for (int j = 0; j < array1[i].length; j++) { //定义count的意思:将数组中非零的值放到 //稀疏数组中对应的行中和对应的列中 //比如:当二维数组中第一个数组中有非零值 i=0 //则count+1(count+1 代表非零值加1) array2[count][0]=i //第一个数组的第二个值非零 j=1 //则 [count][1]=j 对应着稀疏数组的位置 //易错 i j 为: i为二维数组中的第i个数组 j为二维数组中第i个数组的j个元素 //只是要把二维数组转换为稀疏数组 对应的i j转换为 稀疏数组里面的行和列(重点理解) if (array1[i][j]!=0){ count++;//当非零值增加时 那么count也增加(count对应这稀疏数组的第一列的值也就是对应着第几个数组存在非零值) array2[count][0]=i;//意思为:稀疏数组count行 第一列的值为i(稀疏数组第count个数组的第一个值为i) array2[count][1]=j;//意思为:稀疏数组count行 第二列的值为j // (对应第count个数组的第j个值为非零值)(稀疏数组第count个数组的第二个值为j) array2[count][2]=array1[i][j]; } } }
- **count++;//当非零值增加时 那么count也增加(count对应这稀疏数组的第一列的值也就是对应着第几个数组存在非零值)** **array2[count][0]=i;//意思为:稀疏数组count行 第一列的值为i(稀疏数组第count个数组的第一个值为i)** **array2[count][1]=j;//意思为:稀疏数组count行 第二列的值为j** **// (对应第count个数组的第j个值为非零值)(稀疏数组第count个数组的第二个值为j)** **array2[count][2]=array1[i][j];//这里存放的是真正的有效值 真正的非零值的数值大小(而其他的是描述存放数值的位置在哪里)**
- **//2 给其中的元素赋值 (就是把稀疏数组中存储的有效的数值放回到正常数组的位置上)** **//重点 重点 重点!!!赋值 i=1(而不是i=0) 的原因: 因为在稀疏数组中循环第一行为头部信息不用循环** **// (第一行存放的信息为一共有几个数组 每个数组有几个值 而且一共有几个有效值)** **for (int i=1; i < array2.length; i++) {** **//重点重点重点!!!就是将稀疏数组中存储的有效值放在二维数组的第几个数组的第一个元素位置** **array3[array2[i][0]] [array2[i][1]]=array2[i][2];** **}
一:数组的定义
重点:数组的第一个值的下标为0
二:数组声明和创建
重点:数组的元素是通过索引访问的 数字索引是从0开始的 获取数组长度:array.length
三:数组的四个基本特点
易错:从数组定义中可以看出数组一共有十个变量 那么如果在代码中取出第十一个变量的时候 程序会报错(下标越界) 如果代码没有定义数字的第十个变量的值 那么就输出数组类型的默认值
练习
四:内存分析
重点:java.lang.ArrayIndexOutOfBoundsException 报错表明:数组下标越界
重点一:从下图可以看出 数组变量属引用类型,数组也可以看成是对象,数组中的每个元素相当于该对象的成员变量。(先定义一个数组 然后定义数组变量时开始引用)
重点二:数组本身就是对象,Java中对象是在堆中的,因此数组无论保存原始类型还是其他对象类型, 数组对象本身是在堆中的。
五:数组的三种初始化
重点:数组的默认初始化 数组是引用类型,它的元素相当于类的实例变量,因此数组一经分配空间,其中的每个元素也被按照实例变量同样的方式被隐式初始化。
练习
六:数组的四个基本特点
七:数组的边界
重点:避免数组下标越界的错误 当下标越界时会出现:ArrayIndexOutOfBoundsException
重点小结: 数组是相同数据类型(数据类型可以为任意类型)的有序集合 数组也是对象。数组元素相当于对象的成员变量 数组长度的确定的,不可变的。如果越界,则报: ArrayIndexOutofBounds
练习
练习重点: 可以看到数组的长度为8 而数组第一个索引下的标志为0 (下标的合法区间为[0,a.length] 如果越界就会报错) 那么 i就不能等于 a.length 否则就会出现下标越界
八:数组的使用
练习
普通for循环练习:
重点练习(数组作为方法入参 数组作为返回值 增强for循环):
内容讲解: 重点理解代码内容 增强for循环 JDK1.5 增强for循环没有下标 array 表明数组下标值的命名 arrays 表明数组 所有对于打印数组哪个下标的值 增强for循环就不适合(增强for循环适合打印数组的结果)
注意代码中第二个方法的返回值为数组 而数组不能直接打印 所以要先定义数组的命名然后再通过for循环打印出来 // reverse(arrays); 即从该代码转换到以下代码 // int[] reverse = reverse(arrays); int[] reverse = reverse(arrays); printArray(reverse);//打印数组
数组作为返回值可以通过反转数组方法(reverse方法)来描述 重点:数组的长度arrays.length 永远比数组最后一个的arrays[max]中的max大于一个数字所以理解以下两句话
//int i = 0 ,j=arrays.length-1; i <arrays.length;
//明白以上该行代码在for循环中的代码的作用:result[j]=arrays[i];
九:多维数组
练习
重点理解:
array 【4】【2】 /* 1,2 array[0]数组一 2,3 array[1]数组二 3,4 array[2]数组三 4,5 array[3]数组四 */ 二维数组的意思为一共有几个一维数组 比如下面:有四个一维数组 每个数组里有两个值 //int[][] array={{1,2},{2,3},{3,4},{4,5}}; 三维数组意思为 一共几个二维数组 比如下面 一共有三个二维数组 每个二维数组里面有三个一维数组 //int [][][] array1={ {{1,2},{2,3},{3,4}} ,{{1,2},{2,3},{3,4}},{{1,2},{2,3},{3,4}}};
十:Arrays类
重点: 查看JDK帮助文档 Arrays类中的方法都是static修饰的静态方法,在使用的时候可以直接使用类名进行调用,而"不用"使用对象来调用(注意:是"不用”而不是“不能")
具有以下常用功能: ◆给数组赋值:通过fill方法。 ◆对数组排序:通过sort方法,按升序。 ◆比较数组:通过equals方法比较数组中元素值是否相等。 ◆查找数组元素:通过binarySearch方法能对排序好的数组进行分查找法操作。 具体一些使用在以下练习代码中学习
练习
重点理解: 数组不能直接打印 System.out.println(a);//如果直接打印出现[I@b4c966a 打印数组元素Arrays.toString System.out.println(Arrays.toString(a));
十一:冒泡排序
冒泡排序重点: 如何调换两个值的左右顺序 可以调用一个对象 将A对象赋予这个对象 然后将B对象赋予A对象 再然后将A赋予的这个对象赋予给B 类似于两杯水互换借用一个空杯子
Java中不能用 a=b b=a 因为:当b赋值于a时 那么a b 两个值是相等的
练习:
代码重点: 调用完我们自己写的排序方法后 返回一个排序后的数组(为排序后的数组定义一个新名字) int[] sort = sort(a); 然后输出数组里面的元素 System.out.println(Arrays.toString(sort));
//外层循环 判断我们这个要走多少次; //第一次一定走array.length-1次 for (int i = 0; i < array.length-1; i++)
//内层循环 比较判断两个数 如果第一个数比第二个数大 则交换位置 //并且每次比较的次数一次比一次少一(重点了解为什么是array.length - 1 - i) for (int j = 0; j < array.length - 1 - i; j++)
定义一个flag标识位 减少没有意义的比较 boolean flag=false; //重点:如果中间已经排序好大小 那么下一次比较flag不变 // 然后直接跳出总循环(这对于交换了几个数就已经有序来说,还是有用的) //所以要放在第一个for循环级别下 if (flag==false){ break; };
稀疏数组(数据结构)
上图五子棋黑白棋的稀疏数组
练习
代码解释重点:
创建一个稀疏数组的数组(五子棋盘转换为稀疏数组为三行三列)
定义count的意思:将数组中非零的值放到
稀疏数组中对应的行中和对应的列中
比如:当二维数组中第一个数组中有非零值 i=0
则count+1(count+1 代表非零值加1) array2[count][0]=i
第一个数组的第二个值非零 j=1
则 [count][1]=j 对应着稀疏数组的位置
易错 i j 为: i为二维数组中的第i个数组 j为二维数组中第i个数组的j个元素
只是要把二维数组转换为稀疏数组 对应的i j转换为 稀疏数组里面的行和列(重点理解)
//遍历二维数组 将非零的值存放在稀疏数组中
int count=0;
for (int i = 0; i < array1.length; i++) {
for (int j = 0; j < array1[i].length; j++) {
//定义count的意思:将数组中非零的值放到
//稀疏数组中对应的行中和对应的列中
//比如:当二维数组中第一个数组中有非零值 i=0
//则count+1(count+1 代表非零值加1) array2[count][0]=i
//第一个数组的第二个值非零 j=1
//则 [count][1]=j 对应着稀疏数组的位置
//易错 i j 为: i为二维数组中的第i个数组 j为二维数组中第i个数组的j个元素
//只是要把二维数组转换为稀疏数组 对应的i j转换为 稀疏数组里面的行和列(重点理解)
if (array1[i][j]!=0){
count++;//当非零值增加时 那么count也增加(count对应这稀疏数组的第一列的值也就是对应着第几个数组存在非零值)
array2[count][0]=i;//意思为:稀疏数组count行 第一列的值为i(稀疏数组第count个数组的第一个值为i)
array2[count][1]=j;//意思为:稀疏数组count行 第二列的值为j
// (对应第count个数组的第j个值为非零值)(稀疏数组第count个数组的第二个值为j)
array2[count][2]=array1[i][j];
}
}
}
count++;//当非零值增加时 那么count也增加(count对应这稀疏数组的第一列的值也就是对应着第几个数组存在非零值)
array2[count][0]=i;//意思为:稀疏数组count行 第一列的值为i(稀疏数组第count个数组的第一个值为i)
array2[count][1]=j;//意思为:稀疏数组count行 第二列的值为j
// (对应第count个数组的第j个值为非零值)(稀疏数组第count个数组的第二个值为j)
array2[count][2]=array1[i][j];//这里存放的是真正的有效值 真正的非零值的数值大小(而其他的是描述存放数值的位置在哪里)
//2 给其中的元素赋值 (就是把稀疏数组中存储的有效的数值放回到正常数组的位置上)
//重点 重点 重点!!!赋值 i=1(而不是i=0) 的原因: 因为在稀疏数组中循环第一行为头部信息不用循环
// (第一行存放的信息为一共有几个数组 每个数组有几个值 而且一共有几个有效值)
for (int i=1; i < array2.length; i++) {
//重点重点重点!!!就是将稀疏数组中存储的有效值放在二维数组的第几个数组的第一个元素位置
array3[array2[i][0]] [array2[i][1]]=array2[i][2];
**}