数组
数组的概念
- 数组,是多个相同类型数据按照一定顺序排列的集合,并使用一个名字命名,通过编号的方式对这些数据进行统一管理。
- 数组的常见概念
- 数组名
- 下标(索引)
- 元素
- 数组的长度
数组的特点
- 数组是有序排列的。
- 数组本身是引用数据类型的变量,数组的元素可以是任何类型。
- 创建数组对象会在内存中是一块连续的空间。
- 数组的长度一旦确定,就不能修改。
数组的分类
- 按照维数:一维数组、二维数组。。。
- 按照元素的类型:
- 基本数据类型的数组
- 引用数据类型的数组
一维数组
数组的声明与初始化
格式
静态初始化
数据类型[] 变量名 = new 数据类型[]{值,值,值,值};
int[] ids = new int[] {1001,1002,1003,1004};
静态初始化数组:数组的初始化和赋值同时进行
动态初始化
数据类型[] 变量名 = new 数据类型[个数];
String[] names = new String[5];
动态初始化数组:数组的初始化和赋值分开进行
数组一旦初始化完成,数组长度就确定了。
调用指定位置的元素
赋值格式
数据类型[] 变量名 = new 数据类型[个数];
变量名[索引] = 值;
获取格式
数据类型[] 变量名 = new 数据类型[个数];
数据类型 变量名2 = 变量名[索引];
举例
names[0] = "张三";
names[1] = "李四";
names[2] = "王五";
names[3] = "赵六";
names[4] = "刘琦";
获取数组的长度
- 通过l
lenght
获取数组的长度
System.out.println("names的长度:"+names.length);
遍历数组
- 将数组所有的数据打印出来,可以使用
索引+for循环
的方式
String[] names = new String[5];
names[0] = "张三";
names[1] = "李四";
names[2] = "王五";
names[3] = "赵六";
names[4] = "刘琦";
for (int i = 0; i < names.length; i++) {
System.out.println(names[i]);
}
数组的默认初始化值
- 基本数据类型:
- 整数类型默认值: 0
- 浮点型默认值: 0.0
- 布尔类型默认值: false
- char类型默认值: '\u0000' 或者 asc码值的0
- 引用数据类型:Null
一维数组在内存中的图解
JVM虚拟机的内存简单结构
- 栈:stack,用来存放局部变量
- 堆:用来存放new出来的内容,比如类、数组
- 方法区:
- 常量池
- 静态域
创建数组实例内存图解
int[] arr01 = new int[]{1,2,3,4,5};
String[] arr02 = new String[4];
arr02[1] = "张三";
arr02[2] = "李四";
arr02 = new String[2];
实例
从键盘读入5个学生的成绩,找出最高人数,并输入学生成绩等级。
import java.util.Scanner;
public class ArrayExer {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int[] result = new int[5];
int max = 0;
for (int i = 0; i < 5; i++) {
System.out.print("请输入第" + (i + 1) + "名学生的成绩:");
int input = scan.nextInt();
result[i] = input;
max = (max > input) ? max : input;
}
System.out.println("成绩最高分:" + max);
for (int i = 0; i < result.length; i++) {
int data = result[i];
if(data>=(max-10)) {
System.out.println("student "+ i + " score is "+ data + " grade is A");
}else if(data>=(max-20)) {
System.out.println("student "+ i + " score is "+ data + " grade is B");
}else if(data>=(max-30)) {
System.out.println("student "+ i + " score is "+ data + " grade is C");
}else {
System.out.println("student "+ i + " score is "+ data + " grade is D");
}
}
}
}
二维数组
- Java语言里提供了支持多维数组的语法。
- 从数组底层的运行机制来看,其实没有多维数组。
声明与初始化
静态初始化
格式
数据类型[][] 变量名 = new 数据类型[][]{{值,值},{值,值,值}};
// 二维数静态态初始化
int[][] arr02 = new int[][] { { 1, 2 }, { 1 }, { 1, 2, 3 } };
动态初始化
格式1
数据类型[][] 变量名 = new 数据类型[外层数量][内层数量];
格式2
数据类型[][] 变量名 = new 数据类型[外层数量][];
// 二维数组动态初始化1
String[][] arrStr = new String[3][2];
//// 二维数组动态初始化2
String[][] arrStr2 = new String[3][];
调用数组指定位置的元素
int[][] arr02 = new int[][] { { 1, 2 }, { 1 }, { 1, 2, 3 } };
//调用数组指定位置的元素
System.out.println(arr02[0][1]);//2
System.out.println(arr02[0]);//内层数组的地址值[I@2d363fb3
String[][] arrStr = new String[3][2];
System.out.println(arrStr[2][1]);//null
System.out.println(arrStr[2]);//内层的地址[Ljava.lang.String;@7d6f77cc
String[][] arrStr2 = new String[3][];
System.out.println(arrStr2[2]);//null
//System.out.println(arrStr2[2][1]);// java.lang.NullPointerException
arrStr2[0] = new String[2];
arrStr2[0][1] = "HAHA";
System.out.println(arrStr2[0][1]);
获取二位数组的长度
//获取二维数组的长度
System.out.println(arr02.length);//获取外层长度
System.out.println(arr02[0].length);//获取内层长度
二维数组的遍历
几维数组就用几层for循环
int[][] arr02 = new int[][] { { 1, 2 }, { 1 }, { 1, 2, 3 } };
//遍历
for (int i = 0; i < arr02.length; i++) {
for (int j = 0; j < arr02[i].length; j++) {
System.out.print(arr02[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
* 内层元素的初始化值为:不能调用,否则报错。
//初始数值
int[][] a1 = new int[2][2];
System.out.println(a1[1]);//地址值
System.out.println(a1[1][1]);//0
String[][] s1 = new String[2][];
System.out.println(s1[1]);//null
System.out.println(s1[1][1]);//报错 java.lang.NullPointerException
内存结构图解
图解如下内存结构
public class ArrayTest3 {
public static void main(String[] args) {
int[][] arr = new int[3][];
arr[1] = new int[] { 1, 2, 3 };
arr[2] = new int[2];
arr[2][1] = 10;
System.out.println(arr[2][0]);
System.out.println(arr[2][1]);
}
}
实例
打印杨辉三角前10行内容
package com.eachwang.www.java;
public class YangHuiTest {
public static void main(String[] args) {
// 初始化
int[][] arr = new int[10][];
// 赋值
for (int i = 0; i < arr.length; i++) {
arr[i] = new int[(i + 1)];
// 收尾赋值1
arr[i][0] = arr[i][i] = 1;
// 中间赋值
for (int j = 1; j < arr[i].length - 1; j++) {// 从第二个值开始,到导数第二个值
arr[i][j] = arr[i - 1][j] + arr[i - 1][j - 1];
}
}
// 输出
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
System.out.print(arr[i][j] + "\t");
}
System.out.println();
}
}
}
DAY06问题
- 写出一维数组初始化的两种方式
- 静态初始化:数据类型[] 变量名 = new 数据类型[]{值,值,值};
- 动态初始化:数据类型[] 变量名 = new 数据类型[数量];
- 数组一旦初始化,长度就确定了.在内存中是一段连续的空间。
- 写出二维数组初始化的两种方式
- 静态初始化:数据类型[][] 变量名 = new 数据类型[][]{{值,值},{值},{值,值,值}};
- 动态初始化1:数据类型[][] 变量名 = new 数据类型[数量][数量];
- 动态初始化2:数据类型[][] 变量名 = new 数据类型[数量][];
- 如何遍历如下的二维数组
int[][] arr = new int[][]{{1,2,3},{4,5},{6,7,8}};
for(int i = 0 ; i < arr.length; i++){ for(int j = 0 ; j < arr[i].length ; j ++){ System.out.print(arr[i][j] + ""); } System.out.println(); }
- 不同类型的一维数组的默认初始化值是多少;
- 整数类型:0
- 浮点类型:0.0
- 布尔类型:false
- char类型:'\u0000' 或者asc码的0
- 引用数据类型:null
- 一维数组的内存解析