1.数组:存储同一类型元素的容器
1.1数组的定义格式
元素类型[指定长度] 数组名 = new 元素类型[指定长度]; 堆内存动态开辟内存空间存储。
元素类型[指定长度] 数组名 ={具体的值};堆内存静态开辟内存空间存储
1.2数组的特点:存储同一类型的数据,长度不可变。角标操作。
1.3数组中常见的异常,空指针异常,角标越界异常。
1.4数组的操作。获取最值(最大值,最小值),排序(选择排序(j=x),冒泡排序(j=0)),
1.4.1冒泡排序,每次两个相邻的值进行比较,内层循环结束,最后出现最大值。
内层循环 arr.length-1 避免角标越界
arr.length-x 减少参与比较的数,因为这些数,已经是最大值,排在最后,没有必要参与比较。
1.4.2选择排序。内循环结束 0角标位出现最小值。只要外层循环的值比内层循环值大,就互换位置。
0角标位的元素,和0角标位以后的每个元素进行比较,只要比他们大就互换,位置,这样可以保证0角标位置值最小。
然后,再进行1角标位置和1角标后的每个元素进行比较。
依次类推,
1.4.3折半查找(二分查找,操作角标)
通过定义变量,记录着头角标min,尾角标max,和中间角标mid,
初始化的变量为min = 0; max = arr.length - 1; mid = (max + min) / 2;
只要头角标小于等于尾角标,意味着还有数字可查。就可以一直进行循环判断和查找。
根据想要查找的key 进行判断,如果该数大于arr[midd] 那么意味着先要查找的数在midd角标的右边,需要重新计算头角标,从midd+1 开始。尾角标不变。
如果 key<arr[midd] 意味着想要查找的数在midd的左边,需要重新计算尾角标。
这样循环。通过if else if 语句,如果if else if 都不满足,就是既不大于,又不小于,那么就是等于。说明查找的数正对应midd。直接return 就可以了。
要考虑没有查找到。通过返回-1 来表示没有找到查找的数。
2.内存结构
Java程序在运行时,需要在内存中分配空间,为了提高效率,对内存空间进行了不同区域的划分,分为方法区,本地方法区,寄存器,堆内存区,栈内存区。
栈内存:用于存储局部变量,当数据使用完,所占用的空间自动释放。定义在方法中的变量,定义在方法参数上变量,定义在for循环的变量全都是局部的。
堆内存:数组和对象,通过new关键字建立的实例都存放在堆内存中;每一个实体都有内存地址;
实体中的变量都有默认初始化值,实体不再使用时,会在不确定的时间内被垃圾回收器回收。
总结:
栈内存中的变量没有默认初始化值,初始化才能使用,堆内存中的变量都是有默认初始化值的。
栈内存中的数据是自动释放,堆内存是垃圾回收.
栈内存与堆内存的联系,堆内存的首地址。
注意问题,当两个引用指向同一块堆内存的时候,任何一个引用的对内存操作都会影响到另外一个引用。