一、声明与初始化一维数组

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不同!)

Java中一维数组和二维数组 java的一维数组_数组

整数类型:默认是 0;

浮点类型:默认是 0.0;

字符类型:默认为 '\u0000',字符编码为0的空字符;

布尔类型:默认是 false;

引用类型:默认是 null。

注意:静态初始化其实也有默认值的过程,只不过系统自动马上将默认值替换成为了大括号当中的具体数值。

五、一维数组的内存解析

1、内存概述

内存是计算机中的重要原件,临时存储区域,作用是运行程序。我们编写的程序是存放在硬盘中的,在硬盘中的程 序是不会运行的,必须放进内存中才能运行,运行完毕后会清空内存。

Java虚拟机要运行程序,必须要对内存进行空间的分配和管理。

2、Java 虚拟机的内存划分

为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。

JVM 的内存划分:

Java中一维数组和二维数组 java的一维数组_数组_02

Java中一维数组和二维数组 java的一维数组_Java中一维数组和二维数组_03

       

Java中一维数组和二维数组 java的一维数组_初始化_04

3、数组在内存中的存储

(1) 一个数组与内存关系

Java中一维数组和二维数组 java的一维数组_初始化_05

程序执行流程:

a、main 方法进入方法栈执行;

b、创建数组,JVM会在堆内存中开辟空间,存储数组;

c、数组在内存中会有自己的内存地址,以十六进制数表示;

d、数组中有3个元素,默认值为 0

e、JVM 将数组的内存地址赋值给引用变量 array;

f、变量 array 保存的是数组内存中的地址,而不是一个具体是数值,因此称为 引用数据类型;

(2)两个数组与内存关系

Java中一维数组和二维数组 java的一维数组_Java中一维数组和二维数组_06

(3)两个变量指向一个数组

Java中一维数组和二维数组 java的一维数组_数组_07

4、数组内存图

(1)声明数组类型

Java中一维数组和二维数组 java的一维数组_java 一维数组_08

(2)数组的默认值

Java中一维数组和二维数组 java的一维数组_数组_09

(3)数组的动态初始化

Java中一维数组和二维数组 java的一维数组_Java中一维数组和二维数组_10

5、数组内存案例

(1)案例一

Java中一维数组和二维数组 java的一维数组_数组_11

(2)案例二

Java中一维数组和二维数组 java的一维数组_初始化_12

(3)案例三

Java中一维数组和二维数组 java的一维数组_Java中一维数组和二维数组_13