目录
容器
是将多个数据存储到一起,每个数据称为该容器的元素。
数组
数组就是存储数据长度固定的容器,保证多个数据的数据类型要一致,可以同时存放多个数据。
特点
1. 数组是一种引用数据类型。
2. 数组当中的多个数据,类型必须统一。
3. 数组的长度在程序运行期间不可改变。
数组的定义及初始化
方式1:
数组存储的数据类型[] 数组名字 = new 数组存储的数据类型[长度];
int[] arr = new int[3];
方式2:
数据类型[] 数组名 = new 数据类型[]{元素1,元素2,元素3...};
int[] arr = new int[]{1,2,3,4,5};
方式3:
数据类型[] 数组名 = {元素1,元素2,元素3...};
int[] arr = {1,2,3,4,5};
解释
左侧数据类型:也就是数组当中保存的数据,全都是统一的什么类型
左侧的中括号:代表我是一个数组
左侧数组名称:给数组取一个名字
右侧的new:代表创建数组的动作
右侧数据类型:必须和左边的数据类型保持一致
右侧中括号的长度:也就是数组当中,到底可以保存多少个数据,是一个int数字
动态初始化(指定长度):在创建数组的时候,直接指定数组当中的数据元素个数。
静态初始化(指定内容):在创建数组的时候,不直接指定数据个数多少,而是直接将具体的数据内容进行指定。
虽然静态初始化没有直接告诉长度,但是根据大括号里面的元素具体内容,也可以自动推算出来长度。使用建议:如果不确定数组当中的具体内容,用动态初始化;否则,已经确定了具体的内容,用静态初始化。
方式1为动态初始化,方式2,3 为静态初始化。
使用动态初始化数组的时候,其中的元素将会自动拥有一个默认值。规则如下:
如果是整数类型,那么默认为0;
如果是浮点类型,那么默认为0.0;
如果是字符类型,那么默认为'\u0000';
如果是布尔类型,那么默认为false;
如果是引用类型,那么默认为null。
注意事项:
静态初始化其实也有默认值的过程,只不过系统自动马上将默认值替换成为了大括号当中的具体数值。
数组的访问
索引: 每一个存储到数组的元素,都会自动的拥有一个编号,从0开始,这个自动编号称为数组索引(index),可以通过数组的索引访问到数组中的元素。数组名[索引]
数组的长度属性: 每个数组都具有长度,而且是固定的,Java中赋予了数组一个属性,可以获取到数组的长度,语句为: 数组名.length ,属性length的执行结果是数组的长度,int类型结果。由次可以推断出,数组的最大索引值为 数组名.length-1 。
数组名[索引]=数值,为数组中的元素赋值。
变量=数组名[索引],获取出数组中的元素。
一个demo介绍数组用法: (数组反转)
public static void main(String[] args) {
int[] array = { 10, 20, 30, 40, 50 };
// 遍历打印数组本来的样子
for (int i = 0; i < array.length; i++) {
System.out.println(array[i]);
}
System.out.println("============");
/*
初始化语句:int min = 0, max = array.length - 1
条件判断:min < max
步进表达式:min++, max--
循环体:用第三个变量倒手
*/
for (int min = 0, max = array.length - 1; min < max; min++, max--) {
int temp = array[min];
array[min] = array[max];
array[max] = temp;
}
// 再次打印遍历输出数组后来的样子
for (int i = 0; i < array.length; i++) {
System.out.println(array[i]);
}
}
数组原理内存图
JVM的内存划分
区域名称 | 作用 |
寄存器(pc Register) | 给CPU使用,和我们开发无关。 |
本地方法栈 (Native Method Stack) | JVM在使用操作系统功能的时候使用,和我们开发无关。 |
方法区 ( Method Area) | 存储可以运行的class文件。 |
堆内存 (Heap) | 存储对象或者数组,new来创建的,都存储在堆内存。 |
方法栈 (Stack) | 方法运行时使用的内存,比如main方法运行,进入方法栈中执行。 局部变量的作用域:一旦超出作用域,就会立刻从栈内存中消失。 |
数组在内存中的存储
public static void main(String[] args) {
int[] arr = new int[3];
System.out.println(arr);//[I@5f150435
}
以上方法执行,输出的结果是[I@5f150435 ,是数组在内存中的地址。new出来的内容,都是在堆内存中存储的,而方法中的变量arr保存的是数组的地址。
一个数组的内存图
两个数组的内存图
public static void main(String[] args) {
int[] arr = new int[3];
int[] arr2 = new int[2];
System.out.println(arr);
System.out.println(arr2);
}
使用数组应注意的问题
数组越界异常ArrayIndexOutOfBoundsException ,使用数组时,索引超过了数组的长度
数组空指针异常NullPointerException ,数组没有初始化。
数组作为方法参数和返回值
数组作为方法参数传递,传递的参数是数组内存的地址。
数组作为方法的返回值,返回的是数组的内存地址
方法的参数为基本类型时,传递的是数据值. 方法的参数为引用类型时,传递的是地址值