数组
1. 内存分析:
数组内存分析:
2. 数组基本特点
- 长度确定,一旦被创建,大小不可以改变。如果越界,则报错:ArrayIndexOutofBoundsException
- 元素必须是相同类型
- 数组中的元素可以是任何数据类型,包括基本类型和引用类型
- 数组变量属于引用类型,数组也可以看成是对象,数组中的每个元素相当于该对象的成员变量
- 数据本身也是就是对象,Java中的对象在堆中,因此数组无论保存原始类型还是其他对象类型。数组对象本身是在堆中的
3. 数组的使用
-
For-Each循环(强类型循环):没有下标,适合用于遍历输出
int[] a={1,2,3}; for (int i : a) { //没有下标 System.out.println(i); }
-
数组作为方法入参
-
数组作为返回值
package com.bobo.base;
import java.util.Scanner;
public class Demo {
public static void main(String[] args) {
int[] arrays={1,2,3,4,5};
printArray(reverse(arrays));
}
//反转数组
public static int[] reverse(int[] arrays){
int temp;
for(int i=0;i<arrays.length/2;i++){
temp=arrays[i];
arrays[i]=arrays[arrays.length-1-i];
arrays[arrays.length-1-i]=temp;
}
return arrays;
}
//打印数组元素
public static void printArray(int[] arrays){
for(int i=0;i<arrays.length;i++){
System.out.print(arrays[i]+" ");
}
}
}
4. 二维数组
-
二维数组结构分析:实际可以理解为在原来的每个一维数组的元素内,又存放了一个一维数组
-
二维数组的定义
int[][] array={{1,2},{2,3},{3,4},{4,5}}; //[4][2]
System.out.println(array.length); //输出数组的行数
System.out.println(array[0].length); //输出数组的列数
-
二维数组的三种遍历输出的方式
-
普通循环输出
int[][] array={{1,2},{2,3},{3,4},{4,5}}; for(int i=0;i<array.length;i++){ for(int j=0;j<array[i].length;j++){ System.out.print(array[i][j]+"\t"); } System.out.println(); }
-
强循环输出
int[][] array={{1,2},{2,3},{3,4},{4,5}}; for(int[] i : array){ for(int n : i){ System.out.print(n+"\t"); } System.out.println(); }
-
5. Arrays类
常用方法总结:
- 给数组赋值:通过fill方法
- 对数组排序:通过sort方法(升序)
- 比较数组:通过equals方法比较数组中的元素值是否相等
- 查找数组元素:通过binarySearch方法能对排序好的数组进行二分查找法操作
- 输出数组:通过toString()方法 (但会输出中括号和逗号)
6. 稀疏数组
- 当一个数组中大部分元素都为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组
- 稀疏数组的处理方式
- 记录数组一共有几行几列,有多少个不同值
- 把具有不同值得元素和行列及值记录
-
实例
先对原数组遍历,再转化为稀疏数组,再根据稀疏数组得到原数组
public class Demo { public static void main(String[] args) { int[][] array1=new int[11][11]; array1[1][2]=1; array1[2][3]=1; System.out.println("原始数组:"); for(int[] ints : array1){ for(int anInt : ints){ System.out.print(anInt+"\t"); } System.out.println(); } System.out.println("================================="); //转换稀疏数组 int count=0; for(int i=0;i<11;i++){ for(int j=0;j<11;j++){ if(array1[i][j]!=0) count++; } } System.out.println("有效数字个数:"+count); //创建稀疏数组。 int[][] array2=new int[count+1][3]; array2[0][0]=11; array2[0][1]=11; 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 :array2){ for(int a : i){ System.out.print(a+"\t"); } System.out.println(); } System.out.println("==================================="); //还原二维数组 int[][] array3=new int[array2[0][0]][array2[0][1]]; for(int i=1;i<=array2[0][2];i++){ array3[array2[i][0]][array2[i][1]]=array2[i][2]; } //输出二维数组 for(int[] i:array3){ for(int n : i) System.out.print(n+"\t"); System.out.println(); } } }
运行结果: