数组
数组是引用数据类型,数组一旦被初始化,其长度不可变
数组中可存储基本数据类型和引用数据类型的数据,只要所有数组元素的数据类型相同即可。
数组的好处:可以自动给数组中的元素从0开始编号,方便操作这些元素。
格式1:
元素类型[] 数组名 = new 元素类型[元素个数或数组长度]
示例:int[] arr = new int[5];
格式2:
元素类型[] 数组名 = new 元素类型[]{元素,元素,......}
int[] arr = new int[]{3,5,1,7};
int[] arr = {3,5,1,7};
二维数组
二维数组就是数组中的元素还是数组
格式1:int[][] arr = new int[3][2];
定义了名称为arr的二维数组,二维数组中有3个一维数组,每一个一维数组中有2个元素
一维数组的名称分别为arr[0],arr[1],arr[2]
给第一个一维数组1角标位赋值为78写法是:arr[0][1] = 78;
格式2:int[][] arr = new int[3][];
二维数组中有3个一维数组,每个一维数组都是默认初始化值null,可以对这三个一维数组分别进行初始化
arr[0] = new int[3];
arr[1] = new int[1];
arr[2] = new int[2];
数组的内存分配及特点
内存结构
Java程序在运行时,需要在内存中分配空间,为了提高运算效率,又对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。
1 栈内存
用于存储局部变量,当数据使用完,所占空间会自动释放。
2 堆内存
数组和对象,通过new建立的实例都存放在堆内存中。
每一个实体都有内存地址值
实体中的变量都有默认初始化值
实体不在被使用,会在不确定的时间内被垃圾回收器回收
3 方法区
4 本地方法区
5 寄存器
数组常见操作
1 获取数组中的元素(通常会用到遍历)
注:通常有数组的情况下,都会用到for循环。
数组中有一个属性length可以直接获取到数组中元素个数,
使用方式:数组名.length
int[] arr=new int[]{1,2,3,4};
System.out.println(arr.length);
for(int x=0;x<arr.length;x++)
{
System.out.println("arr["+x+"]="+arr[x]+";");
}
2 获取数组中的最大值
思路:
1 获取最值需要进行比较,每一次比较都会有一个较大的值,因为该值不确定。通过一个变量进行存储。
2 让数组中的每一个元素都和这个变量中的值进行比较。如果大于变量中的值,就用该变量记录较大值。
3 当所有的元素都比较完成,那么该变量中存储的就是数组中的最大值了。
步骤:
1 定义变量,初始化为数组中任意一个元素即可
2 通过循环语句对数组进行遍历。
3 在遍历过程中定义判断条件,如果遍历到的元素比变量中的元素大,就赋值给该变量。
需要定义一个功能来完成。以便提高复用性。
1 明确结果,数组中的最大元素 int
2 未知内容:一个数组。int[]
3 对数组进行排序
1 选择排序
大圈套小圈原理,使用for循环嵌套。
选择排序特点:内循环结束一次,最值出现头角标位置上。
2 冒泡排序(面试重点)
相邻两个元素进行比较,如果符合条件换位。
使用for循环嵌套。
冒泡排序特点:内循环结束一次,最值出现尾角标位置。
4 数组的查找(在遍历过程中进行判断)
1 普通查找
通过数组中的元素获取数组所在的位置。
思路:对给定数组arr[] 进行遍历操作,如果遍历到的数arr[x]与给定的数key相等,则获取其角标。
注:如果数组中有重复的key,则获取的是key第一次出现的位置。
2 拆半查找(数组必须是有序的)
数组操作常见问题
ArrayIndexOutOfBoundsException:数组角标越界异常。操作数组时访问到了数组中不存在的角标。
NullPointerException:空指针异常.当引用没有任何指向值为null的情况,该引用还在用于操作实体。