5.数组
数组的定义和访问
容器:是将多个数据存储到一起,每个数据称为该容器的元素
数组的概念:数组是一种容器,用来存放多个数据值
数组的特点:
1.数组是一种引用的数据类型
2.数组当中的多个数据,类型必须统一
3.数组的长度值程序运行期间不可改变
数组的初始化:在内存当中创建一个数组,并且向其中赋予一些默认值
两种常见的初始化方式:
1.动态初始化(指定长度)
2.静态初始化(指定内容)
动态初始化的数组的格式:
数据类型[]数组名称 = new 数据类型[数组长度];
格式解析:
左侧的数据类型:也就是数组当中保存的数据,需要全部统一数据类型
左侧的中括号[]:代表是一个数组
左侧的数组名称:给数组取一个名字
右侧的new:代表创建数组的动作
右侧的数据类型:必须和左侧的数据类型保持一致
数组长度:在该数组中,可以保存多少个数据,是一个int数字
数组有定长特性,长度一旦指定,不可更改
数组拆分
数据类型 [] = 数组名;
数组名 = new 数据类型[数组长度];
静态初始化的数组格式:
静态初始化:在创建数组的时候,不直接指定数据的个数多少,而是直接将具体的数据内容进行指定
基本格式:
数据类型[] 数据名称= new 数据类型[]{元素1,元素2,元素3,......}
省略格式:
数据类型[] 数据名称 = {元素1,元素2,元素3....}
数组拆分
数据类型 [] = 数组名;
数组名 = new 数据类型[]{};
数组注意事项:
1.静态初始化没有直接指定长度,但是仍然会自动推算得到长度
2.静/动态初始化标准格式可以拆分为两个步骤
3.静态初始化一旦使用胜利格式,就不能拆分为两个步骤
数组访问
直接打印数组名称,得到的数组对应的内存地址哈希值
访问数组元素的格式:数组名称[索引值]
索引值:是一个int数字,代表数组当中元素的编号
索引值从0开始,一致到数组长度-1为止
访问格式:数组名[索引];
使用动态初始化数组的时候,其中的元素有一个默认值,规则如下:
如果是整数是类型,默认为0
如果是浮点类型,默认为0.0
如果是字符类型,默认为‘\u0000’
如果是布尔类型,默认为false
如果是引用类型,默认为null
动态初始化赋值:
数组名[索引] = 值;
静态初始化其实也有默认值的过程,只不过系统自动马上将默认值替换成了大括号当中的具体数值
数组的长度属性
每个数组都具有长度,而且是固定的,Java中赋予了数组的一个属性,可 以获取到数组的长度,语句为:数组名.length,属性length的执行结果是数组的长度,int类型结果。由次可以推断 出,数组的最大索引值为数组名.length-1
内存概述
内存是计算机中的重要原件,临时存储区域,作用是运行程序。我们编写的程序是存放在硬盘中的,在硬盘中的程序是不会运行的,必须放进内存中才能运行,运行完毕后会清空内存。Java 虚拟机要运行程序,必须要对内存进行空间的分配和管理
Java虚拟机的内存划分
为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式
Java的内存需要划分为5个部分:
1.栈(tack):存放的都是方法中的局部变量
局部变量:方法的参数。或者是方法{}中的变量
作用域:一旦超出作用域,立刻从栈内存当中消失
2.堆(Heap): 凡是new出来的东西,都在堆当中
堆内存里面的东西都有一个地址值:16进制
堆内存里面的数据,都有默认值,规则:
如果是整数是类型,默认为0
如果是浮点类型,默认为0.0
如果是字符类型,默认为‘\u0000’
如果是布尔类型,默认为false
如果是引用类型,默认为null
3.方法区(Method Area):存储.class相关信息,包含方法信息
4.本地方法栈(Mative Method Stack ):与操作系统相关
5.寄存器(pc Register): 与CPU相关
数组的内存图
数组的常见操作
数组的越界异常:
创建数组,赋值3个元素,数组的索引就是0,1,2,没有3索引,因此我们不能访问数组中不存在的索引,程序运行后,将会抛出ArrayIndexOutOfBoundsException数组越界异常。在开发 中,数组的越界异常是不能出现的,一旦出现了,就必须要修改我们编写的代码
数组空指针异常:
arr = null 这行代码,意味着变量arr将不会在保存数组的内存地址,也就不允许再操作数组了,因此运行的时候会抛出NullPointerException空指针异常。在开发中,数组的越界异常是不能出现的,一旦出现了,就必须要修改我们编写的代码,所有的引用类型变量,都可以赋值为null,代表为空,什么都没有
数组长度:
获取数组长度
格式:数组名称.length
数组一旦创建,程序运行期间,长度不可改变
数组的遍历输出:
遍历数组:就是将数组中的每个元素分别获取出来,就是遍历。遍历也是数组操作中的基石
循环的写法:数组的索引是0到lenght-1,可以作为循环的条件出现。
idea中,数组名.fori 自动补全遍历数组代码
数组小练习,取数组中最大值:
数组反转
反转:数组中的元素颠倒顺序,例如原始数组为1,2,3,4,5,反转后的数5,4,3,2,1
实现思想:数组最远端的元素互换位置。
实现反转,就需要将数组最远端元素位置交换
定义两个变量,保存数组的最小索引和最大索引
两个索引上的元素交换位置
最小索引++,最大索引--,再次交换位置
最小索引超过了最大索引,数组反转操作结束
数组作为方法参数_传递地址
数组可以作为方法的参数
数组作为方法参数传递,传递的参数是数组内存的地址
数组作为方法返回值_返回地址
一个方法可以有多个参数,但是只能有0或者一个返回值,不能有多个返回值
如果希望一个方法中产生多个数据进行返回,可以使用一个数组作为返回值类型即可,通过数组索引进行访问不同的数据
方法的参数为基本类型时,传递的数据值,方法的参数为引用类型时,传递的地址值
风月都好看,人间也浪漫.