------- android培训、java培训、期待与您交流! ----------
1、数组的定义
概念:同一种类型数据的集合。其实数组就是一个容器。
数组的好处:可以自动给数组中的元素从0开始编号,方便操作这些元素。
格式1:
元素类型【】 数组名 = new 元素类型【元素个数或数组长度】;
例:int[] arr = new int[5];
格式2:
元素类型【】 数组名 = new 元素类型【】{元素,元素,......};
例:int[] arr = new int[]{3,5,1,7}; 或 int[] arr = {3,5,1,7};
2、数组的内存分配及特点
int[] arr = new int[4];
内存分配图:
Java程序在运行时,需要在内存中分配空间。为了提高运算效率,又对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。
栈内存:
用于存储局部变量,当变量所属的作用域一旦结束,所占空间会自动释放。
堆内存:
数组和对象,通过new建立的实例都存放在堆内存中。
每一个实体都有内存地址值
实体中的变量都有默认初始化值,根据类型的不同而不同。整数类型是0,小数类型是0.0或0.0f,boolean类型是false,char类型是'\u0000'
如果将数组的引用实体设置为null,也就是实体不再被使用,那么会在不确定的时间内被垃圾回收器回收。
3、 数组操作常见问题
数组脚标越界异常(ArrayIndexOutOfBoundsException):访问到了数组中的不存在的脚标时发生。
空指针异常(NullPointerException):当引用型变量没有指向任何实体时,用其操作实体,就会发生该异常。
4、数组的常见操作
对数组操作最基本的动作就是存和取。核心思想:就是对角标的操作。
常见操作一:获取最值(最大值,最小值)(重要,黑马程序员面试必考)
思路:
1、需要进行比较,并定义变量记录住每次比较后较大的值。
2、对数组中的元素进行遍历取出,和变量中记录的元素进行比较。如果遍历到的元素大于变量中记录的元素,就用变量该记录住大的值。
3、遍历结果,该变量记录就是最大值。
明确二:未知内容。数组。
选择排序:
思路:
1、首先拿数组第一个元素依次与除其自身外的其他每个元素顺序比较,如果第一个元素大于剩下的某个元素,就互换内容。
2、经过第一轮比较之后,此时第一个元素就是数组中最小的元素。然后再拿第二个元素与除第一个元素和其自身的元素进行比较,如果第二个元素大于剩下的某个元素,就互换内容。
3、依次类推,直到最后一个元素。
冒泡排序
思路:
1、首先在第一轮排序中,数组从第一个元素到倒数第二个元素依次与其右边的元素进行比较,如果左边的元素大于右边的元素,那么两个元素就互换。
2、经过第一轮比较,最大的元素就已经存储到数组最右边的结点中了。
3、第二轮排序则是从第一个元素到倒数第三个元素依次与其右边的元素进行比较,如果左边的元素大于右边的元素,那么两个元素就互换。
4、依照此方式,一直到只有第一和第二个元素互相比较而结束。
常见操作三:折半查找(二分查找)
注意:
如果一个数组是无序的,那么可以通过简单遍历查找的方式查找到某个元素所在的角标。
但是如果一个数组是有序的,那么就可以通过一种更高效的方式达到相同的目的,也就是二分查找。
思路:
1、设置三个变量记录角标:min、max、mid。min初始值为0,max为数组最大角标,mid为(max+min)/2。
2、查看mid角标的元素是否与待查找的值相等,如果相等,则直接返回角标值,程序终止执行。
3、如果待查找的值小于角标为mid的元素值,那么说明待查找的元素的位置可能在min与mid角标之间。设置max = mid - 1,mid = (max + min)/2,重复第1、2步的操作。
4、如果待查找的值大于角标为mid的元素值,那么说明待查找的元素的位置可能在mid与max角标之间。设置min = mid + 1,mid = (max + min)/2,重复第1、2步的操作。
5、如果数组中不存在待查找的元素,那么按照如上流程,最终min角标值会大于max角标值,此时返回-1。