【Java】--数组的定义与使用

1. 数组的基本概念


1.1 什么是数组

数组:可以看成是相同类型元素的一个集合。在内存中是一段连续的空间每个空间有自己的编号,起始位置的编号为0,即数组的下标。

1.2 数组的创建及初始化


1.2.1 数组的创建

T[] 数组名 = new T[N];

T:表示数组中存放元素的类型
T[]:表示数组的类型
N:表示数组的长度

int[] array1 = new int[10]; // 创建一个可以容纳10个int类型元素的数组
double[] array2 = new double[5]; // 创建一个可以容纳5个double类型元素的数组
String[] array3 = new double[3]; // 创建一个可以容纳3个字符串元素的数组

array中存放的是数组的地址。

array这个变量叫做引用变量,简称引用。之所以叫引用变量,是因为它其中存放的是地址。

1.2.2 数组的初始化

数组的初始化主要分为动态初始化以及静态初始化。
1. 动态初始化:在创建数组时,直接指定数组中元素的个数

int[] array = new int[10];

2. 静态初始化:在创建数组时不直接指定数据元素个数,而直接将具体的数据内容进行指定

T[] 数组名称 = {
   data1, data2, data3, ..., datan};
int[] array1 = new int[]{
   0,1,2,3,4,5,6,7,8,9};
double[] array2 = new double[]{
   1.0, 2.0, 3.0, 4.0, 5.0};
String[] array3 = new String[]{
   "hell", "Java", "!!!"};

【注意事项】:

  • 静态初始化虽然没有指定数组的长度,编译器在编译时会根据{}中元素个数来确定数组的长度。
  • 静态初始化时, {}中数据类型必须与[]前数据类型一致。
  • 静态初始化可以简写,省去后面的new T[]。
// 注意:虽然省去了new T[], 但是编译器编译代码时还是会还原
int[] array1 = {
   0,1,2,3,4,5,6,7,8,9};
double[] array2 = {
   1.0, 2.0, 3.0, 4.0, 5.0};
String[] array3 = {
   "hell", "Java", "!!!"};
  • 如果没有对数组进行初始化,数组中元素有其默认值
    • 如果数组中存储元素类型为基类类型,默认值为基类类型对应的默认值,比如:
      在这里插入图片描述
    • 如果数组中存储元素类型为引用类型,默认值为null

1.3 数组的使用


1.3.1 数组中元素访问

数组在内存中是一段连续的空间,空间的编号都是从0开始的,依次递增,该编号称为数组的下标,数组可以通过下标访问其任意位置的元素。

【注意事项:】

  1. 数组是一段连续的内存空间,因此支持随机访问,即通过下标访问快速访问数组中任意位置的元素
  2. 下标从0开始,介于[0, N)之间不包含N,N为元素个数,不能越界,否则会报出下标越界异常。

1.3.2 遍历数组

使用 for-each 遍历数组
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

2. 数组是引用类型


2.1 初识JVM的内存分布

JVM是Java虚拟机,所有的程序都会运行在JVM上面,JVM上会对内存进行划分。

  1. 为什么要划分内存?
    可以对内存进行更好的管理。

  2. 划分了哪些内存?
    在这里插入图片描述

  3. 为什么会有两个栈?
    JVM本身是由C和C++代码实现的一个软件,在JVM底层中势必会有一些C和C++代码实现的一些方法。
    本地方法栈: 会执行一些底层是由C/C++代码实现的方法。
    Java虚拟机栈:平时嘴里说的哪个“栈”

Java中,在栈上的这块内存,是不支持获取其地址的,这也体现出了Java的安全性。
在这里插入图片描述

2.2 基本类型变量与引用类型变量的区别

基本数据类型创建的变量,称为基本变量,该变量空间中直接存放的是其所对应的值;
而引用数据类型创建的变量,一般称为对象的引用,其空间中存储的是对象所在空间的地址。
在这里插入图片描述
在这里插入图片描述

在方法中定义的变量,都是局部变量。array和 a 都是一个局部变量,array既是一个局部变量,又是一个引用变量,这并不冲突。

所有的局部变量都是存储在栈中的。

数组其实是一个对象,数组也是通过 new 关键字实例化出来的一个对象,所有的对象都是在堆中开辟一块内存,同样也会给array数组对象在堆中开辟一块内存,就用来存放这个数组对象的元素,此时这个对象一定是有地址的,在栈中的那块内存就是存放的这个对象的地址,array是一个引用,它就会通过这个地址,指向这个对象。

引用怎么去和对象关联起来呢?
引用去指向对象。(array这个引用指向了一个数组对象)

同样的,局部变量 a 也会在栈中开辟一块内存。但是,变量a只是一个普通的局部变量,它不是引用变量;所以,在栈这块内存中存放的就是a的值10,它不会再在堆里开辟一块内存给局部变量a.

array[0]=9;通过array这个引l用访问当前的这个对象的0下标。
array.length通过array这个引l用访问当前的这个对象的长度。

2.3 再谈引用变量

public static void func() {
   
    int[] array1 = new int[3];
    array1[0] = 10;
    array1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

四点雨点点

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值