java虚拟机内存划分 java的数组类型

一,java虚拟机内存的划分

内存在计算机中是一个比较重要的原件,他为数据从硬盘传输到cup起到了承上启下的作用。我们编写的程序是放在硬盘中,要运行程序就要放在内存条中,程序运行结束后就会去空内存。

为了提高运行效率,java虚拟机运行程序时,对内存空间进行了分配和管理。

java虚拟机内存划分为:

寄存器        给cup使用,我们开发不用知道

本地方法栈      JVM在使用操作系统功能的时候使用,和开发无关

方法栈        存储可以运行的class文件

堆内存        存储对象或者数组, new来创建的,都存储在堆内存

方法栈        方法运行时使用的内存,比如main方法运行,进入方法栈中执行

 java数组的内存图:

二,数组定义及其操作

当我们要储存大量数据时,例如50个学生的考试成绩。这时我们用java的基本数据类型来储存这些数据时要定义50个,这样不仅麻烦,还造成内存的浪费。因此我们可以使用一种容器来进行储存。将所有成绩全部储存到一个容器中,统一操作。

容器:将多个数据存储到一起,期中的每个数据称为容器的元素。

java数组:在保持存储的数据的数据类型的一致的前提下,数组接收存储数据长度固定的容器。

(1)数组的定义(动态和静态)

1.动态初始化(指定长度):在创建数组的时候,直接指定数组当中的数据元素个数。

格式:  数组存储的数据类型 [ ] 数组名字  = new 数组存储的数据类型 [ 长度 ];

代码示例:

package cn.itcate.day4demo;


public class Demo01Array {
    public static void main(String[] args) {
        // 动态初始化
        int[] arrayA = new int[300];
        double[] arrayB = new double[10];
        String[] arrayC = new String[5];
    }
}

注意:

左侧数据类型:也就是数组当中保存的数据,全都是统一的什么类型
左侧的中括号:代表我是一个数组
左侧数组名称:给数组取一个名字
右侧的new:代表创建数组的动作
右侧数据类型:必须和左边的数据类型保持一致
右侧中括号的长度:也就是数组当中,到底可以保存多少个数据,是一个int数字

2,静态初始化(指定内容):在创建数组的时候,不直接指定数据个数多少,而是直接将具体的数据内容进行指定。

格式一:  数据类型 [ ]  数组名  = new 数据类型 [ ] {元素1,元素2,元素3...};

代码示例:

package cn.itcate.day4demo;

public class Demo02Array {
    public static void main(String[] args) {
        // 整数数组
        int[] arrayA = new int[] {1,2,3,4,5};
        // 字符串数组
        String[] arrayB = new String[] {"Hello", "World", "Python", "Java"};
        
    }
}

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

代码示例:

package cn.itcate.day4demo;

public class Demo03Array {
    public static void main(String[] args) {
        // 整数数组
        int[] arrayA = {1,2,3,4,5};
        // 字符串数组
        String[] arrayB = {"Hello", "World", "Java"};

    }
}

建议:如果不确定数组当中的具体内容,用动态初始化;否则,已经确定了具体的内容,用静态初始化。

(二),数组的访问

数组的索引:存储的到数组的数据都是从0开始自动编号的,这些编号就成为数组的索引。通过索引能访问到数组里面的元素。

格式: 数组名【索引值】

代码如下:

package cn.itcate.day4demo;

public class Demo04ArrayUse {
    public static void main(String[] args) {
        // 定义一个整数数组
        int[] arrayA = new int[] {10, 20, 30, 40, 50};
        System.out.println(arrayA);
        // 数组的索引
        System.out.println(arrayA[0]);// 10
        System.out.println(arrayA[1]);// 20
        System.out.println(arrayA[2]);//30
        System.out.println(arrayA[3]);//40
        System.out.println(arrayA[4]);//50
        // 将一个索引值赋值给一个变量
        int num = arrayA[2];
        System.out.println(num);// 20
    }
}

数组的长度属性: 数组名.length   -------》 得到最大索引值为:数组名.length-1

代码示例:

package cn.itcate.day4demo;

public class Demo05ArrayUse {
    public static void main(String[] args) {
        int[] arr = new  int[] {1, 2, 3, 4, 5};
        System.out.println(arr.length);// 5
    }
}

修改数组中的元素: 数组名[索引] = 数值


代码如下:

package cn.itcate.day4demo;

public class Demo06ArrayUse {
    public static void main(String[] args) {
        // 定义int类型数组
        int[] arr = {1, 2, 3, 4, 5};
        // 为0索引元素赋值为10
        System.out.println(arr[0]);
        arr[0] = 10;
        int i = arr[0];
        System.out.println(i);
        System.out.println(arr[0]);
    }

    
}

(三),数组的常见操作

3.1 数组越界异常

public static void main(String[] args) {
    int[] arr = {1,2,3};
    System.out.println(arr[3]);
}

 

创建数组,赋值3个元素,数组的索引就是0,1,2,没有3索引,因此我们不能访问数组中不存在的索引,程序运
行后,将会抛出 ArrayIndexOutOfBoundsException 数组越界异常。在开发中,数组的越界异常是不能出现的,一
旦出现了,就必须要修改我们编写的代码。

 

3.2 数组空指针异常

public static void main(String[] args) {
    int[] arr = {1,2,3};
    arr null;
    System.out.println(arr[0]);
}

arr = null 这行代码,意味着变量arr将不会在保存数组的内存地址,也就不允许再操作数组了,因此运行的时候
会抛出 NullPointerException 空指针异常。在开发中,数组的越界异常是不能出现的,一旦出现了,就必须要修
改我们编写的代码。

在内存中的表现:

3.3,数组遍历

数组遍历: 就是将数组中的每个元素分别获取出来,一个一个的进行处理,就是遍历

package cn.itcate.day4demo;

public class Demo07Array {
    public static void main(String[] args) {
        // 定义一个int类型的数组
        int[] arr = {12,34,54,64,64};
        // 遍历每一个元素
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }
}

3.4, 数组获取最大值元素

package cn.itcate.day4demo;

public class Demo08Array {
    public static void main(String[] args) {
        // 定义一个int类型的颜值数组
        int[] arr = {5, 15, 200, 10000, 100, 4000};
        int max = arr[0];
        // 遍历数组和max进行比较,优胜劣汰
        for (int i = 0; i < arr.length; i++){
            if (arr[i] > max) {
                max = arr[i];
            }
        }
        System.out.println(max);
    }
    
}

3.5, 数组的翻转

package cn.itcate.day4demo;

public class Demo09Array {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5};
        /*
        循环中定义变量min = 0最小索引
        max = arr.lenth-1 最大索引
        min++
        max--
         */
        for (int min = 0, max = arr.length -1; min <= max; min++, max--) {
        int temp = arr[min];
        arr[min] = arr[max];
        arr[max] = temp;

    }
    // 反转后,遍历数组
    for (int i = 0; i < arr.length; i++) {
        System.out.println(arr[i]);
    }
}
}
原文地址:https://www.cnblogs.com/xingyuyu/p/12257923.html