目录
01 数组的概述
数组 (Array) 是多个相同类型数据按一定顺序排列的集合并使用一个名字命名并通过编号的方式
对 这些 数据进行统一管理 。
- 数组的常见概念
- 数组 名
- 下标 或索引
- 元素
- 数组的长度 : 元素个数
数组的特点
- 数组属于引用类型的变量。
- 数组的元素,既可以是基本数据类型,也可以是引用数据类型。
- 创建数组对象会在内存中开辟一整块连续的空间;
- 数组的长度一旦确定,就不能修改;
- 数组是有序排列的。
数组分类
- 按照维数:一维数组、二维数组、三维数组……
- 按照数组元素类型:基本数据类型元素的数组、引用类型元素的数组
02 一维数组的使用
/*
* ① 一维数组的声明和初始化
定义并用运算符new为数组分配空间后,才能引用数组元素
* ② 如何调用数组的指定位置的元素
* ③ 如何获取数组的长度
* ④ 如何遍历数组
* ⑤ 数组元素的默认初始化值:
* ⑥ 数组的内存解析:
*/
一维数组声明和初始化
public class ArrayTest {
public static void main(String[] args){
int[] ids; // 声明
// 静态初始化: 初始化和元素赋值同时进行
ids = new int[]{1001,1002,1003,1004};
// 动态初始化: 分开进行
String[] names = new String[3];
// 一旦初始化完成,长度确定
//
}
调用元素
String[] names = new String[3];
// 一旦初始化完成,长度确定
names[0] = "Tom";
names[1] = "jerry";
names[2] = "Bob";
获取数组长度 length
System.out.println(names.length);
遍历数组元素
for (int i = 0; i < names.length; i++){
System.out.println(names[i]);
}
数组元素默认初始化值
/*
数组元素是浮点型:0.0
数组元素是char型:0或'\u0000',而非'0'
数组元素是boolean型:false
数组元素是引用数据类型:null
*/
public class ArrayTest1 {
public static void main(String[] args){
// 默认初始化值
// 整型 0
int[] arr = new int[4];
for (int i = 0; i < arr.length; i++){
System.out.println(arr[i]); // 0 0 0 0
}
// 浮点型 0.0
float[] fla = new float[4];
for (int i = 0; i < fla.length; i++){
System.out.println(fla[i]); // 0 0 0 0
}
}
}
2.1 一维数组的内存解析
内存简化结构
内存解析
int[] arr = new int[]{1,2,3};
String[] arr1 = new String[4];
arr1[1] = “刘德华”;
arr1[2] = “张学友”;
arr1 = new String[3]; //变量arr1指向新的数组
System.out.println(arr1[1]);//null
局部变量保存在栈中,创建的对象保存在堆中
2.2 一维数组练习
练习一
/*
* 升景坊单间短期出租4个月,550元/月(水电煤公摊,网费35元/月),空调、卫生间、厨房齐全。
* 屋内均是IT行业人士,喜欢安静。所以要求来租者最好是同行或者刚毕业的年轻人,爱干净、安静。
* eclipse代码一键格式规范化:Ctrl+Shift+F
*/
public class ArrayTest2 {
public static void main(String[] args){
int[] arr = new int[] { 8, 2, 1, 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);
}
}
//联系方式:18013820100
练习2
/*
从键盘读入学生成绩,找出最高分,
并输出学生成绩等级。
成绩 最高分 10 等级为 ’A’
成绩 最高分 20 等级为 ’B’
成绩 最高分 30 等级为 ’C’
其余 等级 为 ’D‘
提示:先读入学生人数,根据人数创建int 数组,存放学生成绩。
*/
import java.util.Scanner;
public class ArrayTest1 {
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
System.out.print("请输入学生人数: ");
int studentNum = scan.nextInt();
// 声明数组,并依据输入人数确定数组长度
int[] arr = new int[studentNum];
int maxScore = 0
System.out.print("请输入" + studentNum + "个成绩:");
// 输入成绩,并保存在数组内
for (int i = 0; i < studentNum; i++){
arr[i] = scan.nextInt();
if(maxScore < arr[i]){ // 可以在赋值时直接比较,选出最大值
maxScore = arr[i];
}
}
// 输出最高分 比较数组元素,找出最大值
//int maxScore = 0;
//for (int i = 0; i < studentNum; i++){
// if(maxScore < arr[i]){
// maxScore = arr[i];
//}
// }
System.out.println("最高分是 " + maxScore);
// 分别输出学生成绩并输出成绩等级
char grade = 'A';
for (int i = 0; i < studentNum ; i++){
if(arr[i] >= (maxScore - 10)){
grade = 'A';
}else if(arr[i] >= (maxScore - 20)){
grade = 'B';
}else if(arr[i] >= (maxScore - 30)){
grade = 'C';
}else{
grade = 'D';
}
System.out.println("Student" + i + "的成绩为" + arr[i] + "等级为" + grade);
}
}
}
03 多维数组的使用
Java 语言里提供了支持多维数组的语法。
如果说可以把一维数组当成几何中的线性图形,那么二维数组就相当于是一个表格,像下图Excel中的表格一样。
对于二维数组的理解,我们可以看成是一维数组array1又作为另一个一维数组 array2 的元素而存
在。其实, 从数组底层的运行机制来看,其实没有多维数组。
3.1 二维数组的使用
二维数组的声明和初始化
public class Array {
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,9}};
// 二维数组 动态初始化1
int[][] arr2 = new int[3][3];
// 动态初始化2
String[][] arr3 = new String[3][];
// int arr2[][] = new int[3][3]; 也是正确的
}
}
调用二维数组指定位置元素
int[][] arr1 = new arr[][]{{1,2,3},{4,5},{6,7,8};
String[][] arr2 = new arr[2][3];
String[][] arr3 = new arr[3][];
System.out.println(arr1[0][1]); //2
System.out.println(arr2[1][1]); //null
arr3[1] = new String[4]; //定义arr3的[1]为长度为4的字符数组
System.out.println(arr3[1][0]); //没有上句,会报错--->空指针
获取数组长度
System.out.println(arr1.length); // 3
System.out.println(arr1[0].length); // 3
System.out.println(arr1[1].length); // 2
遍历二维数组
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();
默认初始化值
/*
二维数组的使用:
规定:二维数组分为外层数组的元素,内层数组的元素
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 ErWeiArray {
public static void main(String[] args){
int[][] arr = new int[4][3];
System.out.println(arr[0]); // 这里输出是地址值 [I@776ec8df
System.out.println(arr[0][0]); // 0
System.out.println(arr); //[[I@4eec7777 二维数组 int型
double[][] arr3 = new double[4][];
System.out.println(arr3[1]); //null
// System.out.println(arr3[1][0]); //报错 空指针异常
}
}
二维数组内存解析
04 数组练习
练习1
/*
获取arr 数组中所有元素的和 。
*/
public class LianXi {
public static void main(String[] args){
// 动态初始化 但应该选择静态初始化
int[][] arr = new int[3][];
arr[0] = new int[]{3,5,8};
arr[1] = new int[]{12,9};
arr[2] = new int[4];
arr[2][0] = 7;
arr[2][1] = 0;
arr[2][2] = 6;
arr[2][3] = 4;
// 求和
int sum = 0;
for (int i = 0; i < arr.length; i++){
for (int j = 0; j < arr[i].length; j++){
sum += arr[i][j];
}
}
System.out.println(sum);
}
}
练习2
这里声明的变量: x为一维数组,y为二维数组
这里是组合了int[] x;int[] y[];
练习3 打印10行杨辉三角
/*
1.
第一行有 1 个元素 , 第 n 行有 n 个元素
2.每一行的第一个元素和最后一个元素都是 1
3.从第三行开始 , 对于非第一个元素和最后一个元素的 元素。即:
yanghui[i][j] = yanghui[i 1][j 1] + yanghui[i 1][j];
*/
public class YangHuiSanJiao {
public static void main(String[] args){
int[][] yanghui = new int[10][];
for (int i = 0; i < yanghui.length ; i++ ){
yanghui[i] = new int[i+1]; // 初始化内部数组
for(int j = 0 ; j < yanghui[i].length; j++){
if(j == 0 || j == i) { // 确定首尾的值为1
yanghui[i][j] = 1;
} else{
yanghui[i][j] = yanghui[i - 1][j - 1] + yanghui[i - 1][j];
}
}
}
// 遍历数组并输出
for(int i = 0; i < yanghui.length; i++) {
for (int j = 0; j < yanghui[i].length; j++) {
System.out.print(yanghui[i][j] + " ");
}
System.out.println();
}
}
}
05 数组面试题
package Matrix;
/*
创建一个长度为 6 的 int 型数组,要求数组元素的值都在 1 30 之间,且是随机赋值。同时,要求
元素值各不相同
*/
public class ArrayBiShiTi {
public static void main(String[] args){
int[] arr = new int[6];
for (int i = 0; i < arr.length; i++){
arr[i] = (int)(Math.random() * 30 + 1);// 随机赋值保证在1-30之间
boolean isFlag = false;
while(true){ // 如果有相等的数就需要一直重新赋值
for(int j = 0; j < i; j++){
if(arr[i] == arr[j]){
isFlag = true;
break; //遇到相等的数直接跳出循环 进行赋值操作
}
if (isFlag){
arr[j] = (int)(Math.random() * 30 + 1);
isFlag = false;
continue; //重新赋值后进行新一轮循环
}
}
break; // 用于满足条件后退出循环
}
}
for(int i = 0; i < 6; i++){
System.out.println(arr[i]);
}
}
}
方法二
public class ShuZuMianshi {
public static void main(String[] args) {
int[] arr2 = new int[6];
for (int i = 0; i < arr2.length; i++) {
arr2[i] = (int) (Math.random() * 30) + 1; // 对数组元素进行赋值
for (int j = 0; j < i; j++) {
if (arr2[i] == arr2[j]) { // 判断是否有相等数值
i--; // 如果有,i-1 重新进行循环赋值
break;
}
}
}
for (int i = 0; i < arr2.length; i++) {
System.out.println(arr2[i]);
}
}
}