文章目录
1. 数组的概述
- 数组:是多个相同类型数据按一定顺序排列的集合,并使用一个名字命名,并通过编号的方式对这些数据进行统一管理。
- 数组的常见概念:
- 数组名
- 下标(或索引)
- 元素
- 数组的长度
- 数组的特点:
- 数组是有序排列的
- 数组属于引用数据类型的变量。数组的元素,既可以是基本数据类型,也可以是引用数据类型
- 创建数组对象会在内存中开辟一整块连续的空间
- 数组的长度一旦确定,就不能修改
- 数组的分类
- 按照维数:一维数组、二维数组…
- 按照数组元素的类型:基本数据类型元素的数组、引用数据类型元素的数组
2.一维数组的使用
2.1 一维数组的声明和初始化
1.一维数组的声明和初始化
//1.1静态初始化:数组的初始化和数组元素的赋值操作同时进行
int[] studentid;//声明
studentid = new int[]{1001,1002,1003,1004};
//1.2动态初始化:数组的初始化和数组元素的赋值操作分开进行
String[] names = new String[4];
//也是正确的写法:
int[] arrys4 = {1,2,3,4,5};//类型推断
总结:数组一旦初始化完成了,数组的长度就确定了,而且不可修改。
2.2 如何调用数组的指定位置的元素
通过角标(索引)的方式调用
数组的角标(索引是从0开始,到数组的长度-1结束)
names[0] = "张三";
names[1] = "李四";
names[2] = "王五";
names[3] = "赵六";
2.3 如何获取数组的长度
//属性:length
System.out.println(names.length);
System.out.println(studentid.length);
2.4 如何遍历数组
for (i = 0;i < names.length; i++){
System.out.println(names[i]);
}
2.5 数组元素的默认初始化值
默认初始化值 | |
---|---|
数组元素是整型 | 0 |
数组元素是浮点型 | 0.0 |
数组元素是char型 | ASCII码值为0的字符 |
数组元素是boolean型 | false |
数组元素是引用数据类型 | null |
2.6 数组的内存解析
栈中主要存放局部变量(方法中定义的变量,例如main方法中的变量)
堆中主要存放new出来的结构:对象、数组等
内存的主要结构:栈(stack),是线性结构——下图左、堆(heap)——下图右
练习:
class ArratTest{
public static void main(String[] args){
int[] arr = new int[]{8,2,0,3};
int[] index = new int[]{2,0,3,2,4,0,1,3,2,3,3};
String tel = "";
for(int i = 0; i <index.length;i++){
tel += arr[index[i]];
}
System.out.println("联系方式:" + tel);
}
}
输出结果:18012820100
练习2:
import java.util.Scanner;
class ArraTest{
public static void main(String[] args){
//1.使用Scanner,读取学生人数
Scanner scan = new Scanner(System.in);
System.out.print("请输入学生人数:");
int StudentNumber = scan.nextInt();
System.out.println("请输入" + StudentNumber + "个成绩");
//2.创建数组,存储学生成绩,动态初始化
int[] studentGrade = new int[StudentNumber];
//3.给数组中的元素赋值
for(int i = 0; i < studentGrade.length;i++){
studentGrade[i] = scan.nextInt();
}
//4.获取数组元素中的最大值,获取最高分
int maxStudentGrade = 0;
for(int i =0;i < studentGrade.length;i++){
if(maxStudentGrade < studentGrade[i]){
maxStudentGrade = studentGrade[i];
}
}
//5.根据每个学生成绩与最高分的差值,得到每个学生的等级和成绩
char level;
for(int i =0 ;i < studentGrade.length;i++){
if(maxStudentGrade - 10 <= studentGrade[i] ){
level = 'A';
}else if(maxStudentGrade - 20 <= studentGrade[i] ){
level = 'B';
}else if(maxStudentGrade - 30 <= studentGrade[i] ){
level = 'C';
}else{
level = 'D';
}
System.out.println("student " + i +" score is " + studentGrade[i] +" grade is " + level);
}
}
}
3.二维数组的使用
3.1 二维数组的声明和初始化
3.2 如何调用二维数组的指定位置的元素
3.3 如何获取二维数组的长度
3.4 如何遍历二维数组
概念:数组的元素还是数组。对于二维数组的理解,我们可以看成是一维数组array1又作为另一个一维数组array2的元素而存在。其实,从数组底层的运行机制来看,没有多维数组。
//1. 二维数组的声明和初始化
public arrarTest2{
public static void main(String[] args){
//静态初始化
int[] arr = new int[]{1,2,3};//一维数组
int[][] arr1 = new int[][]{{1,2,3},{4,5},{6,7,8}};
//动态初始化法一
int[][] arr2 = new int[3][2];
//动态初始化法二
int[][] arr3 = new int[3][];
//正确但荒唐
int[] arr4[] = new int[][]{{1,2,3},{4,5},{6,7,8}};
int[] arr5[] = {{1,2,3},{4,5},{6,7,8}};
}
}
//2.如何调用数组的指定位置的元素
System.out.println(arry1[0][1]);//2
System.out.println(arry2[1][1]);//null
arr3[1] = new String[4];
System.out.println(arr3[1][0]);
//3.获取数组的长度
System.out.println(arr4.length);//3
System.out.println(arr4[0].length);//3
System.out.println(arr4[1].length);//2
//4.二维数组的遍历
for (int i = 0;i < arr1.length;i++){
for (int j = 0;j < arr1[i].length ;j++){
System.out.print(arr1[i][j] + " ");
}
System.out.println();
3.5 二维数组元素的默认初始化值
3.6 二维数组的内存解析
//5.数组元素的默认初始化值
规定:二维数组分为外层数组的元素、内存数组的元素
int[] arr = new int[4][3]
外层元素:arr[0],arr[1]等
内层元素:arr[0][0],arr[1][2]等
针对于初始化方式一:int[][] arr = new int[4][3];
外层元素的初始化值为:地址值
内层元素的初始化值为:与一维数组的初始化情况相同
针对于初始化方式二:int[][] arr = new int[4][];
外层元素的初始化值为:null
内层元素的初始化值为:不能调用,报错,空指针异常
public class ArrayTest3{
public static void main(String[] args){
int[][] arr = new int[4][3];
System.out.println(arr[0]);//地址值
System.out.println(arr[0][0]);//0
System.out.println(arr);//地址值(二维数组的地址)
double[][] arr1 = new double[4][3];
System.out.println(arr[0]);//地址值
System.out.println(arr[0][0]);//0.0
String[][] arr2 = new String[4][3];
System.out.println(arr[0]);//地址值
System.out.println(arr[0][0]);//null
String[][] arr3 = new String[4][];
System.out.println(arr[0]);//null
System.out.println(arr[0][0]);//报错,空指针异常
}
}
插曲:数据结构与算法
数据结构研究的主要内容:
- 数据与数据之间的逻辑关系:集合、一对一、一对多、多对多
- 数据的存储结构:
线性表:顺序表(数组)、链表、栈(先进后出)、队列(先进先出)
树形结构:二叉树
图形结构(多对多):
算法:
- 排序算法
- 搜索算法