zoukankan      html  css  js  c++  java
  • Java基础之数组类型

    对于Java,前面的一些基础概念不是很想写,看了看还是从数组开始写吧(毕竟数组是第一个引用类型,相对复杂一点),我也是学了JAVA不是很久,目前看完了JAVA的基础视频,还有JAVA疯狂讲义这本书的大部分跟基础相关的内容,但是看完之后发现之前学的很多东西都忘记了(太急于求成,动手实践太少),所以想在学习框架之前二刷一遍,把基础知识点在重温一下。顺便写写博客记录我的JAVA学习历程,以及我所理解的知识重点~!

    浅谈数组

      数组是我们在学习JAVA过程中遇到的第一个引用类型,它与我们之前所了解的基本类型(int,flout,String)不同,数组存储的数据是在堆内存中存储的,而我们基本类型的数据是在栈内存的存储的(关于堆,栈后面会详细说明)。接下来就开始我们的数组之旅~

    数组的概述

      JAVA中,我们要求数组存储的必须是同一个数据类型的数据,因此我们的数组不能同时存储多种数据类型的元素(区别于Javascript)。当我们的数组初始化结束之后,我们数组的长度就被确定下来,数组的长度是固定不变的(与集合的区别:集合的长度是可变的)。数组被清空的时候,它所占的空间依然被保留。

    数组的定义

      定义: 数据类型[] 数组名 = new 数据类型[元素个数或数组长度];

      对于数组定义的说明:1)数据类型: 数组中存储元素的数据类型。

                2) [] 表示数组的意思。

                3) 变量名 自定义标识符 。

                4) new 创建容器关键字。

                5)数据类型: 数组中存储元素的数据类型

                6)[] 表示数组的意思。

                7)元素个数,就是数组中,可以存储多少个数据 (恒定, 定长)

      数组是一个容器: 存储到数组中的每个元素,都有自己的自动编号。最小的下标值为0,最大下标值(为数组的长度-1)。访问数组存储的元素,必须依赖于索引:数组名[索引]。

      数组提供了一个属性来求得数组的长度:length属性。因此假设我们的数组名为arr,这个数组的长度就为:arr.length,数组的第一个元素就为arr[0],数组的最后一个元素就为arr[arr.length-1]。

    JVM的理解

      JVM虚拟机相当于连接着JAVA与操作系统,通俗的理解为,java是在JVM上进行开发的。

      JVM对自己的内存划分为5个区域:(1).寄存器:内存和CUP之间。(2).本地方法栈: JVM调用了系统中的功能。 (3).方法和数据共享: 运行时期class文件进入的地方。(4).方法栈:所有的方法运行的时候进入内存。 (5). 堆:存储的是容器和对象

                  

    数组的初始化

      数组的初始化有两种方式:静态初始化和动态初始化。

    (1).静态初始化:由程序员显示指定每个数组元素的初始值,由系统决定数组长度。

    int[] array = {1,2,3,4,5};

    (2).动态初始化:程序员只指定数组长度,由系统为数组元素分配值。

    int[] array = new int[5];

      系统所分配的值有几下几种:1).byte,short,int,long类型,数组被赋值成0.

                   2).float,double类型,数组被赋值成0.0.

                     3).char类型,数组被赋值成“\u0000”.

                   4).boolean类型,数组被赋值成false.

                   5).引用类型(类,接口,数组),数组被赋值成null.

    增强的for循环---foreach循环

      在Java5之后,Java提供了一种新的循环:foreach循环。foreach循环会自动遍历数组和集合的每个元素。

    foreach的语法格式如下:

    for(type arrName : array||collection){
    
        //自动迭代访问的每个元素
    }    

    type:数组元素或者集合元素的类型。arrName:一个形参名。array:要遍历的数组名。collection:要遍历的集合名。

    下面举一个例子来使用foreach方法:

    public class fun {
    public static void main(String[] args) {
        String[] array = {"ABC","abc","sdf","gvc","sf"};
        for(String arr : array){
            System.out.println(arr);
        }
    }
    }
    //最终的结果是:
    ABC
    abc
    sdf
    gvc
    sf

    但是值得注意的是:使用foreach循环的时候,不能在循环中对数组元素进行赋值,否则得出的结果是不正确的,这里面不详细说明。

    深入了解数组

      上面我们了解了数组的一些基本的功能以及使用方法,但是数组在内存中的运行机制是什么呢?之前提到的基本类型以及引用类型的存储在哪里呢?堆存储和栈存储的区别是什么呢?接下来我一一讲述。

    我们首先要明确的一个概念就是:数组是一个引用的数据类型,数组的引用变量只是一个引用,数组元素和数组变量在内存中是分开的。

    数组变量其实是一个引用(相当于C语言里面的指针),我们通过这个数组变量指向有效的内存来访问元素。因此我们如果要访问数组里面的变量,我们只能使用数组的引用变量来访问它的元素。

    接下来是一个数组的内存图,通过这个图来理解内存中的数组:

                    

      首先我们要了解的就是,在JVM中,栈和堆都是存储的容器。每一个方法在执行的时候,该方法都会建立一个自己的内存栈,在这个方法内定义的变量将会逐个的放在这块栈里。随着这个方法的结束,这个栈会自动的销毁,因此,所有方法中的局部变量都是存储在栈内存中的。当程序中创建一个对象的时候,这个对象将被保存在运行时的数据区中,以便可以反复的利用(因为创建对象的成本大),这个运行时的数据区就是堆内存,堆内存中的对象不会因为方法的结束而被销毁,因为即使这个方法结束后,该对象也可能被另一个引用变量引用,只有当一个对象没有任何引用变量引用它的时候,它才会被系统的垃圾回收器在合适的时候销毁。有时候我们会让系统回收一个数组所占的空间,那么我们只需要将数组变量赋值为null,这就切断了数组引用变量和实际数组之间的关系,数组就被回收了。

      如上所示,我们将数组的引用放在栈内存中(arr),将数组的对象放在堆内存中(new int[3]),我们数组的引用实际上是一个指向它的对象的指针,当我们想在数组中取第一个元素的时候,我们只需要将这个指针指向第一个元素,我们便可以获得第一个元素的值:arr[0]。

    二维数组

    所谓二维数组,通俗的来说就是将一维数组存储到了一维数组中.。我们将二维数组的定义为:

    type[][] arrName = new type[][];
    或者
    type[][] arrName = [[1,2,3],[2,3,4],[3,4,5]];

    其中第一个代表行数,第二个代表列数。

    二维数组的内存图如下所示(与一维数组差不多,就是在一维数组中存储了一维数组而已):

                      

    我们可以把二维数组理解成一维数组。向3维,4维......n维数组,暂且可以不用看,一般二维就已经够了,了解了内存的存储方式,其实也挺好理解的。

    为了我们共同进步,我这里有计算机专业的各种视频,

    如果想要,关注我的公众号:念流声。私聊我,看到后给你连接(只放了一张图片,视频有很多,需要什么可以私聊问我,有的话就给你)。

  • 相关阅读:
    Notes of Daily Scrum Meeting(12.18)
    Notes of Daily Scrum Meeting(12.17)
    Notes of Daily Scrum Meeting(12.16)
    Notes of Daily Scrum Meeting(12.8)
    Notes of Daily Scrum Meeting(12.5)
    Notes of Daily Scrum Meeting(12.3)
    Notes of Daily Scrum Meeting(11.12)
    Linux中profile、bashrc、bash_profile之间的区别和联系
    Linux GCC编译
    mysql 5.7.16 远程连接
  • 原文地址:https://www.cnblogs.com/liuzengzhi/p/11510278.html
Copyright © 2011-2022 走看看