智渔课堂官方免费教程二十六:Java基础教程之数组

时间:2023-01-19 19:23:55

数组

举例:假如现在有十个人排成一队【张三,李四,王五……】,这个队的队名叫A,然后要求第一个人从0开始报数【张三报0,李四报1,王五报2……】。现在要求第一个人出列,但现在还不知道张三的名字,怎么办?那么只能要求A队0号出列。请问此时谁会出列?很明显是张三出列。
这对人就形成了类似数组的结构;其中队名A就对应数组名,各个人报的号就对应数组的下标,而每个人就对应数组中的元素,人的个数就对应数组的长度。
在程序设计中,把具有相同类型的若干个变量按有序的形式组合在一起,仅使用一个变量名来存储这些元素,用下标(下标从0开始)来对应不同位置的变量,这就是数组。


创建数组

声明语法格式: 
方式一、数据类型[] 变量名 = { 数据1, 数据2, ....数据n };
方式二、数据类型[] 变量名 = new 数据类型[]{ 数据1, 数据2, ....数据n };
方式三、数据类型[] 变量名 = new 数据类型[长度值]; 
赋值语法格式:
变量名[下标] = 值;


实例:
/*
执行完此句代码后,内存中存在一个名字叫i的变量,并且占用3个int类型长度的连续空间(即占用连续12字节的内存空间),并按每个int类型长度(4字节)为单位自左向右进行编号,编号从0开始。然后将int类型的值1存入编号为0的4个字节中,2存入编号为1的4个字节中,3存入编号为2的4个字节中。并将这12字节内存空间的起始地址复制给变量i
其中int是数据类型,[]中括号代表数组,变量名i也可称为数组名,{}大括号表示数组常量(其内部包含数组元素),其中的数据1,2,3是数组的三个(长度为3)元素(多个元素之间用英文格式的逗号隔开),对应的编号0、1、2是数组的下标。
*/
int[]  i = {1, 2, 3};
//创建一个长度为5的String类型的数组;
//此处的new操作是在创建数组对象,所以后面跟的是中括号和长度:类型[长度] 
String[]  str = new  String[5]; 
//为数组的元素赋值;其中str [0]中的0代表的是下标
str [0] = "abc";
//此处的new操作是创建String对象,所以后面跟小括号,而不是中括号;
//然后将创建的String对象赋值给数组中下标为1的位置
str [1] = new  String("xyz");
//此句会出现错误,因为数组的长度是5,下标是0到4
//此处使用5作为下标,超出了数组下标的界限
str[5] = "aaa"


注意:
方式一只能写在一条语句中,不能拆成两条语句;
例如:int  i;   i = {1, 2, 3};  //这样是错误的。
方式二new 类型[]{};的中括号[]中不能写长度值,大括号中元素的个数就是长度值
方式三new 类型[3];的中括号[]中必须写长度值
另外:声明数组变量时[]可以写在数据类型后,也可以写在变量名后,如:int  i[];


数组是引用类型,其引用可以指向任何相同类型的数组对象,但数组对象一旦创建,其长度无法再改变。而且数组对象占用的内存空间一定是连续的。


操作数组

