数组

1、数组

1.1多数据存储的需求

需求:现在需要统计某公司员工的工资情况,例如计算平均工资、找到最高工资等。假设该公司有80名员工,用前面所学的知识,程序首先需要声明80个变量来分别记住每位员工的工资,然后在进行操作,这样做会显得很麻烦。为了解决这种问题,Java就提供了数组供我们使用。

那么数组到底是什么呢?有什么特点呢?通过上面的分析:我们可以得到如下两句话:

数组是存储多个变量(元素)的容器
这多个变量的数据类型要一致

1.2数组定义格式

格式一:

数据类型[] 数组名 = new 数据类型[元素个数或数组长度];

格式二:

数据类型[] 数组名 = {元素值1,元素值2,元素值3,…};

示例:

格式一:

int[] arr = new int[5];

格式二:

int[] arr = {20,5,100,30,5}

2.数组元素的访问

数组元素的访问 指的是对数组元素的赋值和取值

格式一:

int[] arr = new int[3];

格式二:

int[] brr = {20,5,100,30,5}

无论是取值还是赋值都需要进行数组元素的访问

访问格式:

数组名[索引]

数组中的每个元素都是有编号的这个编号就叫索引,也称作角标或者下标,编号是从0开始的,最大的编号就是数组的 长度-1

比如想给arr数组的第一个元素赋值一个数字100 , 可以使用 arr[0] = 100;

想打印brr数组的第一个元素 可以使用 System.out.println(brr[0]);

示例:

如果数组名称为arr,索引为0,1,2

获取数组中元素的格式:

arr[0]获取数组中的第一个元素

arr[1]获取数组中的第二个元素

arr[2]获取数组中的第三个元素

每一个对象内的数据都有默认值

byte,short,int,long 0

float,double 0.0

char ‘\u0000’,一个空格

boolean false

引用类型:null

3.数组内存图与数据存储原理

3.1Java中的内存分配

Java 程序在运行时,需要在内存中的分配空间。

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

栈 存储局部变量

局部变量是定义在方法中或者语句中的变量

局部变量使用完毕,立即回收

堆 存储new出来的东西

每一个对象都有首地址值,是一个十六进制的地址

每一个对象内的数据都有默认值

byte,short,int,long 0

float,double 0.0

char ‘\u0000’,一个空格

boolean false

引用类型:null

使用完毕后,会被垃圾回收器空闲的时候回收。

其他区域

方法区 (存放字节码文件,常量等)

本地方法区(系统使用)

寄存器(给CPU使用)

数组的内存示意图

java中数组取值_数组名


定义一个数组,输出数组名及元素。然后给数组中的元素赋值,再次输出数组名及元素

java中数组取值_数组_02


3.2数组遍历

遍历数组是最常见的操作,即依次访问数组中每个元素。使用数组名.length可以获取数组长度,配合循环可以完成遍历动作。

遍历数组代码如下:

int[] arr = {213,4,2,6,10,8};
 for (int i = 0; i < arr.length; i++) {
 System.out.println(arr[i]);
 }


3.3数组操作的两个问题
在使用数组时,因为不当的操作,我们可能会通过编译,但是在运行期间遇到一些程序报错,称为运行时错误。
数组最常见的两个运行时错误:空指针异常和数组索引越界异常
3.3.1空指针异常
编程语言中对空的处理与我们平常所理解的略有不同。这里我们区分两种空的不同
变量完全没有值:
定义了变量根本没有值:int a; int[] b
这样根本没有赋值过的变量是无法使用的。数组也是一种数据类型,可以指定变量,没有赋值是不能使用的。

变量有值,但值为null:
定义了变量并且赋值了,但是值是空值(空值也是一个数值)。这种情况只针对于引用数据类型,基本数据类型不成立。
int a = null; 编译失败
int[] arr = null; 正常赋值

当使用int[] arr = null给arr赋值时,变量arr作为数组名通过编号访问数组元素时编译不报错,运行时报运行错误NullPointerException空指针异常,因为没有new数组对象的过程,即堆内存中没有数组。
3.3.2数组索引越界异常
当数组中不存在该索引却访问该索引时,运行时报错:
ArrayIndexOutOfBoundsException 数组索引越界