Java基础之数组类型

时间:2019-09-12
本文章向大家介绍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维数组,暂且可以不用看,一般二维就已经够了,了解了内存的存储方式,其实也挺好理解的。

原文地址:https://www.cnblogs.com/liuzengzhi/p/11510278.html