数组
概述
相同类型数据的有序集合
若干个的,有先后顺序组成、并通过下标来访问集合中的数据
数组声明和创建
1.声明数组变量
DataType[] arr; //使用习惯上更加推荐这个
DataType arr[];
2.通过new来创建数组对象
DataType[] arr = new DataType[arraySize];
注:
数组的元素从 0 开始
通过 array.length 可以获得 数组的长度
public static void main(String[] args) {
//首先申明数组变量
int[] arrInt;
//通过new来创建数组
arrInt = new int[10];
//赋值
arrInt[0] = 1;
arrInt[1] = 2;
arrInt[2] = 3;
arrInt[3] = 4;
arrInt[4] = 5;
arrInt[5] = 6;
arrInt[6] = 7;
arrInt[7] = 8;
arrInt[8] = 9;
arrInt[9] = 10;
System.out.println(arrInt.length);//10
//计算所有元素的和
int sum = 0;
for (int i = 0; i < arrInt.length; i++) {
sum += arrInt[i];
}
System.out.println(sum);//55
}
三种初始化
静态初始化
int[] arr = {1,2,3};
动态初始化
int[] arr = new int[10];
arr[0]=1;
arr[1]=2;
数组的默认初始化
由于数组是一种引用类型、故分配空间时,其中的元素被隐式初始化了 (eg: int ->0,String->null)
基本特点:
数组长度是固定的
数组内的元素都为同一种类型
数组的元素既可以是基本类型、也可以是引用类型
数组也是对象的一种、因为数组在java中存放于堆中
数组使用
for-each循环 [JDK1.5 无下标的操作]
public static void main(String[] args) {
int[] arrInt ={1,2,3,4,5,6,7,8,9};
for (int i : arrInt) {
System.out.println(i);
}
}
数组 可以作为参数
public static void main(String[] args) {
int[] arrInt ={1,2,3,4,5,6,7,8,9};
printArr(arrInt);
}
//打印数组元素
public static void printArr(int[] arr) {
for (int i : arr) {
System.out.println(i);
}
}
数组 可以作为返回值
public static void main(String[] args) {
int[] arrInt ={1,2,3,4,5,6,7,8,9};
int[] arrFun = reverse(arrInt);
printArr(arrFun);
}
//反转数组
public static int[] reverse(int[] arr){
int[] result = new int[arr.length];
for (int i = 0,j = result.length-1 ; i < arr.length; i++,j--) {
result[j] = arr[i];
}
return result;
}
多维数组
数组的数组。
表现结果: [ [0,1] , [0,1] ]
声明形式: DataType[ ] [ ] arr = { {dataType,dataType} , {dataType,dataType} … };
public static void main(String[] args) {
int[][] arr = { {1,2} , {2,3} ,{3,4} };
/* arr[][0] arr[][1]
arr[0][] 1 2
arr[1][] 2 3
arr[2][] 3 4
即第一个[]表明有多少行、第二个[]表明有多少列
*/
}
Arrays类
(可看相关文档)
是有关于数组的工具类 java.util.Arrays
简单介绍
public static void main(String[] args) {
int[] a ={2,3,4,1,8,6,9,7};
//打印数组元素
System.out.println(Arrays.toString(a)); //[2, 3, 4, 1, 8, 6, 9, 7]
//排序数组 ->升序
Arrays.sort(a);
System.out.println(Arrays.toString(a)); //[1, 2, 3, 4, 6, 7, 8, 9]
}
稀疏数组
【压缩空间】
当数组大部分为0、或同一值时,可用稀疏数组来保存该值
处理方式:
记录数字有几行几列、多少不同值
将不同值的元素、行列、值记录在一个小规模的数组
eg:
行 列 值
[ 0,0,1,0,0 ] 1 2 1
[ 2,0,2,0,0 ] ==> 2 0 2
[ 0,0,0,0,0 ] 2 2 2
案例:黑白棋
public static void main(String[] args) {
//1.创建二维数组 11*11 0->没有棋子 1->黑棋 2->白棋
int[][] arr = new int[11][11];
arr[1][2] = 1;
arr[2][3] = 2;
//输出元素数组
for (int[] ints : arr) {
for (int anInt : ints) {
System.out.print(anInt+"\t");
}
System.out.println();
}
/*
0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0
0 0 0 2 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
*/
//变成稀疏数组
//1.获取有效值的个数
int nums = 0;
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length; j++) {
if (arr[i][j] != 0){
nums++;
}
}
}
System.out.println(nums); //2
//2.创建稀疏数组
int[][] arrOther = new int[nums+1][3];
arrOther[0][0] = 11; //行
arrOther[0][1] = 11; //列
arrOther[0][2] = nums; //值的个数
//遍历二维数组,将非零值存入稀疏数组
int count = 0;
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length; j++) {
if (arr[i][j] != 0){
count++;
arrOther[count][0] = i;
arrOther[count][1] = j;
arrOther[count][2] = arr[i][j];
}
}
}
//输出稀疏数组
for (int i = 0; i < arrOther.length; i++) {
System.out.println(arrOther[i][0] + "\t"
+ arrOther[i][1] + "\t"
+ arrOther[i][2] + "\t");
}
/*
11 11 2
1 2 1
2 3 2
*/
//3.还原稀疏数组
//1.读取稀疏数组
int[][] arrBack = new int[arrOther[0][0]][arrOther[0][0]];
//2.给其中的元素还原它的值
for (int i = 1; i < arrOther.length; i++) { //从 i=1 开始 是因为 第0行是信息而非数据
arrBack[arrOther[i][0]][arrOther[i][1]] = arrOther[i][2];
}
for (int[] ints : arrBack) {
for (int anInt : ints) {
System.out.print(anInt+"\t");
}
System.out.println();
}
/*
0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0
0 0 0 2 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
*/
}