目录
一、什么是数组:在执行程序的过程中,经常要存储大量相同类型的数据。
二、创建一维数组:在大多数编程语言中,创建一维数组的方法都很相似,以下是常见的几种方法:
2. 动态初始化:在声明数组时,只分配内存空间,不为数组元素赋初值,如:
3.从已有数组中初始化:可以从一个已有的数组中复制元素到新数组中,如:
其中 Arrays.copyOf 方法可以复制一个数组,并返回一个新的数组,长度为指定的长度。如果指定长度比原数组长度大,那么新数组的后面元素将被赋默认值。
五、下面是一个简单的学生系统,它使用Java的一维数组来存储学生的信息,并允许增加、删除、修改和查找学生的信息。
一、什么是数组:在执行程序的过程中,经常要存储大量相同类型的数据。
如:要读入100个数,计算平均值,然后找出有多少个数大于平均值。
(1)程序读入这些数并计算它们的平均值
(2)将每个数与平均值进行比较判断它是否大于平均值。为了完成任务,必须将全部数据储存到变量中。声明100个变量,重复写书100次几乎完全相同的代码,这个方式是不现实。
java和其他编程语言一样提供了数组来存储这些数据。
在Java中,一维数组是一个固定长度的数据结构,由相同类型的元素组成,这些元素依次存储在连续的内存空间中。一维数组可以包含任意类型的数据,包括基本数据类型(如整数、浮点数等)和对象类型(如字符串、自定义类等)。数组中的每个元素都有一个唯一的索引值,从0开始逐个递增,可以通过索引值访问数组中的元素。
二、创建一维数组:在大多数编程语言中,创建一维数组的方法都很相似,以下是常见的几种方法:
- 使用数组字面量创建数组:例如,在JavaScript中,可以使用以下方式创建一个包含3个数字的数组:
let myArray = [1, 2, 3];
- 通过构造函数创建数组:在Java中,可以使用以下方式创建一个包含3个元素的整型数组:
int[] myArray = new int[3]; // 数组长度为3
- 在声明数组时初始化数组元素:在C语言中,可以使用以下方式声明一个包含3个元素的字符数组并初始化它们:
char myArray[3] = {'a', 'b', 'c'};
- 通过复制另一个数组创建新数组:在Python中,可以使用以下方式创建一个与现有数组相同的新数组:
oldArray = [1, 2, 3] newArray = oldArray.copy() #将oldArray复制给newArray
无论使用哪种方法,一旦创建了一维数组,就可以使用它来存储和操作数据。
三、一维数组的初始化:
在大多数编程语言中,一维数组可通过以下方法进行初始化:
-
静态初始化:在声明数组时,分配内存并为数组元素赋初值,如:
int[] arr1 = {1, 2, 3, 4, 5};
2. 动态初始化:在声明数组时,只分配内存空间,不为数组元素赋初值,如:
int[] arr2 = new int[5];
可以使用循环语句为数组元素赋初值,如:
for(int i=0; i<arr2.length; i++){
arr2[i] = i+1;
}
3.从已有数组中初始化:可以从一个已有的数组中复制元素到新数组中,如:
int[] arr1 = {1, 2, 3, 4, 5};
int[] arr2 = Arrays.copyOf(arr1, arr1.length);
其中 Arrays.copyOf
方法可以复制一个数组,并返回一个新的数组,长度为指定的长度。如果指定长度比原数组长度大,那么新数组的后面元素将被赋默认值。
四、数组元素的引用
可以通过数组名和元素下标来引用一维数组中的元素。下标从0开始,依次递增。例如,对于一个名为a的一维数组,要访问第三个元素,可以使用a[2]。其中2是元素下标,表示第三个元素在数组中的位置。
假设有一个整型数组 arr
,我们可以通过下标来引用数组中的元素,例如:
int[] arr = {1, 2, 3, 4, 5};
int first = arr[0]; // 引用数组中第一个元素,即1
int third = arr[2]; // 引用数组中第三个元素,即3
另外,我们还可以通过循环来遍历数组中的所有元素,例如:
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]); // 输出数组中所有元素
}
五、下面是一个简单的学生系统,它使用Java的一维数组来存储学生的信息,并允许增加、删除、修改和查找学生的信息。
import java.util.Scanner;
public class StudentSystem {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
String[] names = new String[100];
int[] ages = new int[100];
String[] genders = new String[100];
float[] scores = new float[100];
int count = 0; // 学生数量
while (true) {
System.out.println("请选择操作:");
System.out.println("1. 添加学生信息");
System.out.println("2. 删除学生信息");
System.out.println("3. 修改学生信息");
System.out.println("4. 查找学生信息");
System.out.println("5. 显示所有学生信息");
System.out.println("0. 退出程序");
int choice = input.nextInt();
switch (choice) {
case 1:
System.out.println("请输入学生姓名:");
String name = input.next();
System.out.println("请输入学生年龄:");
int age = input.nextInt();
System.out.println("请输入学生性别:");
String gender = input.next();
System.out.println("请输入学生成绩:");
float score = input.nextFloat();
names[count] = name;
ages[count] = age;
genders[count] = gender;
scores[count] = score;
count++;
System.out.println("添加成功!");
break;
case 2:
System.out.println("请输入要删除的学生姓名:");
String delName = input.next();
int delIndex = -1;
for (int i = 0; i < count; i++) {
if (names[i].equals(delName)) {
delIndex = i;
break;
}
}
if (delIndex != -1) {
for (int i = delIndex; i < count - 1; i++) {
names[i] = names[i + 1];
ages[i] = ages[i + 1];
genders[i] = genders[i + 1];
scores[i] = scores[i + 1];
}
count--;
System.out.println("删除成功!");
} else {
System.out.println("没有找到该学生!");
}
break;
case 3:
System.out.println("请输入要修改的学生姓名:");
String modifyName = input.next();
int modifyIndex = -1;
for (int i = 0; i < count; i++) {
if (names[i].equals(modifyName)) {
modifyIndex = i;
break;
}
}
if (modifyIndex != -1) {
System.out.println("请输入学生年龄:");
int newAge = input.nextInt();
System.out.println("请输入学生性别:");
String newGender = input.next();
System.out.println("请输入学生成绩:");
float newScore = input.nextFloat();
ages[modifyIndex] = newAge;
genders[modifyIndex] = newGender;
scores[modifyIndex] = newScore;
System.out.println("修改成功!");
} else {
System.out.println("没有找到该学生!");
}
break;
case 4:
System.out.println("请输入要查找的学生姓名:");
String searchName = input.next();
int searchIndex = -1;
for (int i = 0; i < count; i++) {
if (names[i].equals(searchName)) {
searchIndex = i;
break;
}
}
if (searchIndex != -1) {
System.out.println("姓名\t年龄\t性别\t成绩");
System.out.println(names[searchIndex] + "\t" + ages[searchIndex] + "\t" + genders[searchIndex] + "\t" + scores[searchIndex]);
} else {
System.out.println("没有找到该学生!");
}
break;
case 5:
System.out.println("序号\t姓名\t年龄\t性别\t成绩");
for (int i = 0; i < count; i++) {
System.out.println((i + 1) + "\t" + names[i] + "\t" + ages[i] + "\t" + genders[i] + "\t" + scores[i]);
}
break;
case 0:
System.out.println("谢谢使用,再见!");
System.exit(0);
default:
System.out.println("输入有误,请重新输入!");
}
}
}
}
以上代码演示了如何使用一维数组实现一个简单的学生信息管理系统,其中使用了循环来遍历数组,根据不同的选择执行不同的操作。
六、数组在内存中的存储
数组在内存中通常是连续的一段内存空间,其中每个元素都被分配了相同的内存空间。数组的首地址指向第一个元素的内存地址,通过索引可以访问数组中的每个元素。例如,一个int类型的数组a,如果有5个元素,那么在内存中可能是这样存储的:
a[0]的地址: 1000
a[1]的地址: 1004
a[2]的地址: 1008
a[3]的地址: 1012
a[4]的地址: 1016
这里假设int类型的大小为4字节。因此,a[1]的地址为a[0]的地址加上一个int类型的字节数4,依此类推。在内存中存储数组的好处是可以快速访问任何一个元素,并且可以通过指针对数组进行遍历和操作。
七、foreach循环
foreach循环是一种迭代循环,用于循环遍历数组或集合中的元素。它的语法格式如下:
foreach ($array as $value) {
// 执行代码
}
其中,$array
是要遍历的数组或集合,$value
则是每一次循环遍历中当前元素的值。在循环中可以使用 $value
来操作当前元素。
除了上述语法格式,foreach
循环还支持同时遍历键名和键值的格式:
foreach ($array as $key => $value) {
// 执行代码
}
其中,$array
是要遍历的数组或集合,$key
是当前元素的键名,$value
是当前元素的值。在循环中可以使用 $key
和 $value
来操作当前元素。
foreach
循环可以用于遍历数组、对象、Iterator 对象和其他可遍历的数据类型。
总结
一维数组是一种线性数据结构,它由相同类型的元素组成,并按照一定的顺序排列。一维数组中每个元素的位置由数组下标来指定,数组下标从 0 开始,依次递增。
一维数组有许多特点和优点,如:
-
存储元素的连续性:由于它的元素都是相同类型的,所以一维数组的元素存储在内存中是连续的,这样可以提高程序的效率。
-
快速访问:由于数组的元素存储位置是连续的,因此可以根据元素的下标快速访问和查找元素。
-
空间效率高:一维数组在内存中只需要开辟一段连续的空间,因此空间效率非常高。
-
灵活性强:可以通过修改数组下标来修改元素的值,而不用针对每个元素进行修改。
-
支持多种操作:一维数组支持多种操作,如插入、删除、排序、查找等。
然而,一维数组也存在一些缺点,如:
-
长度固定:一维数组的长度是固定的,一旦数组长度确定,则无法再改变。
-
数组越界:访问数组时,如果下标越界,则会导致程序崩溃或错误的结果。
-
不支持删除:一维数组不支持删除操作,只能通过复制元素到其他数组来实现删除操作。
-
不支持动态扩展:由于长度固定,一维数组不支持动态扩展,如果需要扩展数组长度,则需要重新创建一个新的数组。