• Java数组


    数组变量 VS 数组对象

    先看一例子: 

    int[] primitiveArray; //在栈中声明了一个引用变量,暂时还没指向任何对象
    primitiveArray = new int[5];    //在堆中创建了一个数组对象,并将这个对象的引用复制给primitiveArray。这个数组对象中的每个数组元素的类型都是int类型,并且此时每个数组元素的值都为0。
    
    //------------------分割线---------------
    
    int[] primitiveArray2 = {2,3,4,5,6};//在栈中声明了一个名为primitiveArray2 的引用变量,同时在堆中创建了一个数组对象,primitiveArray2指向该对象。该数组对象的各个数组元素的值分别为2,3,4,5,6
     

    数组变量(数组名、数组标识符):分配在栈空间,引用类型,比如上例中的primitiveArray和primitiveArray2,指向在堆中创建的一个真实对象(数组对象)。

    数组对象:分配在堆空间,是一个对象,由一系列固定数量的数组元素(element)组成,数组元素的个数在创建数组对象时确定。每个数组元素可以存放基本数据类型的值,或者是指向其他类型的引用,这取决于数组类型。

    对象数组 VS 基本类型数组

    上述例子中创建的是基本基本类型的数组,也可以创建对象数组,比如:

    Student[] objectArray; //在栈中声明了一个引用变量,暂时还没指向任何对象
    objectArray= new Student[5];    //在堆中创建了一个数组对象,并将这个对象的引用赋值给objectArray。这个数组对象中的每个数组元素的类型都是Student类型(引用类型),并且此时每个数组元素的值都为null。
    
    //------------------分割线---------------
    
    Student[] objectArray2 = {new Student("zhangsan"),new Student("lisi"),new Student("wangwu")};
    //在栈中声明了一个名为objectArray2的引用变量,同时在堆中创建了一个数组对象,objectArray2指向该对象。另外还在堆中创建了三个Student对象,该数组对象中的三个数组元素分别指向了这三个Student对象。

    1.在使用上几乎是相同的;

    2.唯一的区别就是对象数组保存的是引用,基本类型数组直接保存基本类型的值。

    数组类型是一种引用类型

    比如int是一个基本类型,但是int[]就是一种引用类型了。为什么这么说呢?

    因为int a = 32;

    变量a在栈空间,其存储的值为32;

    而int[] b = {32};

    变量b在栈空间,其存储的值是堆空间中的某个地址值了。既然b中存储的是地址,那么b就是引用类型的变量了。

    什么是Java中的对象呢?

    在java中如何创建一个对象呢?一般是new Class,这样就会在堆空间中创建出一个对象了。那么Java数组是一个对象吗?如果是对象,那它是哪个类的实例呢?

    事实上,java中数组也是一个对象。因为java数组存在于堆空间,所以它就是一个对象,既然它是一个对象,那么它是哪个类的实例呢?

            Student student = new Student();
            System.out.println(student.getClass().getCanonicalName());//输出结果:Student
            
            Student[] objectArray = new Student[5];
            System.out.println(objectArray.getClass().getCanonicalName());//输出结果:Student[]
    
           Student[][] objectArray2 = new Student[5][];
            System.out.println(objectArray2.getClass().getCanonicalName());//输出结果:Student[][]
            
           Student[][][] objectArray3 = new Student[5][][];
            System.out.println(objectArray3.getClass().getCanonicalName());//输出结果:Student[][][]

    所以,数组类型可以看做一个特殊的Class类。

    ClassName reference = new ClassName(); //普通类的使用方式,这里这是创建了一个对象,栈空间中的引用指向该对象,对象中的各个域进行了默认的初始化,可能还需要重新设置值。

    Type[] refrence = new Type[length]; //使数组的方式,创建了一个数组对象,栈空间中的引用指向该对象,数组对象中的各个数组元素进行了默认的初始化,还需要重新给各个元素复制。

    所以有的书中,将java中的对象分为:(类的)实例对象和数组对象。

    参考资料

    http://docs.oracle.com/javase/tutorial/java/nutsandbolts/arrays.html

  • 相关阅读:
    作用域 + this指向 的一道没面试题
    找出数组中最大的值
    统计数组中每个值出现的次数, 统计对象中每个字符出现的次数
    uniapp在h5 和 APP 端兼容性 bug 解决方案
    数组去重的常用方法,利用Promise实现函数按序执行
    momentjs实现距离当前时长并且回现中文效果
    SQL server 上机练习题
    JS 9
    JS 8
    JS 7
  • 原文地址:https://www.cnblogs.com/tsiangleo/p/4421871.html
Copyright © 2020-2023  润新知