Java核心编程I 79页
数组的概述
-
数组的概念
数组是多个相同类型数据按照一定顺序排列的集合,使用同一个名字命名,并通过编号的方式对这些数据进行统一管理 -
数组是有序排列的
-
数组本身是引用数据类型,数组的元素可以是任意的。
-
创建数组对象会在内存中开辟一段连续的空间,数组名引用的是这块连续空间的首地址
-
数组的长度一旦确定但不能修改
Arrays 方法
JAVA核心技术(85页)
Arrays方法是操作数组的工具类 import java.util.Arrays;
equals 比较两个数组是否相等
static boolean equals(xxx[] a, xxx[]b)
如果两个数组大小相同,并且下标相同的元素都对应相等,返回true
toString deepToString 输出数组信息
输出一维数组信息
static String toString(xxx[] a)
输出二维数组信息 deepToString
fill 将指定值填充到数组
static void fill(xxx[] a, xxx v)
binarySearch 二分查找
static int binarySearch(xxx[] a, int )
sort
使用优化的快速排序算法对数组进行排序
static void sort(xxx[] a)
一维数组
声明和初始化
- 声明
int[] ids//声明;
- 初始化
- 静态初始化
数组的初始化和数组元素的赋值操作同时进行
ids = new int []{1001,1002,1003,1004};
- 动态初始化
数组的初始化和数组元素的赋值操作分开进行
String[] names = new String[5];
数组的长度 array.length
int n = ids.length
数组元素的默认初始化值
整形和浮点型数组元素
- 创建一个数字数组时,所有的元素都初始化为0。即byte、short、int、long都是0
- 浮点型的数组元素初始值为0.0
char型
char型初始化为0 而非’0’
虽然输出看起来是空格 但实则是0
boolean型
- boolean数组元素会初始化为false。
引用数据类型
- 对象数组的元素则初始化为一个特殊值null,表示这些元素还未存放任何对象。
- 引用数据类型如String
遍历数组
for 下标循环
- 数组的索引从0开始
- 遍历
for(int i = 0;i<ids.length;i++){
ids[i] = i;
}
for each 循环 (不考虑下标
for each循环可以用来依次处理数组(或其他元素集合)中的每个元素,而不比考虑指定下标值
for(variable:collection) statement
for(int element:a){
System.out.println(element);
}
Arrays.toString(a)
调用Arrays.toString(a) 返回一个包含数组元素的字符串
System.out.println(Arrays.toString(a));
数组的内存解析
内存的简化结构
内存结构主要用到栈和堆。
栈(stack)是线性的,主要存放局部变量(放在方法中的变量都是局部变量)。
堆(heap)主要存放new出来的结构,一个是对象 一个是数组。
因为放在方法中的变量都是局部变量,局部变量都放在栈中。所以=左边的都是放在栈中。
new出来的是放在堆中,把在堆中的首地址赋给 栈中调用它的变量。
多维数组
二维数组的声明和初始化
- 静态初始化
int[][] arr = new int [][]{
{
1,2,3},{
4,5,},{
6,7,8}};
int[][] arr = {
{
1,2,3},{
4,5,},{
6,7,8}}; //也是正确的 类型推断
- 动态初始化1
String[][] arr2 = new String[3][2]
默认初始化值:外层元素的初始化值为地址值,内层元素的初始化值与一维数组的初始化情况相同
int[][] arr = new int[4][3];
System.out.println(arr[0]);//是地址值
System.out.println(arr[0][0]);//是零
int[][] arr1 = new int[4][];
System.out.println(arr3[0]);//null 一维数组是引用类型,默认是null
- 动态初始化2
String[][] arr2 = new String[3][];
arr2[0] = new String[4];
默认初始化值:
外层元素的初始化值为null
内层不能调用,否则报错
int[][] arr1 = new int[4][];
System.out.println(arr3[0]);//null 一维数组是引用类型,默认是null
左边的中括号可以放在任意位置,如String arr2[][] 或String [] arr2[] 但一般不这么写
Arrays.deepToString() 快速打印二维数组
int[][] a = new int [][]{
{
1,2,3},{
4,5},{
6,7,8}};
System.out.println(Arrays.deepToString(a));
//输出:[[1,2,3],[4,5],[6,7,8]]
二维数组的内存解析
右上角的代码在内存中的情况如下
当这个方法结束后,arr1就会出栈,出栈后指针没有 那堆的部分就会被回收
数组中常见的异常
数组越界
ArrayIndexOutOfBoundsExcetion
如果数组的取值范围是[0,5],那小于等于-1的,和大于等于6的索引都是数组越界
空指针异常
NullPointerException
//情况一:
//是不是数组没有造,或者造了后来赋值null
int[] arr1 = new int[]{
1,2,