美文网首页
Day07_数组_内存图

Day07_数组_内存图

作者: 蹦蹦跶跶的起床啊 | 来源:发表于2020-02-16 23:18 被阅读0次

    数组的定义和访问

    容器概述

    变量中,只能储存一个数据,新的数据进来,老的数据会被替换,如果存储多个数据,需要使用容器
    具有类别性, 具有容量固定性

    数组概述

    • java中的容器就是数组.可以存储多个数据, 但是多个数据的类型必须保持一致.
    • 特点:
    1. 可以存储多个数据
    2. 多个数据的类型必须保持一致.\
    3. 数组的长度(数组中可以存储元素的数量)一旦确定,就不可以发生改变.
    • 数组是一个引用类型,
    • 数组容器变量的定义格式
      数组是一个容器, 数组变量是给该容器起名字的,通过名字方便找到容器.
      如通过门牌号,找到教室
    1. 格式一(最好)
      数组存储的数据类型[] 数组名字;
    2. 格式二
      数组存储的数据类型 数组名字[];
    • 引用类型变量
      这种变量存储的不是普通的数据值,而是内存中的地址值,
      如数组
      当int[] array; 来定义一个数组变量, 其实 array变量中存储的是 创建array数组所对应的地址值.(就如同是产生了门牌号)

    图中箭头左边,相当于int[] array(门牌号)
    箭头右边, 相当于new array(创建了一间教室)
    箭头相当于 =

    数组的初始化

    • 方式一 数组的动态初始化
    1. 格式

    数组存储的数据类型[] 数组名字 = new 数组存储的数据类型[长度];
    int[] arr = new int[3];

    1. 格式的解释
    1. 数组存储的数据类型: 创建的数组容器可以存储什么数据类型。
    2. [] : 表示数组。
    3. 数组名字:为定义的数组起个变量名,满足标识符规范,可以使用名字操作数组。
    4. new:关键字,创建数组使用的关键字。就是为数组容器开辟内存空间的
    5. 数组存储的数据类型: 创建的数组容器可以存储什么数据类型。(左右两侧数据类型要一致)
    6. [长度]:数组的长度,表示数组容器中可以存储多少个元素。
      注意:数组有定长特性,长度一旦指定,不可更改。
      真正的数组是 = 右侧. 左侧只是给数组起的变量名
    • 方式二 数组的静态初始化
    1. 格式

    标准格式:
    数据类型[] 数组名 = new 数据类型[]{元素1,元素2,元素3...};
    右侧[]中的数字可以省略,会根据后侧元素数量,自动补充
    = 的左侧:教室的门牌号
    = 的右侧:创建了一间教室,并放置多个学生

    • 方式三 数组的简化静态初始化(推荐)

    数据类型[] 数组名 ={元素1,元素2,元素3...};

    右侧的 new 数组名[] 省略了
    注意:
    (1). 数组长度,根据{}中的元素计算出来
    (2). 虽然没有写new,但是底层仍然有new的过程
    (3). 动态初始化/标准静态初始化可以分为两步完成如同刚开始学的变量赋值一样
    也可以进行重新赋值(但是定义的数组类型不得改变)
    (4). 简化静态初始化方式,不可以分为两步完成

    float[] arrA;
    arrA = new float[3];
    arrA = new float[30];
    int[] arrB;
    arrB =  new int[]{10,20};
    arrB= new int[]{100,200,300}
    

    数组的访问

    • 简化格式静态初始化数组的使用
    1. 数组名: 代表数组容器在内存空间的地址值,是一个十六进制的数据
    2. 数组中的每个元素都有一个唯一的编号: 称为索引, 但是索引编号从0开始,索引编号的最大值为数组长度-1.

    int[] array = {10, 20, 30};
    System.out.println(array);
    //[I@6e8dacdf I 表示int类型 @ 如同微信中的@某人 后边儿跟的是array的地址值(是一个16进制的数据)

    1. 数组元素的访问:
      数组名[索引编号]
      array[2]: 数组array中索引编号为2的元素
    2. 获取数组的长度
      int size = 数组名称.length;
      注意
      array.length; length是数组的属性,并不是一个方法所以不要加();
      array.length 是一个int类型的值,所以用int 类型变量来接收
      如:int size = array.length
    • 动态初始化的使用
      注意
    1. 动态初始化数组,元素有默认值

    基本类型:
    整数:byte/shor/int/long: 默认值都为0
    小数:float/double 默认值为0.0
    布尔:boolean 默认值为false
    字符:char 默认值为空白字符
    引用类型:默认值都为null

    数组原理内存图

    内存概述

    内存是计算机中的重要原件,临时存储区域,作用是运行程序。我们编写的程序是存放在硬盘中的,在硬盘中的程序是不会
    运行的,必须放进内存中才能运行,运行完毕后会清空内存。
    Java虚拟机要运行程序,必须要对内存进行空间的分配和管理。

    Java虚拟机的内存划分

    寄存器 给CPU使用,线程运行相关,和我们开发无关。
    本地方法栈 JVM在使用操作系统功能的时候使用,用来存储系统函数相关的内容,和我们开发无关。
    方法区 存储可以运行的class文件(字节码文件),运行时常量池,静态成员.是在内存中运行.class文件的地方, 没使用的时候,就是在硬盘中

    方法栈 所有方法运行时使用的内存,比如main方法运行,进入方法栈中执行。
    栈内存: 运行方法/存储局部变量
    堆内存 存储对象或者数组,new来创建的,都存储在堆内存。

    当堆内存中的数组不再被使用的时候, 就会被垃圾回收器回收

    注意
    画内存图,只需要用到方法栈和堆内存

    数组在内存中的存储

    一个数组的内存图


    两个数组的内存图


    两个变量指向一个数组

    数组操作的常见问题

    数组越界异常

    ArrayIndexOutOfBoundsException
    解决方法:
    找到数组索引越界的地方,进行修改

    数组空指针异常

    原因 赋值给array 为null值时, 就会出现空指针情况


    求三个数的最大值

    思路

    1. 假定某个变量的值最大, 保存到int类型的max中
    2. 用其余两个变量和max进行比较, 只要其余两个变量的值大于max, 就对max进行重新赋值
            int a = 10 ,b =20,c=30;
            int max = a ;
            if (b > max) {
                max= b;
            }
            if (c > max) {
                max =c;
            }
            System.out.println(max);
    

    数组中需要用到遍历

            int[] array = {10, 20, 33, 22, 29};
    
            int max = array[0];
            //遍历元素,并进行比较大小,并把比较打的赋值给max
            for (int i=1;i < array.length;i++){
                if (array[i] > max) {
                    max = array[i];
                }
            }
            System.out.println("最大值为:"+max);
    

    相关文章

      网友评论

          本文标题:Day07_数组_内存图

          本文链接:https://www.haomeiwen.com/subject/rjfpfhtx.html