4、数组

数组的概述

说明: untitle.png

数组的特点:数组是有序排列的。

1、数组属于引用数据类型的变量。数组的元素既可以是基本数据类型也可以是引用数据类型。

2、创建数组对象会在内存中开辟一整块连续的空间,而数组名中引用的是这块连续空间的首地址。

3、数组的长度一旦确定,就不能修改。

数组的分类

按照维度:一维数组、二维数组、三维数组、…

按照元素的数据类型:基本数据类型元素的数组、引用数据类型元素的数组(即对象数组)

一维数组的使用

一维数组的声明和初始化

说明: untitle.png

说明: untitle.png

数组一旦初始化完成,其长度就确定了。

数组元素的引用

数组的角标从0开始,到数组的长度减一结束。

使用属性length可以获取数组的长度。

说明: untitle.png

增强遍历一维数组(foreach)

说明: untitle.png

int[] a = new int[]{1,2,3,4}; 
for(int e : a){ 
 System.out.println(e);
}
//--------------------------------------
String[] names = {"beibei", "jingjing"};    
for (String name : names) {    
 System.out.println(name);
}

数组元素的默认初始化值

说明: untitle.png

内存解析

内存的简化结构

说明: untitle.png

一维数组的内存解析

说明: untitle.png

多维数组的使用

对于二维数组的理解,我们可以看成是一维数组 array1又作为另一个一维数组array2的元素而存在。其实,从数组底层的运行机制来看,其实没有多维数组。

二维数组的声明和初始化

说明: untitle.png

说明: untitle.png

二维数组的引用

int[][] arr = new int[][]{{1,2,3,},{4,5},{6,7,8}};
System.out.println(arr[0][1]); 
输出
2

二维数组的长度

int[][] arr = new int[][]{{1,2,3,},{4,5},{6,7,8}}; 
System.out.println(arr.length); 
输出
3
System.out.println(arr[1].length); 
输出
2

遍历二维数组

使用嵌套循环

int[][] arr = new int[][]{{1,2,3,},{4,5},{6,7,8}}; 
for(int i = 0;i < arr.length;i++){ 
  for(int j = 0;j < arr[i].length;j++){ 
    System.out.print(arr[i][j]);    
  }   
} 输出
12345678

二位数组的元素默认初始值

int[][] arr = new int[4][3];
System.out.println(arr[0]); 
System.out.println(arr[0][1]);
输出
[I@15db9742
//外层数组默认值为地址值
0
//内层数组默认值为对应类型一维默认值

二维数组的内存解析

说明: untitle.png

数组中涉及到的常见算法

说明: untitle.png

二分法查找

要求:要查找的数组必须有序

设置首位索引的方法,不断地取中间值。

/** 
* 二分查找法
*/
public static int binSearch(int[] a,int b){   
  int low = 0;   
  int high = a.length - 1;  
  while (low <= high){   
    int mid = (low + high)/2;   
    if (a[mid] < b){        
      low = mid + 1;      
    }else if(a[mid] == b){       
      return mid;       
    }else {   
      high = mid - 1;  
    }   
  }  
  return -1;
}

常用方法

Arrays工具类的使用

说明: untitle.png

System.arraycopy

//src:     原数组
//srcPos: 原数组起始位置(从这个位置开始复制)
//dest:   目标数组
//destPos:目标数组粘贴的起始位置
//length: 复制的个数
public static native void arraycopy(Object src,  int  srcPos, Object dest, int destPos, int length);

数组常见异常

说明: untitle.png