打怪升级之小白的大数据之旅(五)Java基础语法之数组的基本概念

打怪升级之小白的大数据之旅(五)

Java基础语法之数组的基本概念


目录

打怪升级之小白的大数据之旅(五)

上次回顾

 

数组概述

数组的概念与数组的组成

数组的特点

数组的声明与初始化

数组的声明

数组的初始化

数组的初始化方式

数组元素的访问

索引

数组的遍历与元素的默认值

数组的遍历

数组的默认值

数组内存图

计算机内存与java虚拟机内存划分

数据在内存中的执行流程

总结



上次回顾

上一期我们讲完了Java的流程控制:分支和循环,本次,将为大家带来数组的分享,数组这里,我分为四块,第一部分是数组的基础知识点,第二部分是数组的基础算法,第三部分是数组的算法升华,也就是常见的数组排序,算法这块,我大力推荐牛客网的左神,他讲的算法是真的好,第四部分是二维数组,因为是学大数据,未来数据的结构大多数的多维的,因此,二维数组一定要理解清楚!!


数组概述

数组的概念与数组的组成

  • 数组的概念
  1. 数组(arry),就是多个相同类型的数据,按照一定顺序排列的集合,并使用一个名字命名,然后用编号区分这些数据
  2. 数组就是一个数据容器
  • 数组的组成:
    • 数组名
    • 下标(或脚标、索引)(index)
    • 元素(element)
    • 数组的长度(length)
  • 按照我的理解,数组就是这个样子的:
  • 上图解释:
    • 这个公寓可以理解为一个数组,它在计算机创建后,计算机就给它分配了一片土地让它盖公寓(连续的内存空间), 因此,这个Java数组网红公寓就是一个内存地址(本身存储的十六进制,Java内部会进行一个转换)
    • 当这个公寓创建好了之后,因为它是连续的,因此,我们根据房间号就可以直接找到该房间,这个房间号在Java中称之为下标/脚标,用于标记数组中元素的位置
    • 那么元素是什么?元素就是住客,比如上面,张三,李四王五和我都住进去了,如果没有人住进去,就会有默认值,这个默认值等下后面会讲到
    • 数组的长度就是我这个公寓有多少的房间,因为当我公寓盖好之后,再想加一个房间是不可能的,除非重新盖一个公寓,当然那就不是0XAB网红公寓了,因为计算机土地(内存)很宝贵
    • 另外有一个重点: 我想住进这个房间,必须在还有房间的情况下,提前预定并告诉房东,不然就没房子住了,这个就是
      数组在使用之前需要先进行声明并初始化

数组的特点

  • 数组的长度一旦确定就不能修改(重要),这个我上面提到过原因
  • 存储的元素为相同的数据类型,可以是基本数据类型或引用数据类型
  • 有索引,创建数组时会在内存中开辟一整块连续的空间。
  • 存取元素的速度快,因为可以通过[下标],直接定位到任意一个元素

数组的声明与初始化

数组的声明

  • 声明一个数据类型的变量
  • 数组声明的格式
    //推荐
    元素的数据类型[] 数组的名称;
    int[] age;
    //不推荐
    元素的数据类型  数组名[];
    int age[];
    

    不推荐使用int age[]; 这种写法~就当我没提过这种写法

数组的初始化

数组的初始化方式

  • 静态初始化
    • 定义数组的同时为数组分配内存空间,并赋值。程序员只给定数组元素的初始值,不指定数组长度,由系统决定数组的长度
    • 格式:
      1). 数据类型[] 数组名 = new 数据类型[]{元素1,元素2,元素3...};

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

    • 简化方式
      数据类型[] 数组名 = {元素1,元素2,元素3...};
    • 示例代码:
      //定义存储1,2,3,4,5整数的数组容器。
      int[] arr = new int[]{1,2,3,4,5};//正确
          
      int[] arr;
      arr = new int[]{1,2,3,4,5};//正确
          
      int[] arr = new int[5]{1,2,3,4,5};//错误的,后面有{}指定元素列表,就不需要在[长度]指定长度。
          
      //简化方式:
      int[] arr = {1,2,3,4,5};//正确
          
      int[] arr;
      arr = {1,2,3,4,5};
      
      注意啦:简写方式必须在一个语句中完成,不能分开两个语句写
  • 动态初始化
    • 程序员只给定数组的长度,后期再给给元素赋值(实际系统会先给出元素的默认值)

    • 格式:
      1. 数据类型[] 数组名字 = new 数据类型[长度];
      2. 数据类型[] 数据名字
         数组名字 = new 数据类型[长度]

    • 示例代码:

      //定义可以存储5个整数的数组容器,代码如下:
      int[] arr = new int[5];
               
      int[] arr;
      arr = new int[5];
      

      动态初始化比较灵活一些,当我们存储数据时,可以提前开辟大一点的空间,防止数组的溢出(数组中元素个数超过数组的长度)

数组元素的访问

