目录
1.数组的概述
1.1 为什么需要数组
需求分析:需要统计某公司50个员工的工资情况,例如计算平均工资、找到最高工资等。用之前知识,首先需要声明50个变量来分别记录每位员工的工资,这样会很麻烦。因此我们可以将所有的数据全部存储到一个容器中统一管理,并使用容器进行计算。
容器的概念:
- 生活中的容器:水杯(装水等液体),衣柜(装衣服等物品),集装箱(装货物等)。
- 程序中的容器:将多个数据存储到一起,每个数据称为该容器的元素。
1.2 数组的概念
数组(Array):是多个相同类型数据按一定顺序排列的集合,并使用一个名字命名,并通过编号的方式对这些数据进行统一管理。
数组中的概念:
- 数组名
- 下标(或索引)
- 元素
- 数组的长度
数组的特点:
- 数组本身是引用数据类型,而数组中的元素可以是任何数据类型,包括基本数据类型和引用数据类型。
- 创建数组对象会在内存中开辟一整块连续的空间。占据的空间的大小,取决于数组的长度和数组中元素的类型。
- 数组中的元素在内存中是依次紧密排列的,有序的。
- 数组,一旦初始化完成,其长度就是确定的。数组的长度一旦确定,就不能修改。
- 我们可以直接通过下标(或索引)的方式调用指定位置的元素,速度很快。
- 数组名中引用的是这块连续空间的首地址。
1.3 数组的分类
1、按照元素类型分:
- 基本数据类型元素的数组:每个元素位置存储基本数据类型的值
- 引用数据类型元素的数组:每个元素位置存储对象(本质是存储对象的首地址)
2、按照维度分:
- 一维数组:存储一组数据
- 二维数组:存储多组数据,相当于二维表,一行代表一组数据,只是这里的二维表每一行长度不要求一样。
2.一维数组的使用
2.1 一维数组的声明
格式:
//推荐
元素的数据类型[] 一维数组的名称;
举例:
int[] arr;
int arr1[];
double[] arr2;
String[] arr3; //引用类型变量数组
数组的声明,需要明确:
(1)数组的维度:在Java中数组的符号是[],[]表示一维,[][]表示二维。
(2)数组的元素类型:即创建的数组容器可以存储什么数据类型的数据。元素的类型可以是任意的Java的数据类型。例如:int、String、Student等。
(3)数组名:就是代表某个数组的标识符,数组名其实也是变量名,按照变量的命名规范来命名。数组名是个引用数据类型的变量,因为它代表一组数据。
注意:Java语言中声明数组时不能指定其长度(数组中元素的个数)。 例如: int a[5]; //非法
2.2 一维数组的初始化
1.静态初始化
- 如果数组变量的初始化和数组元素的赋值操作同时进行,那就称为静态初始化。
- 静态初始化,本质是用静态数据(编译时已知)为数组初始化。此时数组的长度由静态数据的个数决定。
- 一维数组声明和静态初始化格式1:
- [] 数组名 = new 数据类型[]{
元素1,元素2,元素3,...};
或
数据类型[] 数组名;
数组名 = new 数据类型[]{ 元素1,元素2,元素3,...}; - new:关键字,创建数组使用的关键字。因为数组本身是引用数据类型,所以要用new创建数组实体。
例如:定义存储1,2,3,4,5整数的数组容器。
int[] arr = new int[]{1,2,3,4,5};//正确
//或
int[] arr;
arr = new int[]{1,2,3,4,5};//正确
- 一维数组声明和静态初始化格式2:
- 数据类型[] 数组名 = { 元素1,元素2,元素3...};//必须在一个语句中完成,不能分成两个语句写
例如:定义存储1,2,3,4,5整数的数组容器。
int[] arr = {1,2,3,4,5};//正确
int[] arr;
arr = {1,2,3,4,5};//错误
2.动态初始化
数组变量的初始化和数组元素的赋值操作分开进行,即为动态初始化。
动态初始化中,只确定了元素的个数(即数组的长度),而元素值此时只是默认值,还并未真正赋自己期望的值。真正期望的数据需要后续单独一个一个赋值。
格式:
数组存储的元素的数据类型[] 数组名字 = new 数组存储的元素的数据类型[长度];
或
数组存储的数据类型[] 数组名字;
数组名字 = new 数组存储的数据类型[长度];
[长度]:数组的长度,表示数组容器中可以最多存储多少个元素。
注意:数组有定长特性,长度一旦指定,不可更改。和水杯道理相同,买了一个2升的水杯,总容量就是2升是固定的。
举例1:正确写法
int[] arr = new int[5];
int[] arr;
arr = new int[5];
举例2:错误写法
int[] arr = new int[5]{ 1,2,3,4,5};//错误的,后面有{}指定元素列表,就不需要在[]中指定元素个数了。
2.3 一维数组的使用
1.数组的长度
数组的元素总个数,即数组的长度
每个数组都有一个属性length指明它的长度,例如:arr.length 指明数组arr的长度(即元素个数)
每个数组都具有长度,而且一旦初始化,其长度就是确定,且是不可变的。
2.数组元素的引用
如何表示数组中的一个元素?
每一个存储到数组的元素,都会自动的拥有一个编号,从0开始,这个自动编号称为数组索引(index)或下标,可以通过数组的索引/下标访问到数组中的元素。
数组名[索引/下标]
数组的下标范围?
Java中数组的下标从[0]开始,下标范围是[0, 数组的长度-1],即[0, 数组名.length-1]
数组元素下标可以是整型常量或整型表达式。如a[3] , b[i] , c[6*i];
2.4 一维数组的遍历
将数组中的每个元素分别获取出来,就是遍历。for循环与数组的遍历是绝配。
public static void main(String[] args) {
int[] arr = new int[]{1,2,3,4,5};
//打印数组的属性,输出结果是5
System.out.println("数组的长度:" + arr.length);
//遍历输出数组中的元素
System.out.println("数组的元素有:");
for(int i=0; i<arr.length; i++){
System.out.println(arr[i]);
}
}
2.5 数组元素的默认值
数组是引用类型,当我们使用动态初始化方式创建数组时,元素值只是默认值。
例如:
public static void main(String argv[]){
int a[]= new int[5];
System.out.println(a[3]); //a[3]的默认值为0
}
对于基本数据类型而言,默认初始化值各有不同。
对于引用数据类型而言,默认初始化值为null(注意与0不同!)
3.一维数组内存分析
3.1 Java虚拟机的内存划分
为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。