Java学习笔记:8.数组
九、数组
1、什么是数组
数组是相同数据类型的有序集合
数组描述的是相同类型的若干个数据,按照一定的先后顺序排列组合而成
每一个数据称为一个数组元素,每个数组元素可以通过一个下标访问
2、数组声明创建
声明数组变量的方法
dataType[] arrayRefVar; //首选方法
&&
dataType arrayRefVar[]; //效果相同但不是首选
-
静态初始化
//创建+赋值 int[] a = {1,2,3,4,5,6,7,8,9}; -
动态初始化
//包含默认初始化 int[] b = new int[10]; b[0] = 10; ... -
默认初始化
数组是引用类型,它的元素相当于类的实例变量,因此数组一经分配空间,其中的每个元素也被按照实例变量同样的方式被隐式初始化
int类型初始化值为0,String类型初始化值为null
Java使用new操作符来创建数组
dataType[] arrayRefVar = new dataType[arratSize];
数组的元素都是通过索引访问的,数组索引从0开始
获取数组长度
arrays.length
-
Java内存分析
![image-20210629140038348]()
![image-20210629143730831]()
数组的四个基本特点
- 其长度是确定的,数组一旦被创建,它的大小就是不可以改变的
- 数组元素必须是相同类型,不允许出现混合类型
- 数组中的元素可以是任何数据类型,包括基本类型和引用类型
- 数组的变量属于引用类型,数组可以看成是对象,数组中的每个元素相当于该对象的成员变量。数组本身就是对象,Java对象是在堆中的,因此数组无论保存原始类型还是其他对象类型,数组对象本身实在堆中的。
数组边界区间
- 下标的合法区间:
[0,length-1],如果越界就会报错
ArrayIndexOutOfBoundsException:数组下标越界异常!
3、数组使用
计算数组之和
int[] array = {1,2,3,4,5};
int sum=0;
for(int i=0;i<array.length;i++){
sum+=array[i];
}
System.out.println("sum="+sum);
查找数组最大元素
int[] array = {1,2,3,4,5};
int max=array[0];
for(int i=0;i<array.length;i++){
if(max<array[i]){
max=array[i];
}
}
System.out.println("max="+max);
反转数组
public static int[] reverse(int[] arrays) {
int[] resault = new int[arrays.length];
for (int i = 0, j = arrays.length - 1; i < arrays.length; i++, j--) {
resault[j] = arrays[i];
}
return resault;
}
4、多维数组
多维数组可以看成是数组的数组,二维数组就是一个特殊的一维数组,其每个元素都是一个一维数组
-
二维数组
//两行五列的数组 int a[][] = new int[2][5];
二维数组使用
package com.kuang.array;
public class ArrayDemo03 {
public static void main(String[] args) {
int [][] array = {{1,2},{2,3},{3,4},{4,5}};
/*
* 1,2 array[0]
* 2,3 array[1]
* 3,4 array[2]
* 4,5 array[3]
*/
printArray(array);
}
public static void printArray(int[][] arrays) {
for (int j = 0; j < arrays.length; j++) {
for (int i = 0; i < arrays[j].length; i++) {
System.out.print(arrays[j][i]+ " ");
}
System.out.println();
}
}
}
5、Arrays类
数组的工具类
java.util.Arrays
package com.kuang.array;
import java.util.Arrays;
public class ArrayDemo04 {
public static void main(String[] args) {
int[] a={1,2,3,4,9999,3333,444,22121,412};
System.out.println(a);
//输出效果相同
System.out.println(Arrays.toString(a));
printArray(a);
}
public static void printArray(int[] arrays){
for (int i = 0; i < arrays.length; i++) {
if(i==0){
System.out.print("[");
}
if(i== arrays.length-1){
System.out.print(arrays[i]+"]");
}else{
System.out.print(arrays[i]+", ");
}
}
}
}
6、冒泡排序
package com.kuang.array;
import java.util.Arrays;
public class ArrayDemo05 {
public static void main(String[] args) {
int[] a = {1, 2, 3, 4, 9999, 3333, 444, 22121, 412};
printArray(a);
int[] b = bubbleSort(a);
printArray(b);
}
public static void printArray(int[] arrays) {
for (int i = 0; i < arrays.length; i++) {
if (i == 0) {
System.out.print("[");
}
if (i == arrays.length - 1) {
System.out.print(arrays[i] + "]");
} else {
System.out.print(arrays[i] + ", ");
}
}
System.out.println();
}
public static int[] bubbleSort(int[] arrays) {
//1. 比较数组中两个相邻元素,如果第一个比第二个大,交换位置
//2. 每次比较,会产生一个最大或最小的数
//3. 下一轮可以少一次排序
//4. 一次循环,直到结束
int temp = 0;
for (int i = 0; i < arrays.length - 1; i++) {
for (int j = 0; j < arrays.length - i - 1; j++) {
if (arrays[j + 1] > arrays[j]) {
temp = arrays[j + 1];
arrays[j + 1] = arrays[j];
arrays[j] = temp;
}
}
}
return arrays;
}
}
7、 稀疏数组
当一个数组中大部分元素为0,或者同一值的数组时,可以使用稀疏数组来保存该数组。
稀疏数组的处理方式是:
记录数组一共有几行几列,有多少个不同的值
把具有不同值的元素和行列及值记录在一个小规模的数组中,从而缩小程序的规模

package com.kuang.array;
import java.util.concurrent.ForkJoinPool;
public class ArrayDemo06 {
public static void main(String[] args) {
//1. 创建一个二维数组,11*11,0无棋,1黑棋,2白棋
int[][] array1=new int[11][11];
array1[1][2]=1;
array1[2][3]=2;
//输出原始数组
System.out.println("输出原始的数组:");
printArray(array1);
//稀疏数组
int[][] xishu=xiShuArray(array1);
System.out.println("输出稀疏数组:");
printArray(xishu);
//还原稀疏数组
System.out.println("还原稀疏数组:");
int[][] huanyuan=huanYuan(xishu);
printArray(huanyuan);
}
public static void printArray(int[][] array){
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();
}
}
//转换为稀疏数组保存
public static int[][] xiShuArray(int[][] array1){
//获取有效值个数
int sum=0;
for(int i=0;i<11;i++){
for(int j=0;j<11;j++){
if(array1[i][j]!=0){
sum++;
}
}
}
System.out.println("有效值的个数:"+sum);
//创建一个稀疏数组的数组
int[][] array2=new int[sum+1][3];
array2[0][0]=11;
array2[0][1]=11;
array2[0][2]=sum;
//遍历二维数组,将非零值,存放在稀疏数组中
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++;
array2[count][0]=i;
array2[count][1]=j;
array2[count][2]=array1[i][j];
}
}
}
return array2;
}
//根据稀疏数组还原原始数组
public static int[][] huanYuan(int[][] array){
//1. 读取稀疏数组
int[][] array3=new int[array[0][0]][array[0][1]];
//2. 给其中的元素还原它的值
for (int i = 1; i < array.length; i++) {
array3[array[i][0]][array[i][1]]=array[i][2];
}
return array3;
}
}



浙公网安备 33010602011771号