数组(基础知识整理)

什么是数组

数组是一种容器,可以用来存储同种数据类型的多个值

数组容器在存储数据的时候,需要结合隐式转换考虑

例如:int类型的数组容器(boolean double不可以存入,byte、short、int可以)

例如:double类型的数组容器(boolean、char不可以,byte、short、int、long、float、double都可以)

建议:容器的类型,和存储的数据类型保持一致

数组的定义

格式一:

数据类型[] 数组名

范例:int[] array

格式二:

数据类型 数组名[]

范例: int array[]

详解:

数据类型:限定了数组以后能存什么类型的数据。

方括号:表示现在定义的是一个数组。

数组名:就是一个名字,方便以后使用。

注意点:

方法括号跟数组名,谁写在前面,谁写在后面都是一样的。

平时习惯性使用第一种方式。

数组的初始化

初始化:就是在内存中,为数组容器开辟空间,并将数据存入容器中的过程

数组的静态初始化

完整格式 :

数据类型[] 数组名 = new 数据类型[]{元素1,元素2,元素3,元素4...};

比如:

int[] arr = new int[]{11,22,33};

double[] arr = new double[]{1.1,1.2,1.3};

格式详解:

数据类型:限定了数组以后能存什么类型的数据。

方括号:表示现在定义的是一个数组。

数组名:其实就是名字而已,方便以后使用,在起名字的时候遵循小驼峰命名法。

new:就是给数组在内存中开辟了一个空间。

数据类型:限定了数组以后能存什么类型的数据,前面和后面的数据类型一定要保持一致。

方括号:表示现在定义的是一个数组。

大括号:表示数组里面的元素,元素也就是存入到数组中的数据,多个元素之间,一定要用逗号隔开。

注意点:

等号前后的数据类型必须保持一致。

数组一旦创建之后,长度不能发生变化。

简化格式:

数据类型[] 数组名 = {元素1,元素2,元素3,元素4...};

比如:

int[] array = {1,2,3,4,5};

double[] array = {1.1,1.2,1.3};

地址值

定义一个数组就是在内存中开辟了一个空间,数组的地址值表示数组在内存中的位置

int[] arr = {1,2,3,4,5};
System.out.println(arr);//[I@6d03e736
​
double[] arr2 = {1.1,2.2,3.3};
System.out.println(arr2);//[D@568db2f2

打印数组的时候,实际出现的是数组的地址值

以[I@6d03e736为例:

[ :表示现在打印的是一个数组。

I:表示现在打印的数组是int类型的。

@:仅仅是一个间隔符号而已。

6d03e736:就是数组在内存中真正的地址值(十六进制的)

但是,我们习惯性会把[I@6d03e736这个整体称之为数组的地址值。

数组元素访问

格式:数组名[索引];

作用:

获取数组中对应索引上的值

修改数组中对应索引上的值,一旦修改之后,原来的值就会被覆盖了

索引

索引也叫角标、下标,就是数组容器中每一个小格子对应的编号。

索引的特点:

索引一定是从0开始的,逐个+1增长,连续不间断

数组遍历

数组遍历:将数组中所有的内容取出来,取出来之后可以打印、求和、判断...

注意:遍历指的是取出数据的过程,不要局限的理解为遍历就是打印

数组的长度:数组名.length;

idea提供的自动快速生成数组的遍历方式:数组名.fori

数组的动态初始化

动态初始化:初始化时只指定数组长度,由系统为数组分配初始值

格式:数据类型[] 数组名 = new 数据类型[数组的长度];

举例:

//1.定义一个数组,存3个人的年龄,年龄未知
int[] agesArr = new int[3];
​
​
//2.定义一个数组,存班级10名学生的考试成绩,考试成绩暂时未知,考完才知道。
int[] scoresArr = new int[10];

数组的默认初始化值:

整数类型:0

小数类型:0.0

布尔类型:false

字符类型:'\u0000' 空格

引用类型:null

数组两种初始化方式的区别

静态初始化:int[] arr = {1,2,3,4,5};

动态初始化:int[] arr = new int[3];

静态初始化:手动指定数组的元素,系统会根据元素的个数,计算出数组的长度。

动态初始化:手动指定数组长度,由系统给出默认初始化值。

使用场景:

只明确元素个数,但是不明确具体的数据,推荐使用动态初始化。

已经明确了要操作的所有数据,推荐使用静态初始化。

举例:

  • 使用数组来存储键盘录入的5个整数。

    int[] arr = new int[5];

  • 将全班的学生成绩存入数组中,已知学生成绩为:66,77,88,99,100

    int[] arr = new int[5];

    arr[0] = 66;

    arr[1] = 77;

    虽然可以实现,但是太麻烦了。

    建议使用静态初始化:int[] arr = {66,77,88,99,100};

数组常见问题

当访问了数组中不存在的索引,就会引发索引越界异常。

避免:

针对于任意一个数组,索引的范围:

最小索引:0

最大索引:数组的长度 - 1,数组名.length - 1

public class ArrDemo6 {
    public static void main(String[] args) {
       int[] arr = {1,2,3,4,5,5,5,5,5};
        //用索引来访问数组中的元素
        System.out.println(arr[1]);                    System.out.println(arr[10]);
        //ArrayIndexOutOfBoundsException
    }
}

Java内存分配

在JDK7以前,方法区和堆空间是连在一起的,在真实的物理内存中,也是一块连续的空间。从JDK8开始,取消了方法区,新增元空间,把原来方法区的多种功能进行拆分,有的功能放到了堆中,有的功能放到了元空间中。

内存空间各自的作用:

栈内存:程序的主入口(main方法),开始执行时会进栈,代码执行完毕会出栈

堆内存:new出来的东西会在这块内存中开辟空间并产生地址

一个数组的内存图:

两个数组的内存图:

总结:

  1. 只要是new出来的一定是在堆里面开辟了一个小空间

  2. 如果new了多次,那么在堆里面有多个小空间,每个小空间中都有各自的数据

两个数组指向同一个空间的内存图:

总结:

当两个数组指向同一个小空间时,其中一个数组对小空间中的值发生了改变,那么其他数组再次访问的时候都是修改之后的结果了

  • 9
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值