Java基础学习笔记整理了我从零开始学习Java时所学习到的内容。
以下内容参考尚硅谷Java教程。
四.数组
数组(Arrays):数组是多个相同类型数据按一定顺序排列的集合,使用一个名字命名,并通过编号
1 数组概述
1.相关概念:
- 数组名
- 元素
- 角标
- 数组的长度:元素的个数
2.特点:
- 数组是序排列的;
- 数组自身属于引用数据类型变量。其元素可以是基本数据类型或者引用数据类型;
- 创建数组会在内存中开辟一整块连续的空间;
- 数组长度一旦确定,不能修改。
3.分类:
按维数:一维数组、二维数组、…
按元素数据类型:基本数据类型元素的数组、引用数据类型元素的数组
番外:数据结构
1.数据与数据之间的逻辑关系:集合、一对一、一对多、多对多。
2.数据的存储结构:
线性表:顺序表(如:数组),链表,栈,队列
树形结构:二叉树
图形结构:
3.数组的算法:
- 排序算法
- 查找算法
2 一维数组
2.1一维数组的声明与初始化
int[] arr1;//声明
arr1 = new int[]{1,2,3,4};//静态初始化
arr2 = new String[5];//动态初始化
//****************************
//错误的方式
//int[] arr1 = new int[];
//int[5] arr2 = =new int[5];
//int[] arr3 = new int[3]{1,2,3};
2.2 一维数组元素的引用
通过角标的方式调用。
int[] arr = new int[4];
arr[0]=1;
2.3 一维数组的属性:length
数组名.length可以输出数组的长度。
2.4 一维数组的遍历。
使用循环结构。
int[] arr = new int[]{1,2,3,4};
for(int i=0;i<arr.length;i++){
System.out.println(arr[i]);
}
2.5 一维数组元素的默认值
- 整型:0
- 浮点型:0.0
- char型:0或’ \u0000’
- 引用类型:null
2.6 一维数组的内存解析
定义一个一维数组等于在栈中创造了一个变量存储指向堆空间中的一整块区域(大小为数组长度)的地址。
3 二维数组
一个一维数组的元素还是一个一维数组,则称这个数组为二维数组。
3.1 二维数组的声明与初始化
int[][] arr1 = new int[][]{{1,2},{2,3},{3,4}};
String[][] arr2 = new String[2][3];
String[][] arr3 = new String[3][];
3.2 二维数组元素的引用
int[][] arr = new int[4][];
arr[0][0]=1;
3.3 二维数组的属性:length
与取的数组有关,比如
int[][] arr = new int[][]{{1,2,3},{2,3},{1,7,3,4}};
System.out.println(arr.length);//3
System.out.println(arr[1].length);//2
3.4 二维数组的遍历
for(int i=0;i<arr.length;i++){
for(int j=0;j<arr[i].length;j++){
System.out.println(arr[i][j]+" ");
}
}
3.5 二维数组元素的默认值
规定:二维数组分为外层数组的元素,内层数组的元素
int[][] arr = new int[4][3];
外层元素为:arr[0]等
内层元素为:arr[1][1]等
默认值为:
针对初始化方式一:
int[][] arr = new int[4][3];
外层元素初始值:地址值
内层元素初始值:与一维数组相同
针对初始化方式二:
int[][] arr = new int[4][3]
外层元素初始值:null
内层元素初始值:不能调用,否则报错
3.6 二维数组的内存解析
4 数组的常见算法
1.数组的创建与元素赋值
2.针对于数值型的数组:最大值、最小值
4.3数组的赋值与复制
int[] arr1,arr2;
arr1 =new int[]{1,2,3,4};
赋值:arr2=arr1;
将arr1保存的地址赋给了arr2,使两者指向堆空间中的同一个数组实体。
复制:逐项复制即可
这种方式通过给arr2在堆空间开辟一块新的空间,再将arr1的元素一一赋值给arr2相应的元素。
4.4 数组的反转
for(int i=0;i< arr.length/2;i++){
String temp =arr[i];
arr[i]=arr[arr.length-i-1];
arr[arr.length-i-1]=temp;
}
4.5 数组的查找
4.5.1 线性查找
实现思路:通过遍历的方式,一个一个数据的进行比较、查找
适用性:具有普适性
4.5.2 二分法查找
实现思路:每次比较中间值,折半的方式搜索
适用性:数组必须有序
4.6 数组的排序
理解:
1.衡量排序算法的优劣
时间复杂度、空间复杂度、稳定性
2.排序的分类:内部排序 与 外部排序(需要借助磁盘)
3.不同排序算法的时间复杂度
4.手写冒泡排序
int[] arr = new int[]{36,5,7,23,-14,25,0,84};
//遍历原来顺序的数组
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+"\t");
}
//冒泡排序
for(int i=0;i<arr.length-1;i++){
for(int j=0;j< arr.length-i-1;j++){
if(arr[j]>arr[j+1]){
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
System.out.println();
//输出排序后的数组
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+"\t");
}
5 Arrays工具类的使用
理解:
- 定义在java.util包下
- Arrays:提供了许多操作数组的方法
6 数组的常见异常
1.数组的角标越界异常:ArraysIndexOutOfBoundsException
角标的范围: 0-arr.length-1
2.空指针异常:NullPointerException
操作的数组指向了空的数组元素