数组
一、数组声明创建
数组:同一种数值类型的数据的集合。
声明数组变量的语法:
①dataType[] arrayReVar;
②dataType arrayReVar[];
首选第一种,因为第二种是帮助程序员从c、c++往java语言过渡才设立的。
java语言使用new操作符来创建新的数组,语法如下:
dataType[] arrayReVar = new dataType[ayyaySize];
数组的元素是通过索引访问的,数组索引从0开始!!!
声明语法①:
int[] array;
array = new int[10];
//使名为array的变量定义为一组数据类型为int的容量为10的一维数组
//或者两个语句直接合并
String[] array=new String[10];
array[1]="这是String类型定义的数组中的第二位的值";
System.out.println(array[1]);
//数组的长度用 dataRefVar.length;来获取
System.out.println(array.length);//输出的结果是10
长度为10的array数组中的数为:array[0]、array[1]、…array[9]。
数组的变量类型也可以是char、String等
二、三种初始化
- 静态初始化
int[] a={1,2,3};
- 动态初始化
int[] a=new int[5];
a[0]=1;
a[1]=2;
- 数组的默认初始化:数组是引用类型,它的元素相当于类的实例变量,因此数组一经分配空间,其中的每一个元素也按照实例变量的方式被隐式初始化。(整型默认为0,浮点型默认为0.0,字符型默认为□,布尔类型默认为false,除了基本类型其余类型的默认值都是null,具体变量类型可以参考笔者第三篇博客)
但是 静态初始化有个地方需要注意:
int[][] num={{1,2,3},{1,5},{5,3}};
/*
1 2 3
1 5 □
5 3 □
带有□的地方系统并不会给其分配空间
*/
System.out.println(num[2][2]);
//这个时候结果并不是会输出0,而是显示数组下标越界。
静态初始化二维数组没有赋予值的数组位置系统并不会默认初始化,而是不会给该数组位置分配空间。
三、数组的基本特点
1.其长度是确定的,数组一旦被创建,它的大小就是不可以改变的。
2.其元素必须是相同类型,不允许出现混合类型。
3.数组中的元素可以是任何数据类型,包括基本类型和引用类型。
4.数组变量属引用类型,数组也可以看成是对象,数组中的每一个元素相当于该对象的成员变量。
数组本身就是对象,java中对象是在 堆 中的,因此数组无论保存原始类型还是其他对象类型,数组对象本身是在 堆 中的。
四、数组边界
数组下标的合法区间:[0,length-1],如果越界(例如:数组中括号里面的值是 -1或者length)就会报错;
报的错误是:ArrayIndexOutBoundsException(数组下标越界异常)
五、多维数组
多维数组可以看做是数组的数组,就像二维数组是一个特殊的一维数组,其每一个元素都是一个一维数组,就像如果说一维数组是一条线的话,那么二维数组就是一个平面了。
二维数组的逻辑模型(画的有点丑,不要介意…)
- 定义(类比于一维数组的定义方法):
int[][] array;
array=new int[2][2];
//或
int[][] array=new int[2][2];
六、数组的遍历
下面以二维数组为样式介绍几种遍历的方法:
①利用for循环的嵌套
输出结果是:
②利用for-Each遍历数组
for-Each遍历数组原理讲解
拿一维数组举例
int[] num={1,2,3,5,6};
for(int x:num){
System.out.println(x);
}
这个语句就相当于吧num数组里的每一个数依次赋给int类型的变量x,然后依次输出每次循环赋给x的值就可以实现对数组的遍历了。
③利用Arrays类里面的toString方法
int[] num={1,2,3,5,6};
System.out.println(Arrays.toString(a));
输出结果是:
④挨个的用print输出…
七、Arrays类的使用(针对一维数组)
学习java的本质就是一个个的类的学习。
工具类中的方法也都是人为定义的,这些方法只是为了方便我们的一些操作,不可过多的依赖工具类的使用,学习前期应该尽量自己深入的去理解一些操作的流程以及原理。
- Arrays类中一些常用的方法:
①toString()方法
用于遍历数组:
②fill()方法
用于往数组里面填充数
在数组的0~4位之间填充5,注意:fill()方法只能填充一种数字
③sort()方法
用来给数组排序
八、稀疏数组
需求:编写五子棋游戏
当数组中大部分数据为0,或为同一值,就可以同稀疏数组来保存该数组。
处理方式:
- 记录数组一共有几行几列,有多少不同的值。
- 把具有不同值的元素的行列及值记录在一个小数组中从而缩小程序的规模。
public class xishuArrays {
public static void main(String[] args) {
//稀疏数组
/*
*0 0 0 0 0 0 0 0
*0 3 0 0 0 0 0 0
*0 0 0 3 0 0 0 0
*0 0 0 0 0 0 0 0
*0 0 5 0 0 0 0 0
*0 0 0 0 0 0 0 0
*0 0 0 0 0 6 0 0
*0 0 0 0 0 0 0 0
* */
//输出原数组
int[][] array1=new int[8][8];
array1[1][1]=3;
array1[2][3]=3;
array1[4][2]=5;
array1[6][5]=6;
for (int[] ints : array1) {
for (int anInt : ints) {
System.out.print(anInt+"\t");
}
System.out.println("");
}
int count=0;
//遍历原数组,获取有效值个数
for (int i = 0; i < array1.length; i++) {
for (int j = 0; j < array1[i].length; j++) {
if (array1[i][j]!=0)count++;
}
}
System.out.println("有效值个数为:"+count);
//创建一个稀疏数组
int[][] array2=new int[count+1][3];
array2[0][0]= array1.length;
array2[0][1]= array1[1].length;
array2[0][2]=count;
//给稀疏数组赋值
int sum=0;
for (int i = 0; i < array1.length; i++) {
for (int j = 0; j < array1[i].length; j++) {
if (array1[i][j]!=0){
sum++;
array2[sum][0]=i;
array2[sum][1]=j;
array2[sum][2]=array1[i][j];
}
}
}
System.out.println("输出稀疏数组:");
for (int i = 0; i < array2.length; i++) {
System.out.println(array2[i][0]+"\t"+array2[i][1]+"\t"+array2[i][2]);
}
}
}
===================================================
结果: