总结-数组
2018年2月20日星期二
l 数组概述
- 数组是一个容器,可以存储同一组数据类型的多个数据
- 数组是引用类型的,数组中的数据是存储在堆中的
- 在堆区中分配连续的存储空间,存储元素的值
- 每个数组都有一个引用名(数组名),引用数组,存储的是数组的首地址
- 数组元素有下标,下标是从0开始的,访问中间的元素用下标访问
- 数组有一个length属性,返回的是数组元素的个数
- 数组的有效下标位置是0 - length-1,如果下标没有在这个返回之内,就会报一个数组索引越界异常
- 数组的长度是固定不变的
l 数组的优缺点
- 优点:在内存中是连续存储的,因此遍历速度比较快
- 缺点:在内存中连续存储,因此在某下标处任意添加或删除元素时操作比较复杂
因为数组大小是固定不变的,因此当数组中添加的元素大于数组长度时,需要进行数组的扩容和复制.因此会造成内存的浪费.
l 数组的定义
①. 数据类型:
基本数据类型(如果美乳手动赋值的话是有默认值的):
Byte,short,int,long 默认值 0
Float,double 默认值 0.0
Char 默认值 \u0000(就是没有值)
Boolean 默认值
引用数据类型:类,接口,数组 默认值 null
引用类型的数组中存储的是每个元素所引用的对象地址,不是对象本身
语法:数据类型 [] 数组名 = new 数据类型[数组长度]
数据类型 数组名 [] = new 数据类型[数组长度]
②. 基本数据类型的数组
- int类型:int [] arr = new int [5];
- 给数组中的元素赋值:
动态赋值:在声明数组之后手动赋值
静态赋值:在声明数组的同时赋值
Int [] arr ={1,2,3,4,5,6}
静态赋值的时候代码不能拆成两行代码来写,只能用一行代码写
Int [] arr = new int []{1,2,3,4,5}
后面的中括号内不能写数组元素的个数,数组的长度由后面大括号内的元素个数决定.
- 数组的遍历:数组的遍历用for循环来遍历数组
- 父类类型数组可以引用子类类型对象=>多态
- 接口类型的数组,每个元素是引用实现类的对象=>多态
l 数组的扩容和复制
System.arraycopy(无返回值)
Arrays.copyOf(有返回值,返回值为新数组)
l 二维数组
l 数组的拍排序
冒泡排序:每次查找最大值,并放在数组的后面
For( int = a.length-1; i >0; i--) { //比较的轮数
For(int j = 0; j < i ; j++) { //比较的次数
If( a[ j ] > a[ j+1 ] ) { //两数比较,大的向后排
Int temp = a[ j ];
a[ j ] = a[ j + 1];
a[ j + 1] = temp;
}
}
}
选择排序:每轮查找最小值,并放到数组的最前面
For( int i = 0 ; i < a.length - 1 ; i++ ) { //比较轮数
Int min = i ; //记录本轮比较中最小值下标
For ( int j = i + 1 ; j < a.length ; j++ ) { //比较的次数,查找最小值
if ( a [ min ] > a [ j ] ) {
min = j ;
}
}
If (min > i ) { //判断最小值是否在合适位置,如没有交换
Int temp = a [ min ] ;
a [ min ] = a [ i ];
a [ i ] = temp;
}
}
Arrays.sort(数组名); 此为静态方法,可对数组进行升序排序,以为是对数组本身进行操作,没有产生新的数组,所以此方法没有返回值;内部实现机制为快速排序法,选择排序法排序速度要优于冒泡排序法,快速排序法的苏姚要优于选择排序和冒泡排序;
l 数组的查找
顺序查找:从数组的第一个元素开始,依次比较,有相等,则比较结束
二分法查找:前提是从有序的升序的数组中查找
Java.util.Arrays.binarySearch(); 系统的二分法查找方法,如果有返回对应下标,如果没有则返回应该插入的下标-1
手写的二分法查找代码
Public static int binarySearch ( int [] arr , int key ) {
Int begin = 0 ; //开始下标
Int end = arr.length - 1 ; //结束下标
While ( begin >= end ) {
Int mid = (begin + end ) / 2; //查找中间元素
Int midValue = arr [ mid ];
If ( key == midValue ){
Return mid;
} else if ( key > midValue ) {
Begin = mid + 1;
} else {
End = mid - 1;
}
}
Return -1 ; //没找到的情况下返回 -1
}
Java.util.Arrays 提供了一组静态方法,实现了对数组的查找排序扩容
copyOf(); 扩容并复制数组
Sort(); 对数组进行升序排序
binarySearch() 对有序数组进行二分法查找