一、声明与初始化一维数组
1、声明(两种方式)
数组元素类型 数组名称[];
数组元素类型[] 数组名字;
数组元素类型:决定了数组的数据类型,即数组要存放什么类型的数据,可以是基本数据类型和引用数据类型;
Java语言中声明数组时不能指定其长度(数组中元素的数), 例如: int a[5]; //非法
Demo:
int a[];
int[] a1;
double b[];
String[] c; //引用类型变量数组
2、初始化(两种方式)
数组的初始化:在内存当中创建一个数组,并且向其中赋予一些默认值,再用 new 运算符进行内存分配。
两种初始化方式:
(1)动态初始化(指定长度):数组声明且为数组元素分配空间与赋值的操作分开进行
数组名称 = new 数据类型[数组长度];
数据类型:也就是数组当中保存的数据,全都是统一的什么类型,与声明时要一致;
数组长度:也就是数组当中,到底可以保存多少个数据,是一个int数字;
注意:数组有定长特性,数组一旦初始化完成,其长度就确定了,不可更改。
(2)静态初始化(指定内容):在定义数组的同时就为数组元素分配空间并赋值。
数组名称 = new 数据类型[]{元素1,元素2,……};
注意:虽然静态初始化没有直接告诉长度,但是根据大括号里面的元素具体内容,也可以自动推算出来长度。
Demo:
int[] ids;//声明
//1.1 静态初始化:数组的初始化和数组元素的赋值操作同时进行
ids = new int[]{1001,1002,1003,1004};
//1.2动态初始化:数组的初始化和数组元素的赋值操作分开进行
String[] names = new String[5];
3、声明并初始化数组
声明的同时使用 new 关键字为数组分配内存空间:
数据类型 数组名字 = new 数组元素的类型[数组元素的个数]
数据类型 数组名字 = new 数组元素的类型[元素1,元素2,……]
注意:使用 new 关键字分配数组时,必须指定数组元素的类型和数组元素的个数或数组元素。
4、省略new的方式(类型推断)
数据类型[] 数组名称 = { 元素1, 元素2, ... };
使用这种方式,会根据元素类型推断中所创建的数组中的数据类型,此时声明和初始化必须在同一行!
Demo:
int[] arr = {1,2,3,4,5};//类型推断
int[] arr2;
arr2 = {1,2,3,4,5}; //编译不通过,这样必须写在同一行
二、一维数组的访问与数组长度
1、打印数组名称
当使用 System.out.println 打印数组的名称时,得到的数组对应的:数组对象的类型@内存地址哈希值。(十六进制的地址值)
Demo:
int[] arr2 = new int[3];
System.out.println(arr2); //结果是:[I@6d06d69c
2、数组的长度
每个数组都具有长度,而且是固定的,Java中赋予了数组的一个属性,可以获取到数组的 长度,语句为: 数组名.length ,属性length的执行结果是数组的长度,int类型结果。
由次可以推断出,数组 的最大索引值为数组名.length-1 。
注意:数组一旦初始化,其长度是不可变的。
3、访问数组中的元素
定义并用运算符new为之分配空间后,才可以引用数组中的每个元素
索引(下标):每一个存储到数组的元素,都会自动的拥有一个编号,从0开始,这个自动编号称为数组索引 (index),可以通过数组的索引访问到数组中的元素;
数组元素下标可以是整型常量或整型表达式。如a[3] , b[i] , c[6*i];
数组元素下标从0开始;长度为n的数组合法下标取值范围: 0 —>n-1; 如int a[]=new int[3]; 可引用的数组元素为a[0]、 a[1]、 a[2]
格式:
数组名[索引] = 数值, //为数组中的元素赋值
变量 = 数组名[索引] //获取出数组中的元素
三、遍历数组
数组遍历:就是将数组中的每个元素分别获取出来,就是遍历。遍历也是数组操作中的基石。
方式一:使用索引下标方式
1 int[] array = { 15, 25, 30, 40, 50, 60, 75 };
2 System.out.println(array[0]); // 15
3 System.out.println(array[1]); // 25
4 System.out.println(array[2]); // 30
5 System.out.println(array[3]); // 40
6 System.out.println(array[4]); // 50
7 System.out.println(array[5]); // 50
这种方式需要依次根据索引进行频繁重复的操作,不推荐使用,只做了解。
方式二:使用for
int[] arr = new int[5];
for(int i = 0;i < arr.length;i++){
System.out.println(arr[i]);
}
对于一个数组,每次对每个元素的操作都是相同的,用循环是最好的方法。而且就算数组的长度发送了改变代码也不需要改动。
方式三:使用 foreach 循环
1 for (int i: array){
2 System.out.println(array[i]);
3 }
这种循环是增强形式的 for 循环,其中 i 即代表数组中的每一个元素。
四、数组元素的默认初始化值
数组是引用类型,它的元素相当于类的成员变量,因此数组一经分配空间,其中的每个元素也被按照成员变量同样的方式被隐式
初始化。
对于基本数据类型而言,默认初始化值各有不同;
对于引用数据类型而言,默认初始化值为null(注意与0不同!)
整数类型:默认是 0;
浮点类型:默认是 0.0;
字符类型:默认为 '\u0000',字符编码为0的空字符;
布尔类型:默认是 false;
引用类型:默认是 null。
注意:静态初始化其实也有默认值的过程,只不过系统自动马上将默认值替换成为了大括号当中的具体数值。
五、一维数组的内存解析
1、内存概述
内存是计算机中的重要原件,临时存储区域,作用是运行程序。我们编写的程序是存放在硬盘中的,在硬盘中的程 序是不会运行的,必须放进内存中才能运行,运行完毕后会清空内存。
Java虚拟机要运行程序,必须要对内存进行空间的分配和管理。
2、Java 虚拟机的内存划分
为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。
JVM 的内存划分:
3、数组在内存中的存储
(1) 一个数组与内存关系
程序执行流程:
a、main 方法进入方法栈执行;
b、创建数组,JVM会在堆内存中开辟空间,存储数组;
c、数组在内存中会有自己的内存地址,以十六进制数表示;
d、数组中有3个元素,默认值为 0
e、JVM 将数组的内存地址赋值给引用变量 array;
f、变量 array 保存的是数组内存中的地址,而不是一个具体是数值,因此称为 引用数据类型;
(2)两个数组与内存关系
(3)两个变量指向一个数组
4、数组内存图
(1)声明数组类型
(2)数组的默认值
(3)数组的动态初始化
5、数组内存案例
(1)案例一
(2)案例二
(3)案例三