数组:
存储相同类型的元素。
相关概念:
数组名、
元素、
角标(下标、索引)、
数组长度
特点:
数组是有序排列的;
数组是引用数据类型,元素可以是基本数据类型也可以是引用数据类型;
创建数组会在内存中开辟一块连续的存储空间,长度一旦确定无法修改。
分类:
按照维数:一维数组、二维数组……
按照数组元素类型:基本数据类型元素数组、引用数据类型数组
一维数组
- 声明和初始化
// 静态初始化:数组的初始化和元素的赋值同时进行
int[] ids = new int[]{1001,1002,1003,1004};
// 动态初始化:数组的初始化和元素的赋值分开进行
String[] names = new String[5];
//也是正确地
int[] arr = {1,2,3,4,5};//先声明再赋值是不能这样省略的
int arr1[] = new int[5];
-
如何调用指定位置的元素
names[0]
-
如何获取数组长度
names.length
System.out.println(names.length);
- 如何遍历数组
通过数组长度,循环获取每个元素 - 数组元素的默认初始化值
元素是整型(int、short、long):0
元素是浮点型(float、double):0.0
元素是char型:0(ascll码为0的或’\u0000’而非‘0’) 代码见下
元素是boolean型:false
元素是引用数据类型(例如String类型):null(而非"null") 代码见下
//元素是char型
char[] arr = new char[4];
System.out.println(char[0]==0);
true
//元素是String类型
String[] arr1 = new String[4];
System.out.println(arr1[0]==null);
true
- 数组的内存解析
栈:存储局部变量,即数组名,
堆:存储new出来的结构,例如对象和数组
给栈中的数组名 赋值 数组首地址值
当堆中的数组没有栈中的变量指向,会被回收
当出了变量的作用域,栈中的变量会出栈,变量指向的数组会被回收。
二维数组
一维数组array1作为另一个一维数组array2的元素而存在。
从数组底层的运行机制来看,其实并没有二维数组。
- 声明和初始化
//静态初始化:内层一维数组的元素个数可以不同
int[][] arr = new int[][]{{1,2,3},{4,5},{7,8,9}};
//动态初始化1
String[][] arr2 = new String[3][2];
//动态初始化2
String[][] arr3 = new String[3][];
//也是正确的
int arr1[][] = new int[3][];
int[] arr2[] = new int[3][];
int[][] arr3 = {{1,2},{3},{4,5}};
-
如何调用指定位置的元素
array[0][2]
-
如何获取数组长度
array.length
array[0].length
-
如何遍历数组
嵌套循环 -
数组元素的默认初始化值
外层元素:地址值,如果内层数组未赋值,外层元素初始值为null。
内层元素:初始值和一维数组相同 -
数组的内存解析
栈:存储局部变量,即数组名,
堆:存储new出来的结构,例如对象和数组
给栈中的数组名 赋值 数组首地址值
当堆中的数组没有栈中的变量指向,会被回收
当出了变量的作用域,栈中的变量会出栈,变量指向的数组会被回收。
数组的相关算法
1.数组的赋值(杨辉三角、回形数)
杨辉三角:
第N行有N个数字,第一个和最后一个是1,其余数字满足:
n
i
j
=
n
i
−
1
j
−
1
+
n
i
−
1
j
n_{ij }= n_{i-1j-1}+n_{i-1j}
nij=ni−1j−1+ni−1j
回形数
输入整数n,生成n*n的二维数组,元素按照顺时针顺序从1递增。例如输入3,得到
1 2 3
8 9 4
7 6 5
2.求数值型数组中元素的最大值、最小值、平均值、总和等
3.数组的复制、反转、查找(现行查找、二分查找)
array2 = array1 :将数组1的地址给了数组2,都指向堆中唯一一个数组实体。不能称作数组的复制。
二分法查找:数组必须有序
4.数组元素的排序
衡量标准:
- 时间复杂度
- 空间复杂度
- 稳定性:若A和B值相等,A、B先后次序保持不变则是稳定的。
排序法算法的分类: - 内部排序
在内存中完成,不需要借助外部存储器。 - 外部排序
参与排序的数据非常多,无法在内存中完成,必须借助外部存储器。常见的是多路归并排序。可以将外部排序看作多次内部排序组成。
- 选择排序
直接选择排序,堆排序 - 交换排序
冒泡排序,快速排序 - 插入排序
- 直接插入排序,折半插入排序,shell排序
- 归并排序
- 桶式排序
- 基数排序