Java数组
数组是相同类型数据的有序集合。每个数据称一个数组元素,每个元素可通过下标来进行访问。
1、数组声明创建与初始化
语法:
dataType[] arrayRefVar; // 首选,推荐使用
dataType arrayRefVar[]; // 效果相同,但不推荐使用
dataType[] arrayRefVar = new dataType[arraySize]; // 使用new方法创建数组,需要指定数组大小
获取数组长度:arrays.length;
-
静态初始化
int[] a = {1,2,3}; Man[] mans = {new Man(1,1), new Man(2,2)};
-
动态初始化
int[] a = new int[10]; a[0] = 1; a[1] = 2;
没有赋值时,系统会隐式初始化,会赋给默认值。
数字默认是0,char类型默认u0000,Boolean类型默认false,引用类型默认null
-
以下都是合法的定义数组
int num[][] = new int[1][]; int []num1[] = new int[1][]; int[][] num2 = new int[1][]; int[][] num3 = new int[1][2];
前面定义括号可以随意放,但是后面括号必须在类型后面,并且第一个括号必须有初始值。
2、内存分析
数组也是对象,数组对象都是保存在堆中的。一个数组的长度是确定的,不可变的。
下标越界则报异常:ArrayIndexOutofBoundsException
3、多维数组
多维数组可以看成数组的数组。比如二维数组就是一个特殊的一维数组,其每一个元素都是一个一维数组。
二维数组:
int a[][] = new int[2][5];
4、Arrays类
- 数组的工具类java.util.Arrays
- Arrays类中的方法都是static修饰的静态方法,在使用的时候可以直接使用类名进行调用,可以不用使用对象来调用。
- 具体有以下常用功能:
- 给数组赋值:通过 fill 方法
- 对数组排序:通过 sort 方法,按升序
- 比较数组:通过 equals 方法比较数组中元素是否相等
- 查找数组元素:通过 binarySearch 方法能对排序好的数组进行二分查找法操作
- 打印数组元素:通过 toString 方法
5、冒泡排序 面试常遇见
看到嵌套循环,应立马得出这个算法的时间复杂度为O(n2)
public static int[] sort(int[] array){
int temp = 0;
// 如果在还没有循环完,就已经排好序了,就可以利用设置的flag跳出循环,可以节约循环时间(优化)
boolean flag = false;
// 外层循环,作用是指定循环次数,每一次循环都会将该次循环中的最小的数或者最大的数找出来
// 一次循环找出一个数
for(int i = 0; i < array.lenght; i++){
// 内层循环,作用是每一次循环,对所有元素,进行依此两两比较
for(int j = 0; j < array.lenght-1; j++){
if(array[j+1] < array[j]){
temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
flag = true;
}
}
}
if(flag == false){
break;
}
return array;
}
6、稀疏数组 重点 压缩数组
当一个数组中大部分都是0,或者为同一值的数组时,可以使用稀疏数组来保存该数组。
稀疏数组就是存入原数组的有效值的数组,对原数组进行有效压缩。
稀疏数组的处理方式:
- 记录数组一共有几行几列,有多少个不同值
- 把具有不同值的元素和行列及值记录在一个小规模的数组中,从而缩小程序的规模
稀疏数组:[0] 存入的是原数组有几行几列几个有效值;从[1]开始存入的是第几行第几列值是多少
7、二分查找法(折半查找法) 面试常见
public class Test{
public static void main(Strings[] args){
int[] a = {45,34,23,12,10,55,76};
new Test.binarySearch(a,10);
}
public void binarySearch(int[] a, int b){
Array.sort(a);
int low = 0;
int high = a.length - 1;
while( low <= high ){
int mid = (low + high) / 2;
if( b < a[mid] ){
high = mid - 1;
}
if( b > a[mid] ){
low = mid + 1;
}
if( b == a[mid] ){
System.out.println("查找成功!");
break;
}
}
}
}