zoukankan      html  css  js  c++  java
  • Java基础语法:day05【Array 原理内存图】

    一、数组概念

    1、案例分析

    现在需要统计某公司员工的工资情况,例如计算平均工资、找到最高工资等。假设该公司有50名员工,用前面所学的知识,程序首先需要声明50个变量来分别记住每位员工的工资
    ,然后在进行操作,这样做会显得很麻烦,而且错误率也会很高。因此我们可以使用容器进行操作。将所有的数据全部存储到一个容器中,统一操作。

    2、容器概述

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

    生活中的容器: 水杯,衣柜,教室

    3、数组概念

    数组概念: 数组就是存储数据长度固定的容器,保证多个数据的数据类型要一致。

    4、数组的特点

    1. 数组是一种引用数据类型
    2. 数组当中的多个数据,类型必须统一
    3. 数组的长度在程序运行期间不可改变

    二、数组初始化

    数组的初始化:在内存当中创建一个数组,并且向其中赋予一些默认值。

    1、两种常见的初始化方式:

    1. 动态初始化(指定长度)
    2. 静态初始化(指定内容)

    2、动态初始化数组的格式:

    数据类型[] 数组名称 = new 数据类型[数组长度];

    示例代码

    解析含义:

    public class Demo01Array {
    
        public static void main(String[] args) {
            // 创建一个数组,里面可以存放300个int数据
            // 格式:数据类型[] 数组名称 = new 数据类型[数组长度];
            int[] arrayA = new int[300];
    
            // 创建一个数组,能存放10个double类型的数据
            double[] arrayB = new double[10];
    
            // 创建一个数组,能存放5个字符串
            String[] arrayC = new String[5];
        }
    
    }

    3、静态初始化基本格式:

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

    静态初始化基本格式:

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

    public class Demo02Array {
    
        public static void main(String[] args) {
            // 直接创建一个数组,里面装的全都是int数字,具体为:5、15、25
            int[] arrayA = new int[] { 5, 15, 25, 40 };
    
            // 创建一个数组,用来装字符串:"Hello"、"World"、"Java"
            String[] arrayB = new String[] { "Hello", "World", "Java" };
        }
    
    }
    

    注意事项:虽然静态初始化没有直接告诉长度,但是根据大括号里面的元素具体内容,也可以自动推算出来长度。

    4、使用静态初始化数组的时候,格式还可以省略一下

    标准格式:

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

    省略格式:

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

    示例代码

    public class Demo03Array {
    
        public static void main(String[] args) {
            // 省略格式的静态初始化
            int[] arrayA = { 10, 20, 30 };
    
            // 静态初始化的标准格式,可以拆分成为两个步骤
            int[] arrayB;
            arrayB = new int[] { 11, 21, 31 };
    
            // 动态初始化也可以拆分成为两个步骤
            int[] arrayC;
            arrayC = new int[5];
    
            // 静态初始化的省略格式,不能拆分成为两个步骤。
    		// int[] arrayD;
    		//arrayD = { 10, 20, 30 };
        }
    
    }
    

    5、注意事项:

    1. 静态初始化没有直接指定长度,但是仍然会自动推算得到长度。
    2. 静态初始化标准格式可以拆分成为两个步骤。
    3. 动态初始化也可以拆分成为两个步骤。
    4. 静态初始化一旦使用省略格式,就不能拆分成为两个步骤了。

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

    三、数组的索引

    1、直接打印数组名称,得到的是数组对应的:内存地址哈希值。

    1. 二进制:01
    2. 十进制:0123456789
    3. 16进制:0123456789abcdef

    访问数组元素的格式:

    数组名称[索引值]

    索引值:就是一个int数字,代表数组当中元素的编号。

    package day05;
    
    public class Demo04ArrayUse {
        public static void main(String[] args) {
            // 静态初始化的省略格式
            int[] array = { 10, 20, 30 };
    
            System.out.println(array); // [I@75412c2f
    
            // 直接打印数组当中的元素
            System.out.println(array[0]); // 10
            System.out.println(array[1]); // 20
            System.out.println(array[2]); // 30
            System.out.println("=============");
    
            // 也可以将数组当中的某一个单个元素,赋值交给变量
            int num = array[1];
            System.out.println(num); // 20
        }
    }

    输出

    "C:Program FilesJavajdk-13.0.2injava.exe" "-javaagent:C:Program FilesJetBrainsIntelliJ IDEA 2019.2libidea_rt.jar=61386:C:Program FilesJetBrainsIntelliJ IDEA 2019.2in" -Dfile.encoding=UTF-8 -classpath C:javaJavaAppsoutproductionJavaApps day05.Demo04ArrayUse
    [I@723279cf
    10
    20
    30
    =============
    20
    
    Process finished with exit code 0

    【注意】索引值从0开始,一直到“数组的长度-1”为止。

    2、使用动态初始化数组的时候,其中的元素将会自动拥有一个默认值

    1. 如果是整数类型,那么默认为0;
    2. 如果是浮点类型,那么默认为0.0;
    3. 如果是字符类型,那么默认为'u0000';
    4. 如果是布尔类型,那么默认为false;
    5. 如果是引用类型,那么默认为null。
    package day05;
    
    public class Demo05ArrayUse {
        public static void main(String[] args) {
            // 动态初始化一个数组
            int[] array = new int[3];
    
            System.out.println(array); // 内存地址值
            System.out.println(array[0]); // 0
            System.out.println(array[1]); // 0
            System.out.println(array[2]); // 0
            System.out.println("=================");
    
            // 将数据123赋值交给数组array当中的1号元素
            array[1] = 123;
            System.out.println(array[0]); // 0
            System.out.println(array[1]); // 123
            System.out.println(array[2]); // 0
        }
    }
    

    输出

    "C:Program FilesJavajdk-13.0.2injava.exe" "-javaagent:C:Program FilesJetBrainsIntelliJ IDEA 2019.2libidea_rt.jar=61419:C:Program FilesJetBrainsIntelliJ IDEA 2019.2in" -Dfile.encoding=UTF-8 -classpath C:javaJavaAppsoutproductionJavaApps day05.Demo05ArrayUse
    [I@723279cf
    0
    0
    0
    =================
    0
    123
    0
    

    注意事项:静态初始化其实也有默认值的过程,只不过系统自动马上将默认值替换成为了大括号当中的具体数值。  

    四、数组内存

    1、Java 虚拟机的内存划分

    为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。

    JVM 的内存划分

      2、一个数组内存图

    package day05;
    
    public class Demo01ArrayOne {
        public static void main(String[] args) {
            int[] array = new int[3]; // 动态初始化
            System.out.println(array); // 地址值
            System.out.println(array[0]); // 0
            System.out.println(array[1]); // 0
            System.out.println(array[2]); // 0
            System.out.println("==============");
    
            // 改变数组当中元素的内容
            array[1] = 10;
            array[2] = 20;
            System.out.println(array); // 地址值
            System.out.println(array[0]); // 0
            System.out.println(array[1]); // 10
            System.out.println(array[2]); // 20
        }
    
    }

    3、两个数组内存图

    package day05;
    
    public class Demo02ArrayTwo {
        public static void main(String[] args) {
            int[] arrayA = new int[3];
            System.out.println(arrayA); // 地址值
            System.out.println(arrayA[0]); // 0
            System.out.println(arrayA[1]); // 0
            System.out.println(arrayA[2]); // 0
            System.out.println("==============");
    
            arrayA[1] = 10;
            arrayA[2] = 20;
            System.out.println(arrayA); // 地址值
            System.out.println(arrayA[0]); // 0
            System.out.println(arrayA[1]); // 10
            System.out.println(arrayA[2]); // 20
            System.out.println("==============");
    
            int[] arrayB = new int[3];
            System.out.println(arrayB); // 地址值
            System.out.println(arrayB[0]); // 0
            System.out.println(arrayB[1]); // 0
            System.out.println(arrayB[2]); // 0
            System.out.println("==============");
    
            arrayB[1] = 100;
            arrayB[2] = 200;
            System.out.println(arrayB); // 地址值
            System.out.println(arrayB[0]); // 0
            System.out.println(arrayB[1]); // 100
            System.out.println(arrayB[2]); // 200
        }
    }

     4、两个变量指向一个数组

    public class Demo03ArraySame {
    
        public static void main(String[] args) {
            int[] arrayA = new int[3];
            System.out.println(arrayA); // 地址值
            System.out.println(arrayA[0]); // 0
            System.out.println(arrayA[1]); // 0
            System.out.println(arrayA[2]); // 0
            System.out.println("==============");
    
            arrayA[1] = 10;
            arrayA[2] = 20;
            System.out.println(arrayA); // 地址值
            System.out.println(arrayA[0]); // 0
            System.out.println(arrayA[1]); // 10
            System.out.println(arrayA[2]); // 20
            System.out.println("==============");
    
            // 将arrayA数组的地址值,赋值给arrayB数组
            int[] arrayB = arrayA;
            System.out.println(arrayB); // 地址值
            System.out.println(arrayB[0]); // 0
            System.out.println(arrayB[1]); // 10
            System.out.println(arrayB[2]); // 20
            System.out.println("==============");
    
            arrayB[1] = 100;
            arrayB[2] = 200;
            System.out.println(arrayB); // 地址值
            System.out.println(arrayB[0]); // 0
            System.out.println(arrayB[1]); // 100
            System.out.println(arrayB[2]); // 200
        }
    
    }

     

     

     

  • 相关阅读:
    Linux应用程序的地址布局
    C/C++中的内存四区!
    编程语言的选择重不重要?对普通人而言,反其道而行更可靠!
    【C语言程序设计】C语言求最大公约数(详解版)!
    【C语言程序设计】C语言求最小公倍数(详解版)!
    【C语言程序设计】C语言求定积分!腻不腻害!
    你是因为什么而当程序员啊!网友们众说纷纭,从装b到被逼,理由层出不穷!
    华为程序员爆料:主动离职,公司竟也给n+1,到手15万,华为真良心!
    【C语言程序设计】C语言整数逆序输出程序!
    copy 和 mutablecopy
  • 原文地址:https://www.cnblogs.com/luoahong/p/12573080.html
Copyright © 2011-2022 走看看