数组

2016.07.24

数组

数组的概念

  • 数组,是多个相同类型数据按照一定顺序排列的集合,并使用一个名字命名,通过编号的方式对这些数据进行统一管理。
  • 数组的常见概念
    • 数组名
    • 下标(索引)
    • 元素
    • 数组的长度

数组的特点

  1. 数组是有序排列的。
  2. 数组本身是引用数据类型的变量,数组的元素可以是任何类型
  3. 创建数组对象会在内存中是一块连续的空间。
  4. 数组的长度一旦确定,就不能修改。

数组的分类

  1. 按照维数:一维数组、二维数组。。。
  2. 按照元素的类型:
    • 基本数据类型的数组
    • 引用数据类型的数组

一维数组

数组的声明与初始化

格式

静态初始化

  数据类型[] 变量名 = 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] = "刘琦";

获取数组的长度

  • 通过llenght获取数组的长度
  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]);
		}

数组的默认初始化值

  1. 基本数据类型:
    • 整数类型默认值: 0
    • 浮点型默认值: 0.0
    • 布尔类型默认值: false
    • char类型默认值: '\u0000' 或者 asc码值的0
  2. 引用数据类型:Null

一维数组在内存中的图解

JVM虚拟机的内存简单结构

20200724135910

  1. 栈:stack,用来存放局部变量
  2. 堆:用来存放new出来的内容,比如类、数组
  3. 方法区:
    1. 常量池
    2. 静态域

创建数组实例内存图解

		int[] arr01 = new int[]{1,2,3,4,5};
		String[] arr02 = new String[4];
		arr02[1] = "张三";
		arr02[2] = "李四";
		arr02 = new String[2];

20200724141312

实例

从键盘读入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");
			}
		}
	}
}

20200724151537

二维数组

  • 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]);
	}
}

20200724163945

实例

打印杨辉三角前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问题

  1. 写出一维数组初始化的两种方式
    • 静态初始化:数据类型[] 变量名 = new 数据类型[]{值,值,值};
    • 动态初始化:数据类型[] 变量名 = new 数据类型[数量];
    • 数组一旦初始化,长度就确定了.在内存中是一段连续的空间。
  2. 写出二维数组初始化的两种方式
    • 静态初始化:数据类型[][] 变量名 = new 数据类型[][]{{值,值},{值},{值,值,值}};
    • 动态初始化1:数据类型[][] 变量名 = new 数据类型[数量][数量];
    • 动态初始化2:数据类型[][] 变量名 = new 数据类型[数量][];
  3. 如何遍历如下的二维数组
    	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();
    	}
    
  4. 不同类型的一维数组的默认初始化值是多少;
    • 整数类型:0
    • 浮点类型:0.0
    • 布尔类型:false
    • char类型:'\u0000' 或者asc码的0
    • 引用数据类型:null
  5. 一维数组的内存解析