数组
软件的基本功能是处理数据,而在处理数据时,必须先进行数据持有,将数据持有之后,再对数据进行处理。我们将程序中可以临时存储数据的部分叫做容器。
1.数组简介
Java当中具有持有数据功能的容器中,数组是最基本的。
1.数组特点
• 数组是Java当中效率最快的容器
• 数组的长度是固定的
• 数组中只能存储一种类型的数据
2.数组的定义
与基本类型不同,数组数据引用数据类型,需要创建实例
格式:
数据类型[] 数组名= new 数据类型[数组长度] ;
示例:int[] arr = new int[5];
还有其他格式如下:
int[] arr = new int[]{20,5,100,30,5}
int[] arr = {20,5,100,30,5}
int arr[] = new int[4];//源码中经常会看到的定义方式
2.数组的使用
1.数组底层是依次将数据进行编号后直接通过编号访问(线性序列)的。这个编号叫做索引。索引从0开始计数。
2.这里的”访问”包含以下两个动作:获取值与赋值
3.直接打印数组名是获取了数组的地址
4.访问数组中指定编号的元素:数组名[索引]
3 数组使用注意事项
在使用数组时,因为不当的操作,我们可能会通过编译,但是在运行期间遇到一些程序报错
类似这样编译时不报错,运行期报错的错误叫运行时错误
数组最常见的两个运行时错误:
• 空指针异常
编程语言中对空的处理与我们平常所理解的略有不同。这里我们区分两种空的不同
变量完全没有值:
定义了变量根本没有值:int a; int[] b
这样根本没有赋值过的变量是无法使用的。数组也是一种数据类型,可以指定变量,没有赋值是不能使用的。
变量有值,但值为null:
定义了变量并且赋值了,但是值是空值,是常量。这种情况只针对于引用数据类型,基本数据类型不成立。
int a = null; 编译失败
int[] arr = null; 正常赋值
当使用int[] arr = null给arr赋值时,变量arr作为数组名通过编号访问数组元素时编译不报错,运行时报运行错误NullPointerException空指针异常
• 数组索引越界异常
当数组中不存在该索引却访问该索引时,运行时报错:
ArrayIndexOutOfBoundsException 数组索引越界
3.引用类型内存解释
引用数据类型与基本数据类型存储时,存储的方式并不相同。引用数据类型是更为常见的数据类型,基本数据类型是为了便于开发预定好的特殊数据类型。这里我们将讨论引用数据类型的内存存储原理。
内存分区:
内存是计算机临时存储数据的区域,我们会将内存在逻辑上分配成不同区域方便对数据进行分类高效管理。
• 寄存器:最快的存储区域直接与CPU打交道,是程序员无法控制的计算区域。
• 堆栈:又叫栈,仅次于寄存器。用于存储局部变量。
• 堆:通用内存池,用于存放所有引用数据类型对象。每个对象均有地址,且有默认初始化值。
• 常量存储区域:用于存放永远不会被改变的值。
• 诸如硬盘形式的永久存储区域。
数组是引用数据类型
数组是我们系统介绍的第一个引用数据类型,了解内存结构将有助于后期整个面向对象的学习。
int[] arr = new int[]{1,5,6,1,7};
• 引用变量:引用数据类型定义的变量(arr)存储在栈内存当中,这个arr变量叫做这个数组实例的引用变量。
• =:与数学当中的意义不同,是赋值的意思,并非相等。
• 真正的数组实例是通过new关键字创建出来,存储于堆内存中,并产生一个十六进制表示的内存地址0x1A29。
• 在数组创建期间,会将所有值默认初始化,再进行赋值。对于int型的数值,其默认值为0。
• 这个引用变量会指向这个数组的内存地址
换句话说:引用变量的值是这个数组实例的地址值
再换句话说:引用变量通过地址可以表示这个数组对象
数组中的数据特点:
1.同一个数组内存储的是同一种类型的数据。
2.数组内的数据是无序的。
3.数组内的数据是重复的。