Java语言基础 #基础语法 #Day5 #数组 #引用 #指针

文章目录

  • 一、数组的含义
  • 二、数组的定义
    • 1. 动态初始化
    • 2. 静态初始化
  • 三、数组的使用
    • 1. 使用索引取静态初始化的数组
    • 2. 使用索引取动态初始化的数组
    • 3. 给数组赋值
  • 四、java虚拟机中的内存
    • 1. java虚拟机中的内存划分
    • 2. 当我操作数组时,我到底在操作什么
    • 3. 引用的概念
    • 4. 空指针异常
  • 五、数组常用操作
    • 1. 获取数组长度
    • 2. 遍历
      • Demo:求出数组最大值
      • Demo:反转一个数组
    • 3. 数组作为参数
    • 4. 数组作为返回值

一、数组的含义

数组: 是一种容器,可以同时存放多个数据值
特点

  1. 引用数据类型
  2. 数组中的数据,类型必须统一
  3. 数组的长度在程序运行期间不可改变

可以这样想,数组就是一个冰箱(冰箱不属于四类八种,所以是引用数据类型),里面只能放食物(类型统一),容积一定(长度不可变)

二、数组的定义

数组有两种常见的初始化方法:

  1. 动态初始化(指定长度)
  2. 静态初始化(指定内容)

1. 动态初始化

数据类型[] 数组名称 = new 数据类型[数组长度];
  1. 数据类型(左),指定保存的数据的类型
  2. [],代表是一个数组(区别于,定义变量之类)
  3. new 代表创建数组的动作
  4. 数据类型(右),要和左边保持一致
  5. 数组长度是int数字

2. 静态初始化

  • 基本格式:
数据类型[] 数组名称 = new 数据类型[]{元素1, 元素2, ...};
  • 省略格式:
数据类型[] 数组名称 = {元素1, 元素2, ...};

注意: 静态初始化没有指定长度,但仍有长度
动态初始化(基本)和静态初始化,可以拆分成两个步骤:定义&赋值。

三、数组的使用

  • 直接打印数组: (得到内存地址的哈希值)
    Java语言基础 #基础语法 #Day5 #数组 #引用 #指针_第1张图片
    哈希函数是一种加密方法,你可以简单理解为,一些数据进去,另一些数据出来
  • 使用数组元素:
    使用数组用到的是索引
    现在一家房地产开发商,叫了20个中老年人去排队,给每个人一个号牌。第一个人的号牌是0,第二个人是1,以此类推。执行中老年人后来可以凭借这些号牌领钱。7号是“张三”,所以当叫“7号”时,张三就会过去领钱。张三就是数据,号牌就是索引。
    所以,我们可以知道索引是从0开始的。

1. 使用索引取静态初始化的数组

array1[0];  // 取出数组0号元素

Java语言基础 #基础语法 #Day5 #数组 #引用 #指针_第2张图片

2. 使用索引取动态初始化的数组

Java语言基础 #基础语法 #Day5 #数组 #引用 #指针_第3张图片
可以发现,是空值

  • 使用动态初始化数组,会有一个默认值:
    如果是整数,默认为0
    如果是浮点,默认为0.0
    如果是字符,默认为 '\u0000’
    如果是布尔,默认为false
    如果是引用,默认为null

静态初始化也有默认值的过程,只不过系统自动给其赋值大括号内的元素。

3. 给数组赋值

array[0] =;  // 给数组的这个索引赋值

Java语言基础 #基础语法 #Day5 #数组 #引用 #指针_第4张图片

四、java虚拟机中的内存

1. java虚拟机中的内存划分

Java中内存划分为5个部分:

  1. 栈内存(Stack):存放方法中的局部变量(方法的参数或方法内部的变量),这些变量一旦超出作用域,立即从栈内存中消失。
  2. 堆内存(Heap):凡是new过的,都在堆中。
    堆内存里的东西,都有一个地址值(16进制)
    堆内存里的数据,都有默认值。规则,如三、2.里面所示
  3. 方法区(Methon Area):存储.class相关信息,包含方法的信息(死信息,真正方法的运行在栈内存中)。

  1. 本地方法栈(Native Methon Stack):与操作系统相关。
  2. 寄存器(pc Register):与CPU相关。

以上所有,特别是四和五,可以看看《程序是怎样跑起来的》这本入门读物(两天可以读完),应该在第一章。这部分内容,我之后也会尝试写成段子供大家阅读。

