前言:
在java语言执行程序中,经常需要存储大量的数据,有些时候甚至重复书写几乎完全相同的代码,并且需要声明所有的变量才可以解决一些问题,这就需要要一个高效的有条理的方法。
Java 和许多高级语言都提供了一种称作数组(array)的数据结构,可以用它来存储一个元素个数固定且元素类型相同的有序集。
数组的概念:
1. 数组是同一种类型数据的集合;即能够存放多个相同类型的数据的容器。
2. 数组在内存中是若干个大小一致,类型一样,地址连续的存储空间(究竟什么是地址)
数组的创建:
1. 数组的创建原理:
不同于基本数据类型变量的声明,声明一个数组变量时并不在内存中给数组分配任何空间。它只是创建一个对数组的引用的存储位置。如果变量不包含对数组的引用,那么这个变量的值为 null。除非数组已经被创建,否则不能给它分配任何元素。声明数组变量之后,可以使用下面的语法用 new 操作符创建数组,并且将它的引用賦给一个变量。
2. 数组的创建流程:
1.函数中定义变量空间并起名
2.在堆内存中根据长度创建数组
3.对每一个元素进行默认初始化 int->0 double->0.0 boolean->false
4.将数组中第一个元素的地址当成整个数组的地址传递给变量
5.变量指向该数组(引用数据类型)
3. 数组的创建格式:
元素类型[] 数组名 = new 元素类型[元素个数或数组长度]
数组大小和默认值:
1.
当给数组分配空间时,必须指定该数组能够存储的元素个数,从而确定数组大小。创建数组之后就不能再修改它的大小。
2.
可以使用 arrayRefVar.length 得到数组的大小。例如:
myList.length 为 10。
当创建数组后,它的元素被賦予默认值,数值型基本数据类型的默认值为 0, char 型的默认值为 ‘OOOO’,boolean 型的默认值为 false。
访问数组元素:
1. 数组的访问原理:
数组元素可以通过下标访问。数组下标是基于 0的,也就是说,其范围从 0 开始到arrayRefVar.length-1结束。
2. 例如:
int[] arr = new int[3];
arr[0] = 3;
//给数组编号(角标)为0的空间中存放int类型的常量值3
System.out.println(arr[1]);//输出数组编号为1空间中的值
数组内存:
1. Java的内存分配:
Java对内存空间的划分:
五部分:栈,堆,方法区,本地方法区,寄存器。
寄存器:存储CPU计算的一些临时数据
本地方法区:存储操作系统执行的部分代码
方法区:存储应用软件执行的部分代码
栈内存:存储都是局部变量。只要是在方法中定义的变量都是局部变量。一旦变量的生命周期结束该变量就被释放。
堆内存:存储都是实体(对象),每一个实体都有一个首地址值。堆内存的变量都有默认初始化值。不同类型不一样。(int-0 double-0.0 boolean-false char-’\u0000’。)
当实体不在使用时,就会被垃圾回收机制处理。
2. 数组的内存分配:
int[] arr = new int[3];
arr = null;
public static void main(String[] args){
int[] arr = new int[3];
arr = null;
}
图解说明: 程序执行main方法时,会先在堆内存中开辟数组空间,并为其分配内存地址0x34(假设)。数组各个空间都有默认的编号(角标或索引),接着给数组各个存储空间默认初始化为0。到底数组创建结束,将数组的内存地址赋值给main方法的数组引用变量arr。程序继续执行,将arr引用变量赋值为null,即arr不再指向堆中的数组实体。这时这个数组实体将会编程垃圾,等待垃圾回收机制收走。
数组的查找:
1. 线性查找法:
线性査找法将要査找的关键字 key 与数组中的元素逐个进行比较。这个过程持续到在列表中找到与关键字匹配的元素,或者査完列表也没有找到关键字为止。
线性査找法把关键字和数组中的每一个元素进行比较。数组中的元素可以按任意顺序排列。平均来看,如果关键字存在,那么在找到关键字之前,这种算法必须与数组中一半的元素进行比较。由于线性査找法的执行时间随着数组元素个数的增长而线性增长,所以,对于大数组而言,线性査找法的效率并不高。
2. 二分查找法:
二分査找法是另一种常见的对数值列表的査找方法。
使用二分査找法的前提条件是数组中的元素必须已经排好序。假设数组已按升序排列。二分査找法首先将关键字与数组的中间元素进行比较。
考虑下面三种情况:
1.如果关键字小于中间元素,只需要在数组的前一半元素中继续査找关键字。
2.如果关键字和中间元素相等,则匹配成功,査找结束。
3.如果关键字大于中间元素,只需要在数组的后一半元素中继续査找关键字。
3. 两种查找方法的注意事项及要点提示:
数组的扩容:
数组的扩容是用一个内存更大的数组来替换以前的数组,缩减反之,而并不改变原来数组的名字,将原先的数据放入到新数组中,被代替的旧数组则等待被java垃圾回收器收回。
数组的扩容如下图:
数组的缩减如下图: