文章目录
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开始的,依次递增,该编号称为数组的下标,数组可以通过下标访问其任意位置的元素。
【注意事项:】
- 数组是一段连续的内存空间,因此支持随机访问,即通过下标访问快速访问数组中任意位置的元素
- 下标从0开始,介于[0, N)之间不包含N,N为元素个数,不能越界,否则会报出下标越界异常。
1.3.2 遍历数组
使用 for-each 遍历数组
2. 数组是引用类型
2.1 初识JVM的内存分布
JVM是Java虚拟机,所有的程序都会运行在JVM上面,JVM上会对内存进行划分。
-
为什么要划分内存?
可以对内存进行更好的管理。 -
划分了哪些内存?
-
为什么会有两个栈?
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