2. 当我操作数组时,我到底在操作什么

下面我们来看一下,这一段代码发生了什么
Java语言基础 #基础语法 #Day5 #数组 #引用 #指针_第5张图片

  • 这个内存是我随便画的,仅仅作为示例Java语言基础 #基础语法 #Day5 #数组 #引用 #指针_第6张图片
  1. 方法区载入main()方法。在运行时,把方法信息加载到栈中(进栈),为栈方法开辟一个内存空间。
    Java语言基础 #基础语法 #Day5 #数组 #引用 #指针_第7张图片
  2. 数组名就是一个局部变量,进栈。new方法在堆中开辟一个内存空间。
    Java语言基础 #基础语法 #Day5 #数组 #引用 #指针_第8张图片
  3. 数组有一个自己的地址值。 栈中把这个地址值存储下来。有了地址,就可以找到这个数组的位置。所以数组变量并不是等于这个真正的数组,而是建立了对其的引用。所以数组是引用类型。
    Java语言基础 #基础语法 #Day5 #数组 #引用 #指针_第9张图片
  4. 打印数组
    Java语言基础 #基础语法 #Day5 #数组 #引用 #指针_第10张图片
  5. 打印元素
    Java语言基础 #基础语法 #Day5 #数组 #引用 #指针_第11张图片
  6. 给元素赋值
    Java语言基础 #基础语法 #Day5 #数组 #引用 #指针_第12张图片

3. 引用的概念

有这样一个数组,叫arrayA,从上面我们知道,arrayA里面存放着一个地址值。如果我们再创建一个数组:

int[] arrayB = arrayA

其实只是arrayA的地址值赋给了arrayB。两个数组的地址值,指向同一个数组。这个arrayA和arrayB,都是对这个数组的引用。所以叫引用类型。指向堆的这个,叫做指针。


引用: 总而言之,一个变量存的不是数据本身,而是数据所在位置,就叫引用。这个指向叫做指针。

// 非引用
int a = 1;  // 这是一个非引用,这种赋值叫 “复制”
int b = a;  // 这句话的意思是,把a的值复制一份,给b
// 这两句代码执行后,真正的“数据值 1”,会有两个

// 引用
int[] arrayA = {1, 2};  // 数组是存在堆中的,arrayA只是拥有这个地址
int[] arrayB = arrayA;  // arrayB复制了arrayA所记录的地址
// 这两句代码执行后,真正的“数组” ,只会有一个

4. 空指针异常

定义数组,不创建(赋予地址值)是不行的。

int[] array = null;  // 所有引用类型,都可以赋值为nall
System.out.println(array[0])  // 报错:空指针异常

五、数组常用操作

1. 获取数组长度

数组名.length;  // 返回一个int

Java语言基础 #基础语法 #Day5 #数组 #引用 #指针_第13张图片

2. 遍历

什么叫遍历呢,古有云“遍历人间春色”
遍历 就是把数组内的所有元素,挨个按同样方法操作一遍。最常见的操作是打印。

  • 我们使用for循环遍历一下:
for (int i = 0; i < array.length; i++){
	System.out.println(array[i])
}

快捷键是数组名称.fori加上回车
Java语言基础 #基础语法 #Day5 #数组 #引用 #指针_第14张图片

Demo:求出数组最大值

Java语言基础 #基础语法 #Day5 #数组 #引用 #指针_第15张图片

Demo:反转一个数组

  • 方法1 ,创建一个新数组做中间数组。(这种方法比较占空间)
    Java语言基础 #基础语法 #Day5 #数组 #引用 #指针_第16张图片
  • 方法2 ,创建一个变量,做中间变量
    Java语言基础 #基础语法 #Day5 #数组 #引用 #指针_第17张图片

3. 数组作为参数

  • 数组可以作为参数传递。传递的是地址值

Java语言基础 #基础语法 #Day5 #数组 #引用 #指针_第18张图片

4. 数组作为返回值

数组作为返回值,返回的也是地址值。
Java语言基础 #基础语法 #Day5 #数组 #引用 #指针_第19张图片

  • 一切皆可作为方法的参数返回值 (包括明天要讲的对象)。当使用的是基本数据类型,传递值;当使用的是引用数据类型,传递地址。

你可能感兴趣的:(java)