使用下标访问数组中的数据
语法格式:数组名[下标]
获取数组的长度:数组名.length;
实例:
package array;
/**
* 操作数组类OperationArray
* 实现向数组中添加数据
* 访问数组中的数据
* 查询数组中的数据
* 修改数组中的数据
* 向数组中插入数据
* 删除数组中的数据
* @author 学霸联盟 - 赵灿
*/
public class OperationArray {

public static void main(String[] args) {
//创建长度为4的字符串数组,用于存储学生姓名
String[] studentNames = new String[4];
//向数组中添加值;数组中的最后一个位置没有添加值,引用类型默认值为null
studentNames[0] = "张三";
studentNames[1] = "李四";
studentNames[2] = "王五";
System.out.println("----------- 初始数组中的值 -----------");
//调用遍历数组的方法
ergodicArray(studentNames);
System.out.println("----------- 查询数据 -----------");
//查询“李四”在数组中的位置
for (int i = 0; i < studentNames.length; i++) {
//判断两个字符串的内容是否相同使用equals方法,而不能使用双等号==
//用字符串"李四"依次和数组中的字符串比较,如果相同equals方法返回true
if ("李四".equals(studentNames[i])) {
System.out.println("李四在数组studentNames中的下标为:"+i);
//如果已找到"李四",无需再继续查找,用break结束循环
break;
}else if(i == studentNames.length - 1){
//判断i是否等于数组的最后一个下标
//否则找不到"李四"时此代码块会被执行多次
System.out.println("在数组studentNames中没有找到李四");
}
}

System.out.println("----------- 修改后的数据 -----------");
//将下标为2的“王五”修改为“赵六”
studentNames[2] = "赵六";
//调用遍历数组的方法,输出修改后的数据
ergodicArray(studentNames);

System.out.println("----------- 插入后的数据 -----------");
/*
* 向下标为2的位置重新插入“王五”
* 既然是插入,从下标为2到数组的结尾的每一个元素都要向后移动一位
* 然后将下标为2的位置赋值为“王五”
* 所以for循环要从数组中倒数第一个元素开始访问,即studentNames.length-1
* 至等于2时结束,并且下标是一个一个不断在减小的
*/
for (int i = studentNames.length - 1; i >= 2; i--) {
//将前面一个位置的值,赋值给后面一个位置,以此实现每个元素的位置移动
studentNames[i] = studentNames[i-1];
if ( i == 2 ) {
/*
* 当下标等于2时,要先将原来的值移动到3的位置上
* 再给下标为2的位置上赋要插入的新值
* 所以赋新值的代码应该在位移代码的后面
*/
studentNames[2] = "王五";
}
}
//调用遍历数组的方法,输出修改后的数据
ergodicArray(studentNames);

System.out.println("----------- 删除后的数据 -----------");
/*
* 将下标为2的位置上的值删除,即删除刚刚插入的“王五”
* 删除后应该回到插入“王五”之前的状态
* 恰好和插入相反,删除是将2位置以后的每个位置的元素往前移动一位
*/
for (int i = 2; i < studentNames.length; i++) {
if ( i == studentNames.length - 1 ) {
/*
* 当下标等于数组的最后一个位置时,其后已经没有其他值了
* 所以不需要再执行移动操作,这里将最后一个位置的值赋值为null
*/
studentNames[i] = null;
}else{
//将后一位置上的值,赋值给前一个位置,从而实现元素的位置移动
studentNames[i] = studentNames[i+1];
}
}
//调用遍历数组的方法,输出修改后的数据
ergodicArray(studentNames);

}

/**
* 遍历数组的方法;遍历:就是一个一个的访问
* 其中参数为需要遍历的数组
* 由于多处需要用到遍历输出数组中的值,所以将其放到一个方法
* 这样在需要使用的位置,调用这个方法就可以复用遍历输出的代码了
*/
private static void ergodicArray(String[] array) {
//循环输出数组中的每一个值
for (int i = 0; i < array.length; i++) {
//使用下标访问数组中的值和制表符
System.out.print(array[i] + "\t");
}
//输出换行符
System.out.print("\n");
}
}
运行结果:
----------- 初始数组中的值 -----------
张三 李四 王五 null
----------- 查询数据 -----------
李四所在数组studentNames中的下标为:1
----------- 修改后的数据 -----------
张三 李四 赵六 null
----------- 插入后的数据 -----------
张三 李四 王五 赵六
----------- 删除后的数据 -----------
张三 李四 赵六 null

二维数组

就是一维数组中的每个元素也是一维数组,这样组成的数组就是二维数组。
方式一、数据类型[][] 数组名 = {{ 值1,...值n},{值1,...值m},{值1,...值k}};
方式二、数据类型[][] 数组名;
数组名 = new 数据类型[][]{{....},{....}};

和一维数组一样,方式一只能写在一条语句中,不能分成两条语句编写;

方式三、数据类型[][] 数组名 = new 数据类型[外层数组长度][内层数组长度];
数组名[0][0] = 值;

方式四、数据类型[][] 数组名 = new 数据类型[外层数组长度][];
数组名[下标] = new 数据类型[长度];

遍历二维数组

实例:
package array;
/**
* TwoDimensionalArrayDemo类:演示二维数组
* @author 学霸联盟 - 赵灿
*/
public class TwoDimensionalArrayDemo {
public static void main(String[] args) {
/*
* 声明一个String类型的二维数组classroom
* 第一维的长度为2,第二维的长度为3
* 即一个长度为2的一维数组,其每一个元素都是长度为3的一维数组
*/
String[][] classroom = new String[2][3];
classroom[0][0] = "第1行第1列";
classroom[0][1] = "第1行第2列";
classroom[0][2] = "第1行第3列";
classroom[1][0] = "第2行第1列";
classroom[1][1] = "第2行第2列";
classroom[1][2] = "第2行第3列";
//循环获取第一维数组中的每个元素
for (int i = 0; i < classroom.length; i++) {
//其中的每个元素又是一个一维数组
String[] row = classroom[i];
/*
* 再次循环获取到的一维数组
* 其中row.length 等价于 classroom[i].length
*/
for (int j = 0; j < row.length; j++) {
/*
* 此时获取到的是一个字符串值
* 其中row[j] 等价于 classroom[i][j]
*/
System.out.println(row[j]);
}
}
}
}
运行结果:
第1行第1列
第1行第2列
第1行第3列
第2行第1列
第2行第2列
第2行第3列