1.数组
数组是数据结构中一种常用的数据结构,属于线性结构的一种,几乎所有的编程语言都内置原生的数组。
2.数组的声明
int Arr[] =new int [5]
int [] Arr=new int [5]
int [] Arr={1,2,3,4,5}
3.数组的类型
在使用数组的时候,要记住数组是引用数据类型。在数组使用之前一定要在内存中开辟一段空间使得数组的引用指向开辟的那段空间,否则数组将出现NullPointerException
异常。
public static void main(String[] args) {
int [] myArr=null;
System.out.println(myArr[1]);
}
// Exception in thread "main" java.lang.NullPointerException
4.数组的引用
java中的数组引用就是让数组b直接指向数组a(即b = a)。在java编程中这样做的目的是为了提高程序运行的效率。
int[] a = new int[10];
int[] b;
b = a;
假如数组中有上万个元素,在拷贝数组时,如果将数组a的所有元素都一一拷贝至数组b,时间开销很大,有时候也不是必需的。
所以,在Java语言中, b = a(a和b都是引用名)的含义就是将a起个别名"b"。
之后,a和b其实就是指向的是同一个对象
在Java中,这种给变量取别名的机制称之为引用(reference)。数组变量名也就是一种引用
5.数组的内存分配问题
哪些是引用数据类型? 在JAVA中除了8大基本数据类型,其他都是引用类型。
数组声明后,实际是在内存的栈内存中开辟一块区域用来存储数组的变量名称,并且同时在内存的堆内存中开辟一块区域用来存储数组所需要的元素的个数,接着使得数组的变量名称指向堆内存里面所对于的逻辑地址值,开辟新的堆内存要用到关键字New.
score = new int[3];
注意:在使用关键字new进行数组初始化完成后,该数组的长度是不可以改变的。
既然数组的大小不可以改变,那为什么下面的语法又不会出错呢?
public static void main(String[] args){
int score[] = new int [4]
int score[] = new int [10] // 正确
}
我们直观上看到score数组长度大小发生了变化。但在内存当中实际是new关键字重新向栈内存申请了一块大小为10的区域,而不是在先前大小为4的区域上添加大小为6的区域所构成大小为10的区域。这种方法在当数据较大的情况下会造成内存资源的极大浪费,所以不推荐使用。
6.数组的常见操作
- 数组的遍历
int myArry[]=new int[] {1,2,3,4,5};
for (int i : myArry) {
System.out.println(i);
- Insert——在指定索引位置插入一个元素
- Get——返回指定索引位置的元素 // 例题日后补充
- Delete——删除指定索引位置的元素
- Size——得到数组所有元素的数量
7.数组查找算法
- 顺序查找:顺序查找又称为线性查找,是一种最简单的查找方法。如果元素数量太多,这种方法的性能将会及低。
- 二分法查找(又名折半查找):比较有效,但是前提是数组元素必须有序。
java代码实现
使用递归实现折半查找
public static int BinarySearch(int[] arr,int key,int low,int high){
if(key < arr[low] || key > arr[high] || low > high){
return -1;
}
int middle = (low + high) / 2; //初始中间位置
if(arr[middle] > key){
return BinarySearch(arr, key, low, middle - 1);
}else if(arr[middle] < key){
return BinarySearch(arr, key, middle + 1, high);
}else {
return middle;
}
}
时间复杂度:在最坏情况下设查找的次数为x 则满足 2^x = n x=log2 n f(n)=O(log2 n)
8.数组排序算法 (八大排序算法)