数组原理和内存图解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数组原理和内存图解相关的知识,希望对你有一定的参考价值。

数组原理内存图理解

?   内存

?       内存是计算机中一个很重要的原件,临时存储区域,作用是当程序运行过中,
我们编写的程序文件存放在硬盘当中,硬盘当中的程序文件不会运行,存放
到内存当中,当程序运行完毕后程序会清空内存。

?   Java虚拟机当中的内存划分

?       为了提高效率,就对内存空间进行不同区域的划分,每一篇区域都有特定的处理数据方式和内存管理方式
区域名称 作用
寄存器 给cpu使用,和我们开法没有关系
本地方法栈 JVM在使用操作系统功能使用的,和我们的开发没有关系
方法区 存储可以运行的class文件(常量池,静态域)
方法栈(stack) 方法运行时使用的内存,比如说main方法运行,进行方法栈当中运行,(局部变量)
堆内存(heap) 存储对象或者数组,new出来的对象,都存储在堆内存当中
数组在内存当中的存储

?   一个数组的内存存储       
public static void main(String[]args){
        int [] arr=new int [3];
        System.out.println(arr);
    }
}

技术图片

程序的执行流程:

    main方法进入方法栈中执行
    创建数组,JVM会在堆内存当中开辟空间,存储数组
    数组在内存当中会有自己的内存地址,以16进制表示
    数组当中有三个元素,默认值为0
    JVM将数组的内存地址赋值给引用类型变量arr
    变量arr保存的数组时在内存当中的地址,而不是一个具体的数值。
?   两个数组的内存分析图解
public static void main(String[]args){
        int [] arr =new int [3];
        int [] arr2 =new int [2];
        System.out.println(arr);
        System.out.println(arr2);
    }
}

技术图片
两个变量同时指向同一个数组

public static void main(String[]args){
        //定义一个数组,动态初始化
        int [] arr =new int [3];
        //通过索引访问数组当中的元素
        arr[0]=10;
        arr[1]=10;
        arr[2]=10;
        //查看元素
        System.out.println(arr[1]);//10
        //定义一个数组,将上一个数组赋值该数组
        int [] arr2=arr;
        arr2[1] =50;
        //查看元素
        System.out.println(arr[1]);//50
    }
}

技术图片

数组的常见操作

public static void main(String[]args){
        //定义一个数组,动态初始化
        int [] arr =new int [5];
        //访问索引值为5的数组元素
        System.out.println(arr[5]);
        //java.long.ArrayIndexOutOfBounds.java  数组下表越界异常
        //数组的索引时从0开始的,最大索引是arr.length-1
        //如果访问元素时,索引不在该区间中,程序就会抛出数组越界异常。
    }
}

数组空指针异常

public static void main(String[]args){
    //动态初始化一个数组
    int arr new int[3];
    arr=null;
    //查看arr数组元素
    System.out.println(arr[2]);ava.
    //java.ArrayNu11PointerException 空指针异常
    //数组空指针异常,就是程序运行过程中,有一个内存中有一个不存在的一个变量被引用到了
}

数组遍历【重点】

//数组遍历:就是将数组中的每一个元素分别获取取来,就是遍历,
//遍历使我们操作数组的核心和重点内容。
public static void main(String[]args){
    //静态初始化一个数组
    int[] arr={1,2,3};
    System.out.println(arr[0]);
    System.out.println(arr[1]);
    System.out.println(arr[2]);
/*
数组的索引依此递增,递增到arr.length-1为止,引入循环结构
    代码优化:
*/
    for(int i=0;i<arr.lenght;i++){//遍历容器的时候,初始化语句中的循环变量一般都是索引值
        System.out.print(arr[i]);
    }

}

获取数组中的最大值

最大值:从数组的所有元素中找到最大值。
    思路:
    1.定义一个最变量,保存数组当中的第一个元素,
    2.遍历数组,获取数组当中的每一个元素。
    3.将遍历的元素和保存的最大变量进行比较。
    4.如果数组元素的大于最大值变量,就是把元素赋值给最大值变量。
    5.数组遍历结束,最大值变量保存的就是数组当中的最大值。’
    public static void main(String[]args){
    //静态初始化一个数组容器
    int []arr={45,12,74,45,6,100,45};
    int max =arr[o];
    for(int i=1;i<arr.lenght;i++){
        //将遍历的元素和保存的最大变量进行比较
        if(arr[i]>max){
            //如果数组元素的大于max就交换为位置
            max=arr[i];
        }
    }
    //数组遍历结束,最大变量保存的变量就是数组当中的最大值
    System.out.println("数组最大值为"+max);
}

以上是关于数组原理和内存图解的主要内容,如果未能解决你的问题,请参考以下文章

《算法图解》之选择排序

算法图解第二章—选择排序

JAVA-初步认识-第四章-内存图解

Java中数组在内存中的图解

算法图解之数组和链表

JAVA-初步认识-第六章-二维数组-定义方式内存图解