Array:Java中的容器:数组、集合框架(第12章),在内存中对多个数据的存储。
要素;数组名、下标、元素、数组长度
特点:数组本身是引用数据类型,数组中的元素可以是任意数据类型(基本数据类型或者引用数据类型)。
数组可以按照元素类型分类,也可以依据数组的维数分类。
一维数组:
1、声明和初始化
2、调用数组中的指定元素。
3、数组的属性
4、数组的遍历
5、数组元素的默认初始化值
6、一维数组的内存解析
1.1:数组的声明与初始化
(1)静态初始化:
数组变量与数组元素的赋值操作同时进行。
double[] prices; //声明数组。
prices = new double[]{28,32,43.21}; //静态初始化。
等价于:
double [] prices = new double{28,32,42.31};
int [] arr9 ={1,2,3}; //静态初始化方法2
(2)动态初始化:数组变量与数组元素的服饰操作分开进行。
String[] fruit;
String[] fruit = new String[3]; //动态初始化。
(3)其他正确的方式
int arr1[]=new int[4];
int [] arr1 = {1,2,3,4};
另,以字符形式而非数字形式给数组赋值时,赋值内容应当用双引号括起。
例如:
String[] fruit;
fruit = new String[]{"grape","orange","apple"};
1.2 数组元素的调用
(1)通过数组元素的角标获取数组的元素
角标的范围从0开始,到数组长度-1结束;
1.3 数组的属性
数组的长度:用来描述数组容器中容量的大小
使用length属性表示
1.4 数组的遍历
for(int i=0;i<3;i++){
System.out.println(fruit[i]);
}
1.5 数组的默认初始化值
(1)整型数组元素的默认初始化值---->0
(2)浮点型---->0.0
(3)字符型---->0或理解为’\u0000’
(4)布尔型---->false
(5)引用数据类型---->null
1.6 数组的内存解析
(1)内存区域划分为5个部分:程序计数器、虚拟机栈、本地方法线、堆(heap)、方法区
与目前数组有关的内存结构:
虚拟机栈:用于存放方法中声明的变量,比如arr
堆:用于存放数组的实体(即数组中的所有元素)
栈中存放变量的首地址,构成指针指向堆中的具体数组元素。
堆中为数组实体开辟一片连续的空间,只暴露首地址(虚拟地址),赋值时具体的值取代初始化赋值。
两个变量(arr、arr1)指向同一数组
int [] arr1=arr; //定义数组变量arr1,将arr的首地址赋值给arr1
数组的下标为什么从0开始:数组第一个元素距离首地址的偏移量为0.
二维数组
实际上,二维数组就是指,某个一维数组arr1内部的数组元素arr1[i]为另外的一维数组arr2。
六个基本点与一维数组相同。
1、声明和初始化
2、调用数组中的指定元素。
3、数组的属性
4、数组的遍历
5、数组元素的默认初始化值
6、内存解析
2.1 声明和初始化
(1)静态初始化
int [][] arr2 = new int [][]{{1,2,3},{4,5},{6,7,8}}; //[][]内不能写明长度
(2)动态初始化
String [][] arr3 = new String[2][2]; //规则二维数组
double[][] arr4 = new double[2][]; //不规则二维数组
二维数组中有2个一维数组,一维数组属于引用数据类型,默认初始值为null
(3)其他正确写法
int arr5[][]=new int [][]{{1,2,3}.{4,5}};
int [] arr6[] = new int [][]{{1,2,3},{4,5}}; //中括号的位置可灵活变换。
int arr7[][]={{1,2,3},{4,5}}; //类型推断。
String arr8 [][] = new String[3][4];
2.2 二维数组的调用
(1)内层元素的调用
int [][] arr2 = new int [][]{{1,2,3},{4,5},{6,7,8}};
System.out.println(arr2[1][1]); //arr2[1][1]=5
(2)外层元素的调用
System.out.println(arr2[0]); //[I@4206a205
System.out.println(arr2[1]); //[I@29ba4338
System.out.println(arr2[2]); //[I@57175e74
外层元素的调用会取出地址值。
2.3 数组的属性(长度)
int [][] arr2 = new int [][]{{1,2,3},{4,5},{6,7,8}};
System.out.println(arr22.length); //3
System.out.println(arr2[0].length); //3
数组的length为内部最外层数组元素的个数。
2.4 二维数组的遍历
int [][] arr2 = new int [][]{{1,2,3},{4,5},{6,7,8}};
for(int i=0;i<arr2.length;i++){
for(int j=0;j<arr[i].length;j++){
System.out.println(arr2[i][j]+"\t");
}
System.out.println();
}
2.5 数组的默认初始化值
二维数组的外层元素初始值为对应的地址。
二维数组的内层元素初始值与一维数组相同。
动态数组声明和初始化时存在例外。
double[][] arr4 = new double[2][];
System.out.println(arr4[0]); //null。arr[4]数组为引用类型,初始为null
System.out.println(arr4[0][0]); //报错。没有指针,无法获取。
2.6 数组的内存解析
代码中的new表示新开辟空间,建立新地址
int []arr1=new int [10]; byte []arr2=new byte [10]; arr1=arr2; //编译不通过,int[]与byte[]为两种不同类型的引用变量