第数组定义和访问
1.容器的概念
容器就是将多个数据存储到一起,每个数据称为容器的元素
数组概念
数组:存储数据,长度固定的容器,保证每个数据的数据类型一致
2.数组定义三种定义方式:
第一种方式:
数组存储数据类型[] 数组名=new 数组存储的数据类型[长度(正整数)];
解析:
数组存储的数据类型:决定了数组容器能够存储什么样数据类型的数据
[]:表示数组。
数组名称:给数组定义一个变量名,全小写
new:是一个关键字,创建数组使用的关键字
数组存储的数据类型:决定了数组容器能够存储什么样数据类型的数据
[长度]:代表数组长度大小,表示数组能存储多少个元素。
备注:数组一旦创建,长度不变。(定长特性)
第二种方式:
数组数据类型[] 数组名=new 数组的数据类型[]{元素1,元素2,…,元素n};
注意:第二种方式不能跟上长度。不然会报错
第三种方式:
数组的数据类型[] 数组名={元素1,元素2,元素3.。。};
数组特点
1.数组长度运行期不可变,编译期可变
2.数组本身就是一种引用数据类型( int[] )
3.数组定义的时候是引用数据类型( int[] ),元素数据类型可变,
4.数组内元素可以是数组
5.数组中的数据,数据类型必须一致。
数组初始化:在内存中常见一个数组并且存入了一些默认值
数组数据类型[] 数组名称; //数组定义
数组名称=new 数组数据类型[长度]; //初始化
默认值:int整数类型,默认值为0,
浮点数类型,默认值0.0
对于字符类型(char),默认值为’\u0000’。显示出来是一个空格
字符串,默认值为:null
布尔类,默认值:false
两种常见初始化:静态动态不能同时存在
1.静态初始化:创建数组的时候不指定长度,直接写内容
2.动态初始化:创建数组的时候指定长度不指定内容
备注:
静态虽然没有直接指定长度,但是程序会自己推算长度
建议:
如果不确定数组中存储的内容,用动态
内容已经确定就是用静态
大多数情况建议直接使用动态初始化
数组的访问
索引:下标(记住index)
每一个存储到数组中的元素,都会自动的分配一个编号,编号从0开始,这个系 统自动分配的编号称为系统的索引(index),我们可以通过数组索引访问数组 中的元素。最大索引值:数组长度-1------->数组名.length-1
格式:
数组名称[索引];
获取数组长度:
数组构建完成就自动拥有固定的长度,java会自动给数组一个属性,获取数组 长度,属性length代表数组长度,是一个int属性
数组名称.length
索引访问数组中元素操作:
修改数组中对应未知的值:数组名[索引]=数值;
从数组中取出值,赋值给变量:变量=数组名[索引]
输出数组名称会得到什么:得到:[I@15db9742 数组对应的内存地址哈希值
System.out.println(arr);
数组原理内存图解
内存:
计算机中重要元件,临时存储区域,程序允许过程中,我们写的代码存放在硬 盘当中不会直接运行,要放在内存当中才会运行(通过javac和java来完成), 程序运行完毕后,会清空内存。
jvm中的内存划分:
提高运行效率,会对内存空间进行不同区域的划分,每一片区域,都有特定的 处理数据方式和内存管理方式。
jvm内存划分:(记住stack和heap)
区域名称 作用
寄存器 给CPU使用,和开发无关
本地方法栈 JVM虚拟机使用系统功能时使用的,和开发无关
方法区 用来存储可以运行的.class文件
方法栈(stack) 方法运行时使用的内存。比如main方法运行就进入方法栈才能运行
堆内存(heap) 用于存储对象,数组,new出来的对象都在堆内存中
数组在内存当中的存储:
public static void mian(String[] args){
int[] arr=new int[];
System.out.println(arr); //打印出来一个内存地址哈希值
}
image-20201112160113497
流程控制:
0.class文件通过java.exe,
1.mn方法进入方法栈中执行,
2.创建数组,JVM在堆内存中开辟空间,存储数组
3.数组在内存中会有自己的内存地址,以16进制表示
4.数组三元素默认值为0
5.JVM数组的内存地址赋值给数组名arr,
6.变量arr保存的是地址而不是值
两个数组分别内存:就是不同的内存对象
两个变量指向同一个数组:
public ststic void main(String[] args){
//定义一个数组,动态初始化
int[] arr=new int[3];
//通过数组访问数组中的元素
arr[0]=10;
arr[1]=20;
arr[2]=30;
//查看数组中的第二个元素
System.out.println(arr[1]);
//定义一个数组,将上一个数组赋值给该数组
int[] arr2=arr;
arr2[1]=20;
//查看arr2数组中的第二个元素。
System.out.println(arr2[1]);
}
原理图解:
image-20201112164444903
数组常见异常操作
1.数组越界:
public static void mian(String[] args){
//动态穿件一个数组
int[] arr=new int[5];
//查看数组第五个数据,错误写法
System.out.println(arr[5]);
}
数组最大索引为:数组名.length-1 ,超出就会出现越界异常
2.数组空指针:
public static void main(String[] args){
//动态初始化一个数组
int[] arr=new int[3];
arr=null;
//查看arr数组第三个元素
System.out.println(arr[2]);
}
空指针异常:在程序运行过程中一个不存在的变量被引用
数组遍历(查看数组中所有元素)核心重点
解释:将数组中每一个元素单个分别获取出来,
直接输出方式遍历数组
public static void main(String[] args){
//静态初始化数组
int[] arr={1,2,3,4};
//循环遍历数组中元素查看
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
System.out.println(arr[3]);
}
数组的索引是从0开始,依次递增到arr.length-1停止,引入循环结构
用for循环遍历数组:
public static void main(String[] args){
//静态初始化一个数组
int[] arr={1,2,3,4};
//数组遍历
for(int i=0;i<arr.length;i++){
System.out.println(arr[i]);
}
}
遍历过程中如何获取最值:
最大值:就是比较所有值,取出最大的那个值
思路:先定义一个最大值变量(arr[0]),遍历数组循环比较,每次保留最大的那一 个
public static void main(String[] main){
//写一个数组
int[] arr={12,85,13,75,46,486,96,-185};
//遍历数组比较
int max=arr[0];
for(int i=0;i<arr.length;i++){
if(max<arr[i]){
max=arr[i];
}
}
System.out.println("最大值为:"+max);
}