目录
一、数组介绍
数组可以存放多个同一类型的数据
数组也是一种数据类型,是引用类型
二、数组的使用
1. 初始化
- 动态初始化1:数据类型 数组名[] = new 数据类型[大小]
int a[] = new int[5];
- 动态初始化2:数据类型[] 数组名; 数组名 = new 数据类型[大小]
(先声明,后开辟)
int[] a;
a = = new int[5];
- 静态初始化:数据类型 数组名[] = {元素值,元素值…}
int a[] = {1, 2, 3};
int a[3] = {1, 2, 3}; //❌不能[3]
int a[] = new int[]{1, 2, 3}; //✅
2. 引用
- 数组名[下标/索引/index]
- 数组的下标从0开始
3. 注意示例
- 数组是多个相同类型数据的组合,实现对这些数据的统一管理
- 数组中的元素可以是任何数据类型,包括基本类型和引用类型,但是不能混用
- 数组创建后,如果没有赋值,有默认值
int 0
short 0
byte 0
float 0.0
double 0.0
char \u0000
boolean false
String null //⚠️
- 数组的下标从0开始
- 数组下标必须在指定范围内使用,否则报错
- 数组属于引用类型,数组型数据是对象
三、数组赋值机制
1. 值拷贝
- 基本数据类型赋值,这个值就是具体的数据,而且相互不影响(值拷贝)
2. 引用传递
int n1 = 2;
int n2 = n1; //n1 = 2;n2 = 2;
- 数组在默认情况下时引用传递,赋的值是地址
int[] arr1 = {1, 2, 3};
int[] arr2 = arr1;
arr2[0] = 10; //arr1[0] = 10⚠️
四、数组拷贝
public static void main(String[] args){
int[] arr1 = {1,2,3};
int[] arr2 = new int[arr1.length]; //开辟新数组
for(int i=0; i<arr1.length; i++){
arr2[i] = arr1[i];
}
arr2[0] = 100; //修改arr2,不会对arr1有影响
System.out.println(arr1[0]); //arr1[0]=1⚠️不影响arr1
}
五、数组扩容
public static void main(String[] args){
int[] arr = {1,2,3}; //初始化数组
do{
int[] newArr = new int[arr.length + 1]; //开辟新数组
for(int i=0; i<arr.length; i++){
newArr[i] = arr[i];
}
//添加想要添加元素
System.out.println(“请输入想要添加元素:”);
int addNum = myScanner.nextInt();
newArr[newArr.length - 1] = addNum;
//让arr指向newArr
arr = newArr;
//输出看效果
for(int i=0; i<arr.length; i++){
System.out.println(arr[i] + "\t");
}
//问用户是否继续
System.out.println(“是否继续添加 y/n”);
char key = myScanner.next().charAt(0);
if(key == 'n'){
break;
}
}(true);
}
六、二维数组的使用
1. 初始化
- 动态初始化1:数据类型 数组名[][] = new 数据类型[大小][大小]
int a[][] = new int[2][3];
- 动态初始化2:数据类型[][] 数组名; 数组名 = new 数据类型[大小][大小]
(先声明,后开辟)
int[][] a;
a = new int[2][3];
- 动态初始化3,列数不确定:数据类型 数组名[][] = new 数据类型[大小][]
int a[][];
a = new int[2][3];
- 静态初始化:数据类型 数组名[][] = {{值1,值2…},{值1,值2…},{}…}
int a[][] = {{1,2,3},{4,5},{6}};
2. 注意示例
- 一维数组声明方式:
int[] x;
int x[];
- 二维数组声明方式:
int[][] y;
int y[][];
int[] y[]; //⚠️
七、排序
1. 基本介绍
排序是将多个数据,依指定的顺序进行排序的过程
2. 内部排序
将需要处理的所有数据都加载到内部存储器中进行排序
- 交换式排序法
- 选择式排序法
- 插入式排序法
3. 外部排序
数据量过大,无法全部加载到内存中,需要借助外部存储进行排序
- 合并排序法
- 直接合并排序法
4. 冒泡排序
通过对待排序序列从后往前,依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移动到后面
for(int i = 0;i < arr.length;i++){
for(int j = 0;j < arr.length-1-i;j++){
if(arr[j]>arr[i]){
int temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
}
}
八、查找
1. 顺序查找
for(int i = 0;i < arr.length;i++){
if(arr[i] = key){
return i;
}
}
2. 二分查找
int left = 0;
int right = arr.length - 1;
while(left <= right){
int middle = left + (right - left)>>1;
if(arr[middle] > key){
right = middle - 1;
}else if(arr[middle] > key){
left = middle + 1;
}else{
return middle;
}
}