zoukankan      html  css  js  c++  java
  • Java SE入门(三)——数组和内存分配

    iwehdio的博客园:https://www.cnblogs.com/iwehdio/

    1、数组

    存储多个变量(元素)的容器

    • 多个变量的数据类型要一致
    • 定义类型
    //格式1:数据类型[] 数组名;
    int[] arr;
    //格式2:数据类型 数组名[] ;
    int arr[];
    
    • 数组初始化,为数组分配内存空间,并为数组中的每个元素赋初值
      • 动态初始化:只给出长度,由系统给出初始化值
      • 静态初始化:给出初始化值,由系统决定长度
    //方法1:动态初始化
    //数据类型[] 数组名 = new int[数组长度];
    int[] arr1 = new int[length];    //length为数组长度,元素个数
    
    //方法2:静态初始化
    //数据类型[] 数组名 = new 数据类型[]{元素1,元素2,...};
    //简化写法:数据类型[] 数组名 = {元素1,元素2,...};
    int[] arr2 = new int[]{1, 2, 3};
    int[] arr3 = {1, 2, 3};
    
    • 数组元素访问

      • 直接输出的是地址值
      • 数组中元素的索引从0到数组长度-1
      • 访问格式 数组名[索引]
      • 获取数组长度格式,数据名.length,int len = arr.length;
    • 数组索引越界,访问了不存在的索引

    • 数组是一种引用类型(还包括类和接口等),变量可以赋值给引用类型

    • 空指针异常,数组已经不再指向堆内存的数据,但还用数组名去访问元素(比如访问前有arr = null;,arr不再指向原来的数组地址)

    • 二维数组:元素是一维数组的数组

      • 定义格式

        //定义格式
        //方法1:数据类型[][] 数组名;
        //方法2:数据类型 数组名 [][];
        //方法3:数据类型[] 数组名[];
        
        //动态初始化
        //数据类型[][] 数组名 = new 数据类型[m][n];
        //m是二维数组中一维数组的个数,n是一维数组中的元素个数
        
        //静态初始化
        //数据类型[][] 数组名 = new 数据类型[][]{{元素...},{元素...},...};
        //数据类型[][] 数组名 = {{元素...},{元素...},...};
        
        int[][] arr = {{1,2,3},{4,5,6},{7,8,9}};
        
        //索引格式(第p个数组中的第q个元素):数组名[p][q];
        System.out.println(arr[2][2]);
        
      • 遍历

        //二维数组.length;获取的是二维数组中有几个二维数组
        for(int i=0; i<arr.length;i++){
            for(int j=0;j<arr[i].length;j++){
            	System.out.println(arr[i][j]);
        	}
        }
        
      • 输出在同一行用System.out.print();

      • ln就代表换行,只有System.out.println();就是输出一个换行

    2、Java内存分配

    • 栈(存储局部变量)

      • 局部变量就是定义在方法中的变量
      • 使用完毕立即被回收
    • 堆(存储new出来的东西即对象)

      • 每个对象都有地址值
      • 每个对象的数据都有默认值
        • byte, short, int ,long > 0
        • float, double > 0.0
        • char > 'u0000'
        • boolean > false
        • 引用类型 > null
      • 使用完毕后,会在垃圾回收器空闲的时候被回收
    • 方法区(面向对象)

    • 本地方法区(与系统相关)

    • 寄存器(给CPU使用)

    • 一个数组的内存表示 int[] arr = new int[3];

      • 栈中存储的是变量 int[] arr
      • 堆中存储的是对象 new int[3],内存地址是001,堆中根据索引 0、1、2 在该内存地址下分配给数组的三个元素三块内存
      • 栈存储的变量通过指向内存地址001找到数组对象new int[3],再通过索引找到数组下的元素
    • 两个数组指向同一个地址

      • 把第二个数组指向第一个数组的地址int[] arr2 = arr;
      • 更改第二个数组的值arr[0] = 1;
      • 两个数组指向的是堆中的同一个数组,指向同一个地址,通过任何一个数组赋值都会改变内存中的值,从而同时改变两个数组的值

    iwehdio的博客园:https://www.cnblogs.com/iwehdio/

  • 相关阅读:
    (转载)SAPI 包含sphelper.h编译错误解决方案
    C++11标准的智能指针、野指针、内存泄露的理解(日后还会补充,先浅谈自己的理解)
    504. Base 7(LeetCode)
    242. Valid Anagram(LeetCode)
    169. Majority Element(LeetCode)
    100. Same Tree(LeetCode)
    171. Excel Sheet Column Number(LeetCode)
    168. Excel Sheet Column Title(LeetCode)
    122.Best Time to Buy and Sell Stock II(LeetCode)
    404. Sum of Left Leaves(LeetCode)
  • 原文地址:https://www.cnblogs.com/iwehdio/p/12193858.html
Copyright © 2011-2022 走看看