数组的定义和访问
容器概述
变量中,只能储存一个数据,新的数据进来,老的数据会被替换,如果存储多个数据,需要使用容器
具有类别性, 具有容量固定性
数组概述
- java中的容器就是数组.可以存储多个数据, 但是多个数据的类型必须保持一致.
- 特点:
- 可以存储多个数据
- 多个数据的类型必须保持一致.\
- 数组的长度(数组中可以存储元素的数量)一旦确定,就不可以发生改变.
- 数组是一个引用类型,
- 数组容器变量的定义格式
数组是一个容器, 数组变量是给该容器起名字的,通过名字方便找到容器.
如通过门牌号,找到教室
- 格式一(最好)
数组存储的数据类型[] 数组名字;- 格式二
数组存储的数据类型 数组名字[];
- 引用类型变量
这种变量存储的不是普通的数据值,而是内存中的地址值,
如数组
当int[] array; 来定义一个数组变量, 其实 array变量中存储的是 创建array数组所对应的地址值.(就如同是产生了门牌号)
图中箭头左边,相当于int[] array(门牌号)
箭头右边, 相当于new array(创建了一间教室)
箭头相当于 =
数组的初始化
- 方式一 数组的动态初始化
- 格式
数组存储的数据类型[] 数组名字 = new 数组存储的数据类型[长度];
int[] arr = new int[3];
- 格式的解释
- 数组存储的数据类型: 创建的数组容器可以存储什么数据类型。
- [] : 表示数组。
- 数组名字:为定义的数组起个变量名,满足标识符规范,可以使用名字操作数组。
- new:关键字,创建数组使用的关键字。就是为数组容器开辟内存空间的
- 数组存储的数据类型: 创建的数组容器可以存储什么数据类型。(左右两侧数据类型要一致)
- [长度]:数组的长度,表示数组容器中可以存储多少个元素。
注意:数组有定长特性,长度一旦指定,不可更改。
真正的数组是 = 右侧. 左侧只是给数组起的变量名
- 方式二 数组的静态初始化
- 格式
标准格式:
数据类型[] 数组名 = new 数据类型[]{元素1,元素2,元素3...};
右侧[]中的数字可以省略,会根据后侧元素数量,自动补充
= 的左侧:教室的门牌号
= 的右侧:创建了一间教室,并放置多个学生
- 方式三 数组的简化静态初始化(推荐)
数据类型[] 数组名 ={元素1,元素2,元素3...};
右侧的 new 数组名[] 省略了
注意:
(1). 数组长度,根据{}中的元素计算出来
(2). 虽然没有写new,但是底层仍然有new的过程
(3). 动态初始化/标准静态初始化可以分为两步完成如同刚开始学的变量赋值一样
也可以进行重新赋值(但是定义的数组类型不得改变)
(4). 简化静态初始化方式,不可以分为两步完成
如
float[] arrA;
arrA = new float[3];
arrA = new float[30];
int[] arrB;
arrB = new int[]{10,20};
arrB= new int[]{100,200,300}
数组的访问
- 简化格式静态初始化数组的使用
- 数组名: 代表数组容器在内存空间的地址值,是一个十六进制的数据
- 数组中的每个元素都有一个唯一的编号: 称为索引, 但是索引编号从0开始,索引编号的最大值为数组长度-1.
int[] array = {10, 20, 30};
System.out.println(array);
//[I@6e8dacdf I 表示int类型 @ 如同微信中的@某人 后边儿跟的是array的地址值(是一个16进制的数据)
- 数组元素的访问:
数组名[索引编号]
array[2]: 数组array中索引编号为2的元素 - 获取数组的长度
int size = 数组名称.length;
注意
array.length; length是数组的属性,并不是一个方法所以不要加();
array.length 是一个int类型的值,所以用int 类型变量来接收
如:int size = array.length
- 动态初始化的使用
注意
- 动态初始化数组,元素有默认值
基本类型:
整数:byte/shor/int/long: 默认值都为0
小数:float/double 默认值为0.0
布尔:boolean 默认值为false
字符:char 默认值为空白字符
引用类型:默认值都为null
数组原理内存图
内存概述
内存是计算机中的重要原件,临时存储区域,作用是运行程序。我们编写的程序是存放在硬盘中的,在硬盘中的程序是不会
运行的,必须放进内存中才能运行,运行完毕后会清空内存。
Java虚拟机要运行程序,必须要对内存进行空间的分配和管理。
Java虚拟机的内存划分
寄存器 给CPU使用,线程运行相关,和我们开发无关。
本地方法栈 JVM在使用操作系统功能的时候使用,用来存储系统函数相关的内容,和我们开发无关。
方法区 存储可以运行的class文件(字节码文件),运行时常量池,静态成员.是在内存中运行.class文件的地方, 没使用的时候,就是在硬盘中
方法栈 所有方法运行时使用的内存,比如main方法运行,进入方法栈中执行。
栈内存: 运行方法/存储局部变量
堆内存 存储对象或者数组,new来创建的,都存储在堆内存。
当堆内存中的数组不再被使用的时候, 就会被垃圾回收器回收
注意
画内存图,只需要用到方法栈和堆内存
数组在内存中的存储
一个数组的内存图
两个数组的内存图
两个变量指向一个数组
数组操作的常见问题
数组越界异常
ArrayIndexOutOfBoundsException
解决方法:
找到数组索引越界的地方,进行修改
数组空指针异常
原因 赋值给array 为null值时, 就会出现空指针情况
求三个数的最大值
思路
- 假定某个变量的值最大, 保存到int类型的max中
- 用其余两个变量和max进行比较, 只要其余两个变量的值大于max, 就对max进行重新赋值
int a = 10 ,b =20,c=30;
int max = a ;
if (b > max) {
max= b;
}
if (c > max) {
max =c;
}
System.out.println(max);
数组中需要用到遍历
int[] array = {10, 20, 33, 22, 29};
int max = array[0];
//遍历元素,并进行比较大小,并把比较打的赋值给max
for (int i=1;i < array.length;i++){
if (array[i] > max) {
max = array[i];
}
}
System.out.println("最大值为:"+max);
网友评论