数组:是一种容器,可以用来储存同种数据类型的多个值
注:数组容器子在存储数据的时候,需要结合隐式转换考虑,数组类型和存储的数据类型需保持一致。
初始化:就是在内存中,为数组容器开辟空间,并将数据存入容器的过程
地址值:数组的地址值就表示数组在内存中的位置
double [] arr1 ={11,12,13};
System.out.println(arr1)//运行结果为地址值[D@776ec8
//解释地址值的含义
//[:表示当前是一个数组
//D:表示当前数组里面的元素都是double类型的
//@:表示一个间隔符号(固定格式)
//776ec8:才是真正的地址值(十六进制)
//平时习惯性把整体叫做数组的地址值
数组的访问(查询,添加)
索引
:也叫做下标,角标
索引的特点:从0开始,逐个+1增长,连续不间断
//获取数据
int [] arr = {1,2,3,4};
//获取数组的第一个元素,就是获取索引为0的元素
int number = arr [0];
System.out.println(number);//1
System.out.println(arr[1]);//2
//存储数据
//格式:数据名[索引]=具体数据/变量
//细节:一旦覆盖后,原来的数据就不存在了
arr[0] = 100;
System.out.println(arr[0]);//100
数组的静态初始化
完整格式:数据类型 [] 数组名 = new 数据类型 [] {元素1,元素2,元素3.....};
简化格式: 数据类型 [] 数组名 = {元素1,元素2,元素3.....};
范例:int [] array ={11,12,13};
数组的动态初始化
动态初始化:初始化时只指定数组长度,由系统为数组分配初始值
格式:数据类型 [] 数组名 =new 数组类型[数组长度]
范例:int [] arr = new int [3]
当数组内没有内容时,数组默认初始化值的规律如下
整数类型:默认初始化值0
小数类型:默认初始化值0.0
字符类型:默认初始化值‘/u0000’(空格)
布尔类型:默认初始化值 flase
引用数据类型:默认初始化值 null
数组的静态初始化与动态初始化的区别
动态初始化:手动指定数组长度,由系统给出默认初始化值
用于:只明确元素个数,不明确具体数值,推荐使用动态初始化
静态初始化:手动指定数组元素,系统会根据元素个数,计算出数组长度
用于:需求中已经明确了要操作的具体数据,直接使用静态初始化就可
数组的遍历
数组的遍历:将数组中所有的内容取出来,取出来以后可以(打印,求和,判断.....)
注意:遍历指的是取出数据的过程,不要局限的理解为,遍历就是打印
int arr[]={1,2,3,4};
//在java当中,关于数组的一个长度属性,length
//调用方式:数组名.length
for(int i=0;i<arr.length;i++){
System.out.println(arr[i]);
}
//扩展
//idea提供的快速生成数组遍历的方式
//数组名.fori
数值的内存图
说明:数据的内存图是你进阶的关键,以下内容为个人理解,可能存在误差,望见谅。
在讲数组的内存图前,需要介绍以下java的内存图
Java的内存图
在计算机中,每一个软件就相当于在电脑中开辟出一定大小的空间,再在这个空间中去运行
而java的内存又可以分为以下几块
栈:方法运行时使用的内存,比如main方法运行,进入方法栈中执行
堆:储存对象或者数组,new来创建的,都存储在堆内存
方法区:存储可以运行的class文件
本地方法栈:JVM在使用操纵系统功能的时候使用,和我们开发无关
寄存器:给CPU使用,和我们开发无关
但是值得注意的是,在JDK8以后就取消了方法区,将方法区变成了元空间,具体可以自行了解。
在了解完Java的内存分类后来介绍数组的内存图
在之前讲了,如果只引用数组名称,得到的是数组的地址,是因为java在定义数组的时候会将其分为两个部分,分为等号左边和右边。将new的内容写在了堆内存中,并会赋予一个地址码,而int什么什么的是写在了栈内存中,再将堆内存给的地址码给到栈中
当要调用数组内的内容时,其顺序为,栈内存先获得堆内存的地址码,再用地址码去堆内存中找具体的内容
总结:1.只要是new出来的一定是在堆里面开辟了一个小空间
2.如果new了多次,那么在堆里面有多个小空间,每个小空间中都有各自的数据
而还会有另一种情况——两个数组指向同一个空间的内存图
其中两个数组会共用一个地址码
总结:当两个数组指向同一个小空间时,其中一个数组对小空间中的值发生了改变,那么其他数组再次访问的时候都是修改过后的结果了。