数组的基础知识
要点提示:一旦数组被创建,它的大小是固定的。使用一个數组引用变量,通过下标来访 问數组中的元素。
数组是用来存储数据的集合,但是,通常我们会发现把数组看作一个存储具有相同类型的变量集合会更有用。无须声明单个变量,例如:number0, number1, …,number99, 只要 声明一个数组变量 numbers,并且用 numbers[0], numbers[1],…, numbers[99]来表示单个变量。本节介绍如何声明数组变量、创建数组以及使用下标变量处理数组
1. 数组的定义
1.数组主要解决多变量多数据的存储问题,方便程序后期统一维护操作数据
2.数组的本质是什么呢?数组就是一片地址连续且空间大小一致的存储空间(但是每个空间存的还是其他数据的地址)
3.为什么空间大小是相等的呢?就是为了方便统一维护我们的数据,必须得保证数据之间的类型是一样的。(多个同类型的变量空间连在一起组成的结构叫数组)
4.为什么变量空间的地址是连续的呢?就是为了方便统一操作我们的数据。(见数组内存图)
5..数组存在于堆内存中,但凡在堆中存储的数据都称之为对象
但凡在堆内存中创建的对象都会有默认初始值
整数类型默认0
浮点类型默认0.0
布尔类型默认false
引用数据类型(对象)默认null
6.数组提供角标来访问数组当中的元素
7.数组变量存的就是数组在堆内存中首元素的地址
8.数组通过角标来访问元素的具体计算方式是 所要访问数据的地址=首元素地址+角标*数据类型大小
9.数组一旦定义下来,其长度不可改变;数组中有几个地址?就看数组有几个元素空间<==>数组的长度
10.创建数组时必须明确规定大小或内容:
数据类型[ ] 数组名=new 数据类型[长度]; 创建数组只指定长度但不指定内容
数据类型[ ] 数组名=new 数据类型[]{1,2,3,4,5}; 创建数组指定内容(指定长度)
数据类型[ ] 数组名={1,2,3,4,5}; 创建数组指定内容(指定长度)
[ ]表示是一维数组
[ ][ ]表示二维数组
2.声明数组变量
为了在程序中使用数组,必须声明一个引用数组的变量,并指明数组的元索类型。下面 是声明数组变量的语法:
elementType[] arrayRefVar;(元素类型[] 数组引用变量;)
elementType 可以是任意数据类型,但是数组中所有的元素都必须具有相同的数据类 型。例如:double[ ] myList; 代码声明变量 myList,它引用一个具有 double 型元素的数组。
3.创建数组
不同于基本数据类型变量的声明,声明一个数组变量时并不在内存中给数组分配任何空 间。它只是创建一个对数组的引用的存储位置。如果变量不包含对数组的引用,那么这个 变量的值为 null。除非数组已经被创建,否则不能给它分配任何元素。声明数组变量之后, 可以使用下面的语法用 new 操作符创建数组,并且将它的引用賦给一个变量:
声明一个数组变量、创建数组、然后将数组引用賦值给变量这三个步驟可以合并在一条 语句里,如下所示:
elementType[] arrayRefVar = new elementType [arraySize];
//(元素类型[] 数组引用变量 = new 元素类型 [ 数组大小];) 或
elementType arrayRefVar[] * new e1ementType[arraySize];
//(元素类型 数组引用变量 = new 元素类型[数组大小]; )
//下面是使用这条语句的一个例子:
double[] myList = new double[10];
使用以下语法给这些元索賦值:
arrayRefVar[index] = value;
例如,下面的代码初始化数组:
myList[0] = 5.6;
myList[l] = 4.5;
myList[2] = 3.3;
myL1st[3] = 13.2;
myList[4] = 4.0;
myList[5] = 34.33;
myList[6] = 34.0;
myList[7] = 45.45;
myL1st[8] = 99.993;
myList[9] = 11123;
注意:一个数组变量看起来似乎是存储了一个数组,但实际上它存储的是指向数组的引 用。严格地讲,一个数组变量和一个教组是不同的,但多教情况下它们的差别是可以忽略 的。因此,为了简化,通常可以说myList 是一个数组,而不用更长的陈述:myList 是一 个含有 10 个 double 型元素數组的引用变量。
4.数组大小和默认值
当给数组分配空间时,必须指定该数组能够存储的元素个数,从而确定数组大小。创建数组之后就不能再修改它的大小。可以使用 arrayRefVar.length 得到数组的大小。例如:
myList.length( ) ;
5.访问审核数组元素
数组元素可以通过下标访问。数组下标是基于 0的,也就是说,其范围从 0 开始到 arrayRefVar.length-1结束。例如,在图 7-1 的例子中:
数组 myList 包含 10个 double 值, 而且下标从 0 到 9。 数组中的每个元素都可以使用下面的语法表示,称为下标变量
(indexed variable);
arrayRefVar[index]; (数组引用交量[下标];) 例如:myList[9] 表示数组 myList 的最后一个元索。
创建数组后,下标变量与正常变童的使用方法相同。例如:下面的代码是将 myList[0] 和 myList[l]的值相加賦给 myList[2]。
myList[2] = myList[0] + myList[l];
//下面的循环是将 0 賦给 myList[0],1 赋给 myList[1], 9 賦给 myL1st[9];
for (int i = 0;i < myList.length; i++){
myList[i]=i;
}
6.数组初始化语法
Java 有一个简捷的标记,称作数组初始化语法,它使用下面的语法将声明数组、创建数 组和初始化数组结合到一条语句中:
elementType[ ] arrayRefVar = {value0, value1, …valuek}; (元索类型[ ] 数组引用变量={值 0,值1, 值 k};)
例如:
double[ ] myList = {1.9, 2.9, 3.4, 3.5};
这条语句声明、创建并初始化包含 4 个元素的数组 myList, 它等价于下列语句:
double[] myList = new double[4];
myList[0] = 1.9;
myList[l] = 2.9;
myList[2] = 3.4;
myList[3] = 3.5;
警告 :数组初始化语法中不使用操作符 new。使用数组初始化语法时,必须将声明、创建和 初始化数组都放在一条语句中。将它们分开会产生语法错误。因此,下面的语句是错误的:
double[ ] myList;
myList ={1.9, 2.9, 3.4, 3. 5} ;
7.处理数组
处理数组元素时,经常会用到 for 循环,理由有以下两点:
1 ) 数组中所有元素都是同一类型的。可以使用循环以同样的方式反复处理这些元素。
2 )由于数组的大小是已知的,所以很自然地就使用for循环。
假设创建如下数组:
double[ ] myList = new double[10];
下面是一些处理数组的例子:
1 ) (使用输入值初始化数组)下面的循环使用用户输人的数值初始化数组 myList。
java.util.Scanner input = new java.util.Scanner(System.in);
System.out.print("Enter " + myList.length + " values: ");
for (int i = 0;i < myL1st.length;i++){
myList[i] = input.nextDouble();
}
2)(使用随机数初始化数组)下面的循环使用0.0 到 100.0之间,但小于100.0的随机 值初始化数组 myList。
for (1nt i = 0; i < myList.length;i++){
myList[i] = Math.random() * 100; //Math.random()随机产生[0.0,1.0)的double型数字
}
3 ) (显示数组)为了打印数组,必须使用类似下面的循环,打印数组中的每一个元素。
for (int i = 0;i < myList.length; i++){
Systen.out.print(myList[i] + " ");
}
提示:对于 char[]类型的数组,可以使用一条打印语句打印。例如下面的代码显示 Dallas
char[] city = {'D','a','l','l','a','s'};
System.out.println(city);
4 )(对所有元素求和)使用名为 total 的变量存储和。total 的值初始化为 0。使用如下 循环将数组中的每个元素加到 total 中:
double total = 0;
for (int i=0;i < myList.length;i++){
total += myL1st[i];
}
5 )(找出最大元素)使用名为 max的变量存储最大元素。将 max的值初始化为 myList[0]o 为了找出数组 myList中的最大元素,将每个元素与 max 比较,如果该元索大于 max, 则更新 max。
double max = myList[0];
for (int i = 1;i < myList.length;i++){
if (myList[ij > max) max = myList[i];
}
6 )(找出最大元素的最小下标值)经常需要找出数组中的最大元素。如果数组中含有 多个最大元素,那么找出最大元素的最小下标值。假设数组 myList 为{1,5, 3,4,S,S}。最 大元素为 5, S 的最小下标为1。使用名为 max 的变量存储最大元素,使用名为 index0fMax 的变量表示最大元素的下标。将 max的值初始化为 myList[0], 而将 index0fMax 的值初 始化为 0。将 myList中的每个元素与 max比较,如果这个元素大于 max,则更新 max 和 index0fMax。
double max = myList[0];
int indexOfMax = 0;
for (int i = 1:1 < myList.length;i++){
if (myList[i] > max){
max=myList[i];
indexOfMax=i;
}
}
7)(随机打乱)在很多应用程序中,需要对数组中的元素进行任意的重新排序。这称作 打乱(shuffling)。为完成这种功能,针对每个元素 myList[i], 随意产生一个下标 j, 然后 将 myList[i]和 myList[j]互换,如下所示:
for (int i = myList.length - 1; i > 0; i--){
// Generate an index j randomly with 0 <= j <= i
int j = (int)(Math.random() * (i + 1));
// Swap myList[i] with myList[j]
double temp = myList[i];
myList[i] = myList[j];
myList[j] = temp;
}
8 )(移动元素)有时候需要向左或向右移动元素。这里的例子就是将元素向左移动一个 位置并且将第一个元素放在最后一个元素的位置:
double temp = myList[0]; // Retain the first element
// Shift elements left
for (int i = 1; i < myList.length; i++) {
myList[i - 1] = myList[i];
}
// Move the first element to fill in the last position
myList[myList.length - 1] * temp;
9 )( 简化编码)对于某些任务来说,数组可以极大简化编码。例如,假设你想通过给定数 字的月份来获得一个该月份的英文名字。如果月份名称保存在一个数组中,给定月份的月份 名可以简单通过下标获得。下面的代码提示用户输人一个月份数字,然后显示它的月份名称:
String[] months = {"January" , "February", .... "December"};
System.out.print("Enter a month number (1 to 12): ");
int monthNumber = input.nextlnt();
System.out.println("The month is + months[monthNumber - 1]);
如果不使用months 数组,你将不得不使用一个很长的多分支 if-else 语句来确定月份 名称,如下所示:
if (monthNumber == 1) {
System.out.println("The month is January");
}
else if (monthNumber == 2) {
System.out.println("The month is February");
}else
System.out.println("The month is December");