专栏首页Java后端技术栈cwnait如何理解数组在Java中作为一个类?【完整版】

如何理解数组在Java中作为一个类?【完整版】

这是昨天一个小伙伴去面试被问到的问题。

问题分析

Java中数组的使用方法和C/C++中的比较类似,但是在Java中它的本质是一个Java类,只是这个类比较特殊,所以很容易被一些程序员误解。建议在回答该问题的时候,全面地回顾下Java中数组的特性。

大家都知道,Java的数据类型可以分为两种:基本类型和引用类型。那么数组属于哪一种类型呢?很显然,数组肯定不属于基本类型,因为基本类型只有那8种(byte、char、short、int、long、float、double、boolean)。那么数组就应该属于引用类型了,也就是说每一个数组实例都是一个对象,这些对象同属于一个类。

首先,我们来看看如何使用一个Java数组。大致有以下几个步骤:

  1. 声明数组,使用一个引用来操作数组
  2. 使用new关键字来为数组创建所需要的内存空间,并且返回一个引用的值,还可以用{}符号来为数组赋初始化值
  3. 使用数组的下标对数组的值进行操作

Java代码表示:

public class ArrayDemo {
    public static void main(String[] args) {
        int[] ints = new int[]{20, 21, 22};
        String[] strings = new String[2];
        strings[0] = "Java后端技术栈";
        strings[1] = "lawt";
        //遍历
        //初学者请注意,数组的下标是从0开始的
        for (int i=0;i<ints.length;i++){
            System.out.println(ints[i]);
        }
        for (String string:strings){
            System.out.println(string);
        }
    }
}

输出

20
21
22
Java后端技术栈
lawt

两种类型的数组有一个共同的特点,就是在创建的时候必须指定一个长度。其实,这是因为这些数组在创建的时候,会动态地为这些类创建指定数目的成员变量,并且为这些成员变量赋初始值。但是Java不会让程序员像使用普通类那样去操作这些成员变量,而是通过[]符号,使用下标访问这些数据。另外,Java还为每一个数组对象提供了一个length属性,用于指导该数组的长度。

那么,数组的类名是什么呢?

其实数组的类型与它存储的数据类型有关,它们的类名可以通过获取数组的Class类型类获取,如下:

System.out.println(ints.getClass().getName());
System.out.println(strings.getClass().getName());

输出

[I
[Ljava.lang.String;

可以看得出,数组类名总是以左中括号开头,然后就是不同的标识。例如,int类型的数组则是I字符标识,字符串类型数组则是Ljava.lang.String。通过这些标识,程序员就可以较为快速地判断出数组存储的是哪一种类型的数据。

如果把上面代码调整一下,不给数组元素赋值:

public class ArrayDemo {
    public static void main(String[] args) {
        int[] ints = new int[3];
        String[] strings = new String[2];
        //遍历
        for (int i=0;i<ints.length;i++){
            System.out.println(ints[i]);
        }
        for (String string:strings){
            System.out.println(string);
        }
        System.out.println(ints.getClass().getName());
        System.out.println(strings.getClass().getName());
    }
}

输出结果为:

0
0
0
null
null
[I
[Ljava.lang.String;

以上的输出便是数组元素在没有赋值时候的默认值。

参考答案

Java的数组本质是一个类,该类还保存了数据类型的信息。该类通过成员变量的形式来保存数据,并且通过[]加上下标来访问数组数据。在处理基本类型数据时,数组保存的是变量的值,

比如int [] array=new int[3];这时候并没有为数组中的元素赋值,但是数组会把这些变量的值初始化为int [] array=new int[]{0,0,0};;

而且处理引用类型是数组保存的是数据的引用,如果程序员未提供初始值,数组会把这些变量的值初始化为null,比如String[] strings = new String[2];默认初始化String[] strings = new String[]{null,null};

可以使用ints.getClass().getName();来获取对应的Class名称。

本文分享自微信公众号 - Java后端技术栈(t-j20120622),作者:lawt

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-09-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • java集合之CopyOnWriteArrayList源码分析

    CopyOnWriteArrayList是ArrayList的线程安全版本,内部也是通过数组实现,每次对数组的修改都完全拷贝一份新的数组来修改,修改完了再替换掉...

    用户4143945
  • 面试被问:HTTP客户端连接,选择HttpClient还是OkHttp?

    这又触及到我的知识盲区了,首先来一波面向百度学习,直接根据关键字httpclient和okhttp的区别、性能比较进行搜索,没有找到想要的答案,于是就去over...

    用户4143945
  • 99%的java程序员都遇到过的笔试题

    这里咱们忽略空格,所以答案就是B,主要的是本道题考察的是Java语言中传参方式和不可变类的知识。

    用户4143945
  • 180813-Spring之RestTemplate使用小结一

    作为一个Java后端,需要通过HTTP请求其他的网络资源可以说是一个比较常见的case了;一般怎么做呢?

    小灰灰
  • Spring之RestTemplate使用小结一

    作为一个Java后端,需要通过HTTP请求其他的网络资源可以说是一个比较常见的case了;一般怎么做呢?

    小灰灰
  • c语言新手的无奈,几个新手容易犯的错误

    如果你是一个c语言新手,你很能试过在写代码的时候看上去明明问题,但是运行的时候就出现了错误。下面的错误你犯过几个?

    诸葛青云
  • 迁移到云端的企业为数字化转型做好准备了吗?

    如今,很多企业的首席信息官都在考虑数字化转型,一些技术决策者正寻求将业务迁移到云端,其原因有很多,例如,认为大型机过时的观念、降低成本,以及提高生产力。

    静一
  • JAVA描述算法和数据结构(01):稀疏数组和二维数组转换

    在矩阵中,若数值为0的元素数目远远多于非0元素的数目,并且非0元素分布没有规律时,则称该矩阵为稀疏矩阵;与之相反,若非0元素数目占大多数时,则称该矩阵为稠密矩阵...

    知了一笑
  • 总量2100万个,稀缺带来价值?

    昨天在《只需几十元,就可以学会比特币交易的全过程》里提到了安装Bitcoin Core客户端的过程,有些朋友行动很快,已经开始动手安装了,同时也遇到了一点点问题...

    申龙斌
  • 写Laravel测试代码(3)

    在开发时经常会调用第三方API接口,抓取json api data后进行加工处理,那如何写测试呢?如何mock数据呢?

    botkenni

扫码关注云+社区

领取腾讯云代金券