• 【疯狂Java】数组


     1、一维数组

    (1)初始化

    ①静态初始化:只指定元素,不指定长度

    new 类型[] {元素1,元素2,...}

    1. int[] intArr;
    2. intArr = new int[] {5,6,7,8};
    ②动态初始化:只指定长度,不指定元素

    new 类型[数组长度

    int[] princes = new int[5];

    【注意】

    - 如果数组元素的类型是基本类型中的整数类型(byte、short、int和long),则数组元素的值为0

    - 如果数组元素的类型是基本类型中的浮点类型(float、double),则数组元素的值为0.0

    - 如果数组元素的类型是基本类型中的字符类型(char),则数组元素的值为'\u0000'

    - 如果数组元素的类型是基本类型中的布尔类型(boolean),则数组元素的值为false

    - 如果数组元素的类型是引用类型(类、接口和数组),则数组元素的值为null

    (2)使用数组

    ①length

    该属性返回数组的长度

    ②访问数组元素

    索引从0开始,最后一个元素的索引是length-1

    使用的元素超出数组长度,就会导致ArrayIndexOutOfBoundsException(数组索引越界异常)

    ③遍历数组

    ④foreach循环遍历数组

    数组有几个元素,该循环就执行几次,变量会自动、依次等于每个元素

    foreach循环只能访问数组元素的值,不能修改数组元素的值。

    1. for(元素类型 变量名 : 数组名)
    2. {
    3. //可通过变量名访问每个元素
    4. }
    1. int[] iArr = new int[] {20,30,40,50};
    2. for (int it : iArr) {
    3. System.out.println(it);
    4. }

    建议:永远不要在foreach循环中修改循环计算器的值

    (3)深入理解数组

    【Java程序,必须要使用虚拟机Virtual Machine(有些地方也称之为JVM)才能运行】

    Java程序的内存可分为:

    ①堆(heap)内存:Java虚拟机启动时分配的一块永久的、很大的内存区。堆内存只有一块。

    堆内存中对象,如果没有引用变量指向它,那么它就会变成垃圾,等待VM的垃圾回收器来回收。

    1. public class 内存中的数组 {
    2. public static void main(String[] args) {
    3. //分配800个字节
    4. long[] arr = new long[100];
    5. arr[99] = 33;
    6. System.out.println(arr[99]);
    7. }
    8. }

    由于long数组需要分配800个字节,而虚拟机只有258个字节,所以报错“初始堆内存给的太少了”

    ②栈(stack)内存:每次方法运行分配一块临时、很小的内存区。每个方法都有自己对应的栈区,方法结束时,对应的栈区就会被回收。

    - 在方法中定义的、局部变量(不管是什么类型),都放入对应的方法栈区。

    - new出来的对象,都放在堆内存。

    引用类型的变量是变量,对象是对象,两者是不同的东西。

    例如:

    int[] iArr = new int[4];

    iArr存在栈内存中,new出来的int[4]存在堆内存中。

    【变量赋值的区别】

    - 基本类型的赋值:直接将该值存入变量所在内存。

    - 引用类型的赋值:将该对象所在第一个内存单元的编号(内存地址)存入变量。

    下面使用代码+图来演示:

    1. public class 内存中的数组 {
    2. public static void main(String[] args) {
    3. //基本类型的赋值
    4. int it = 20; //4个字节
    5. //iArr在栈内存,new出来的数组对象在堆内存
    6. int[] iArr = new int[4]; //数组占16个字节
    7. }
    8. }

    1. public class 内存中的数组 {
    2. public static void main(String[] args) {
    3. //基本类型的赋值
    4. int it = 20; //4个字节
    5. //iArr在栈内存,new出来的数组对象在堆内存
    6. int[] iArr = new int[4]; //数组占16个字节
    7. System.out.println(iArr.length);
    8. //再次对引用变量赋值,让iArr重新指向一个新的数组
    9. iArr = new int[] {20,10};
    10. System.out.println(iArr.length);
    11. }
    12. }

     

    【验证自己是否真的理解基本类型和引用类型】

    阅读一下代码,说出每个输出语句的输出结果。

    1. public class 基本类型和引用类型 {
    2. public static void main(String[] args) {
    3. int a = 20;
    4. int b = a;
    5. System.out.println("a:" + a);
    6. System.out.println("b:" + b);
    7. b = 13;
    8. System.out.println("a:" + a);
    9. System.out.println("b:" + b);
    10. int[] arr = new int[] {20};
    11. int[] brr = arr;
    12. System.out.println("arr[0]:" + arr[0]);
    13. System.out.println("brr[0]:" + brr[0]);
    14. brr[0] = 13;
    15. System.out.println("arr[0]:" + arr[0]);
    16. System.out.println("brr[0]:" + brr[0]);
    17. }
    18. }

    答案与解析:

    1. package day04;
    2. public class 基本类型和引用类型 {
    3. public static void main(String[] args) {
    4. int a = 20;
    5. int b = a;//基本类型赋值:直接将值存入变量所在的内存
    6. System.out.println("a:" + a);//20
    7. System.out.println("b:" + b);//20
    8. b = 13;//将13存入b所在的内存
    9. System.out.println("a:" + a);//20
    10. System.out.println("b:" + b);//13
    11. int[] arr = new int[] {20};//引用类型赋值:将该对象所在首地址存入变量
    12. int[] brr = arr;//引用类型赋值:将该对象所在首地址存入变量
    13. System.out.println("arr[0]:" + arr[0]);//20
    14. System.out.println("brr[0]:" + brr[0]);//20
    15. brr[0] = 13;
    16. System.out.println("arr[0]:" + arr[0]);//13
    17. System.out.println("brr[0]:" + brr[0]);//13
    18. }
    19. }

     2、没有多维数组

    其实只有一维数组,二维数组是假象。

    二维数组的本质:数组元素为一维数组的数组。

    (1)初始化

    ①静态初始化

    new 类型[]...[] {元素1,元素2,...}

    int[][] arr = new int[][]{{1,2,3},{4,5,6,7},{8,9,10,11}};

    ②动态初始化

    new 类型[数组长度]...[数组长度]

    int[][] arr = new int[5][];

     ③静态和动态混着用

    1. public class 二维数组静态初始化 {
    2. public static void main(String[] args) {
    3. //静态
    4. int[][] arr = new int[][] {
    5. new int[2],//元素用动态创建
    6. new int[3],
    7. new int[4]
    8. };
    9. System.out.println(arr.length);
    10. //静态
    11. int[][] brr = new int[][] {
    12. new int[] {1,2},//元素用静态创建
    13. new int[] {3,4,5},
    14. new int[] {6,7,8,9}
    15. };
    16. System.out.println(brr.length);
    17. //静态
    18. int[][] crr = new int[][] {
    19. new int[4],//元素用动态创建
    20. {1,2,3},//元素用静态的简化语法创建
    21. new int[3]//元素用动态创建
    22. };
    23. System.out.println(crr.length);
    24. }
    25. }

     ④二维数组简化初始化

    1. //创建一个长度为4的数组,其中每个元素都是动态初始化的长度为5的数组
    2. int[][] arr = new int[4][5];
    3. //相当于
    4. int[][] brr = new int[][] {
    5. new int[5],
    6. new int[5],
    7. new int[5],
    8. new int[5],
    9. new int[5],
    10. };

    (2)对数组元素赋值

    【常见错误】

    1. int[][] arr = new int[5][];
    2. //对数组元素赋值
    3. //arr[0]是数组元素,是int[]类型,20是int
    4. arr[0] = 20;

    (3)使用数组

    遍历

    1. int[][] arr = new int[][] {
    2. new int[2],//元素用动态创建
    3. new int[3],
    4. new int[4]
    5. };
    6. for (int i = 0; i < arr.length; i++) {
    7. //arr[i]是int[]类型
    8. int[] brr = arr[i];
    9. for (int j = 0; j < brr.length; j++) {
    10. System.out.print(brr[j] + "\t");
    11. }
    12. System.out.println();
    13. }

  • 相关阅读:
    Jmeter高效组织接口自动化用例
    Jenkins + Gitee 实现代码自动化构建 (超级详细)
    CALL命令无法在PowerShell中使用
    详细介绍百度ERNIE:通过知识集成增强表示
    js实现图片懒加载
    Chrome速度惊人,不到30天修复40个漏洞
    以一道面试题来探讨测试用例设计的六大思路
    python poetry的教程
    asp.net企业招聘管理系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio计算机毕业设计
    centos7 升级内核
  • 原文地址:https://blog.csdn.net/have_to_be/article/details/131772251