数组是相同类型数据的有序集合。每个数据元素可以通过下表来访问。
1. 数组的声明和创建
两种定义方式都可以: (首选!)类型[] 数组名字; 类型 数组名字[];
数据组创建:
int[] nums = new int[10];
表示在内存中开辟10个空间存放数据。
数组赋值:如果没有赋值有默认值
nums[0] = 1;
数组的特点:
- 数组的长度是固定的,一旦创建,大小是不可以改变的
- 数据中的元素数据类型必须是一致的
- 数组对象本身是在堆中
2. 初始化数组和内存分析
内存分析
Java内存:
1. 堆:
存放new的对象和数组,可以被所有线程共享,不会存放别的对象引用
2. 栈:
存放基本变量类型(包含基本类型的具体数值),引用对象的变量(会存放这个引用在堆里面的具体地址)
3. 方法区:
可以被所有线程共享,包含所有的class和static变量
数组的内存分析
数组的初始化
静态初始化: int[] a = {1,2,3};
动态初始化: int[] a = new int[3]; a[0]=1;
默认初始化:默认值
3. 数组的使用
遍历数组: for.i arr.for 使用普通for循环和增强型for循环
增强for循环是取不到下标的
数组作为入参:略
数组作为返回值:略
4. 二维数组
定义二维数组:
int[][] array = new int[2][2];
复制二维数组:
array[0][0] = 3;
int[][] arrau = {{1,2},{2,3}};
获取数组的长度:
array.length 获取函数
array[i].length 获取列数
5. Arrays类
Arrays类是数组的工具类java.util.Arrays
常用功能:
给数组赋值:Arrays.fill(array,fromIndex, toIndex, value),定义成统一的值
对数组排序:Arrays.sort(array)
比较数组:equals方法
查找数组元素:binarySearch对排序好的数组进行二分查找
打印数组元素:Arrays.toString(array)
冒泡排序
- 比较数组中,两个相邻的元素,如果第一个数比第二个数大,交换位置
- 每次比较,都会产生一个最大或最小的数字
- 下一轮可以少进行一次排序
- 依次循环,直到结束
public static int[] sort(int[] array){
// 从大到小
int temp =0;
for(int i = 0; i < array.length - 1; i++){
for (int j = 0; j < array.length - 1 - i; j++){
if(array[j+1] > array[j]){
//调换数值
temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
}
}
}
return array;
}
6. 稀疏数组
当一个数组大部分元素为0或者为同一个值时,可以使用稀疏数组来保存数组。
稀疏数组的处理方式:
记录数组一共有几行几列,有多少个不同值
把具有不同值的元素和行列及值记录在一个小规模的数组中,从而缩小程序的规模
/**
压缩数组
*/
//计算 有效值的个数,如上图有效值个数为8个,则稀疏数组一共有9行
int sum = 0;
for (int i = 0; i < array.length -1; i++){
for (int j = 0; j< array[i].length - 1; j++){
if(array[i][j] != 0){
sum ++;
}
}
}
//array2[0][0] 原始数组有6行,array2[0][1]原始数组有7列, array2[0][2]原始数组有效值有8个
array2[0][0]=6;
array2[0][1]=7;
array2[0][2]=8;
//遍历二维数组,将非零的值存到稀疏数组中
int count =0;
for (int i = 0; i < array.length -1; i++){
for (int j = 0; j< array[i].length - 1; j++){
if(array[i][j] != 0){
count++;
array2[count][0]= i;
array2[count][1]= j;
array2[count][2]= array[i][j];
}
}
}
/**
还原成原数组略
*/