索引

  • 每一个存储到数组的元素,都会自动的拥有一个编号,从0开始,这个自动编号称为数组索引(index),可以通过数组的索引访问到数组中的元素。

  • 索引范围:[0, 数组的长度-1]

  • 格式:
    数组名[索引]

  • 访问数组元素

    • 数组名[索引],表示指定索引位置的元素

    • 数组名[索引]=值,表示为数组中指定索引位置的元素赋值
    • 示例代码:
      public static void main(String[] args) {
         //定义存储int类型数组,赋值元素1,2,3,4,5
         int[] arr = {1,2,3,4,5};
         //为0索引元素赋值为6
         arr[0] = 6;
         //获取数组0索引上的元素
         int i = arr[0];
         System.out.println(i);
         //直接输出数组0索引元素
         System.out.println(arr[0]);
      }
      

      数组索引位置默认是从0开始


数组的遍历与元素的默认值

数组的遍历

  • 就是将数组中的每个元素分别获取出来,就是遍历。遍历也是数组操作中的基石

  • 数组的长度属性: 每个数组都具有长度,而且是固定的,Java中赋予了数组的一个属性,可以获取到数组的长度,语句为:数组名.length ,属性length的执行结果是数组的长度,int类型结果。由次可以推断出,数组的最大索引值为数组名.length-1。

  • 示例代码:

    public static void main(String[] args) {
       int[] arr = {11, 22, 33, 44, 55};
       //打印输出数组的长度
       System.out.println("数组长度:"+arr.length);//5
       //数组遍历(正序):
       System.out.println("数组遍历:");
       for (int i = 0; i < arr.length; i++) {
           System.out.println(arr[i]);
       }
       //数组遍历(逆序):
       System.out.println("数组逆序遍历:");
       for (int i = arr.length-1; i >=0 ; i--) {
           System.out.println(arr[i]);
       }
    }
    

    如果存储的元素超过范围就会造成数组的溢出,所以我们在存储数据的时候,注意这个问题

数组的默认值

  • 开篇我提到了默认值这里,之下详细介绍一下
  • 当我们使用动态初始化创建数组时:
  • 数据类型[] 数组名字 = new 数据类型[长度];

  •  

     

    数组的元素有默认值

    此时只确定了数组的长度,那么数组的元素是什么值呢?请看下图

     

  • 上图就是数组的默认值详细介绍,除了数值型数据几乎都是标记为0和布尔的默认false外,所有引用类型在数组中的默认值都是null

数组内存图

这个就是我前面提到的数据存储在内存中的过程,下面我来填一下前面提到的坑

计算机内存与java虚拟机内存划分

  • 内存是计算机中重要的部件之一,它是与CPU进行沟通的桥梁。其作用是用于暂时存放CPU中的运算数据,以及与硬盘等外部存储器交换的数据。
  • 只要计算机在运行中,CPU就会把需要运算的数据调到内存中进行运算,当运算完成后CPU再将结果传送出来。我们编写的程序是存放在硬盘中的,在硬盘中的程序是不会运行的,必须放进内存中才能运行,运行完毕后会清空内存。
  • 内存这一块,我刚想到一个东东,我们要学习大数据,至少自己计算机的内存是16G的,如果内存不够的小伙伴,记得网购一个内存条,很简单,每个计算机都有提供独立内存的的位置,插~进去就好了
  • Java虚拟机要运行程序,必须要对内存进行空间的分配和管理
  • Java虚拟机的内存划分
    • 图例详解:

        区域名称

      作用                                     

        程序计数器        

      程序计数器是CPU中的寄存器,它包含每一个线程下一条要执行的指令的地址    

        本地方法栈

      当程序中调用了native的本地方法时,本地方法执行期间的内存区域      

        方法区

        存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。  

        堆内存

        存储对象(包括数组对象),new来创建的,都存储在堆内存。          

        虚拟机栈

       用于存储正在执行的每个Java方法的局部变量表等。<br />局部变量表存放了编译期可知长度的各种基本数据类型、对象引用,方法执行完,自动释放。

    • 我们想知道数组的内存地址,直接打印数组,就可以看到它的"伪内存值"(并不是底层的存储值,中间经过了一个转换)
    • 伪内存值这个称呼是我个人杜撰的哈
    • 查看内存值的示例代码:
      public static void main(String[] args) {
        	int[] arr = new int[3];
        	System.out.println(arr);//[I@5f150435
      }
      

       

数据在内存中的执行流程

首先看这张图:
:

举几个栗子:

  • 两个数组存储的内存图
    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) {
        // 定义数组,存储3个元素
        int[] arr = new int[3];
        //数组索引进行赋值
        arr[0] = 5;
        arr[1] = 6;
        arr[2] = 7;
        //输出3个索引上的元素值
        System.out.println(arr[0]);
        System.out.println(arr[1]);
        System.out.println(arr[2]);
        //定义数组变量arr2,将arr的地址赋值给arr2
        int[] arr2 = arr;
        arr2[1] = 9;
        System.out.println(arr[1]);
        }
    }

    执行流程


总结

    本章对数据的基本概念进行的分享,然后填补了一下前面的坑--Java的内存的存储,现在大家已经会数组的基本使用了吧,下一期将会带来数组的进阶使用---数组的基本算法,有了这个,我们就可以完成一些简单的数组统计,排序的功能。好啦,今天内容就到这里,不足之处欢迎后台吐槽~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值