数组(Array): 属于引用类型的变量,是多个相同的类型数据按一定顺序(数组是有序的)排列的集合,并只使用一个名字,
并通过编号的方式(角标、下标、索引)对这些数据进行管理。

  1. 创建数组对象会在内存中开辟一整块连续的空间
  2. 数组长度一旦确定,就不能修改。
  3. 数组按维数可分:一维数组、二维数组…;
    按照数组元素的类型:基本数据类型元素的数组、引用数据类型元素的数组
  • 一维数组
    ①一维数组的声明和初始化
    ②如何调用数组指定位子的元素(name[0],角标从0到长度-1)
    ③如何获取数组的长度(name.length:0到长度-1)
    ④如何遍历数组(运用循环)
    ⑤数组元素的默认初始化值:整型为0;浮点型0.0;char类型0或者’\u0000’,非’0’,ASCII码为0的值;boolean为false;应用类型为null
    ⑥数组内存解析:栈(stack:存放局部变量)与堆(heap:new出来的结构,如对象、数组)
public class ArryTest{
   public static void main(String[] args) {
   int num=10;
   int id=1001;
   int[] ids;//声明
   //1.1静态初始化:数组初始化和数组元素的赋值操作同时进行
   ids=new int[] {1001,1002,1003,1004};
   //1.2动态初始化:数组的初始化和数组元素的赋值操作分开进行
   String[] names=new String[5];
 //只有以上两种正确写法,数组一旦初始化完成,其长度就确定了。
 int[] arr4={1,2,3,4};  //也是正确的,类型推断
   //错误写法:
   //int[] arr1=new int[];            ,没有定义长度或赋值
   //int[5] arr2=new int[5];         ,等号左边的[]应该为空
   //int[] arr3=new int[3]{1,2,3}  ,静态动态的一起了
   }
}
  • 二维数组:

一维数组的元素还是一维数组:一维数组arry1又作为另一个数组arry2的元素而存在。从数据的底层运行机制来看,其实没有多维数组。

public class ArryTest {
  public static void main(String[] args) {
   //静态初始化
   int[][] arr1=new int[][]{{1,2,3},{4,5},{6,7,8}};
   
      //动态初始化1
   String[][] arr2=new String[3][2];
 //动态初始化2
   String[][] arr3=new String[3][];
   //错误的情况
//   String[][] arr4= new String[][4];
//   String[4][3] arr5=new String[][];
//   int[][] arr6=new int[4][3] {{1,2,3},{4,5},{6,7,8}};
     
   
   //正确
    int[] arr4[]=new int[][]{{1,2,3},{4,5},{6,7,8}};
    int[] arr5[]={{1,2,3},{4,5},{6,7,8}};
    //2.如何调用数组的指定位置的元素
   System.out.println(arr1[0][1]);
   System.out.println(arr2[1][1]);//null
  
     arr3[1]=new String[4];//之前未指定,外层元素
   System.out.println(arr3[1][0]);
    
   //数组长度
   System.out.println(arr4.length);//3
   System.out.println(arr4[0].length);//3
   System.out.println(arr4[1].length);//2
  }
}

针对于初始化方式1,比如:int[][] arr=new int[4][3],外层元素,如;arr[0]的初始化值为:地址值;内层元素初始值为:与一维数组初始化情况相同
针对初始化方式二,比如:int[][] arr =new int[4][];外层元素的初始化值为:null;内层元素的初始化值为:不能调用,否则报错。

数组的常见算法

  1. 数组元素的赋值(杨辉三角、回形数)
  2. 求数组中元素最大值、最小值、平均值、总和
    ①获取[a,b]范围内的随机数:(int)(Math.random()*(b-a+1))+a;其中Math.random得到的是double型的数据
    ②若是数组间的赋值,只有一个new,数组所赋值的是地址,共用一个地址。如:int []x,y;x=new int[6];y=x;相当于新建快捷方式。要开辟两个地址,才可以将值移过去。
  3. 数组的复制(区别于数组变量的赋值)、反转、查找(线性查找、二分法查找)
    ①.equals()比较内容
    ②二分法查找的前提是要查找的数组必须有序
  4. 排序算法:冒泡排序,比较相邻的元素,其时间复杂度O(n^2):;快排的时间复杂度:O(nlogn);堆排序、归并排序

数组常见异常:

  1. ArrayIndexOutOfBoundsException:数组角标越界异常;
    合理范围:[0,arr.length-1]
    越界:arr[-1],arr[arr.length]
  2. NullPointerException:空指针异常
    int[] arr=null;
    arr[0];//在null情况下调用元素

,