问题引入

Java中的数组是封装好的,我们直观地是看不到实现的细节的,但这是否意味着数组是Java中的基本类型?

答案是否定的。
众所周知,Java为了便于开发者使用,提供了8种基本类型:long、int、short、byte、char、double、float、boolean。
所以,显然没有著名的String,没有著名的数组,没有著名的包装类,因为它们都是引用类型。

那就奇怪了,人家包装类有自己的类的实现,比如java.lang.Integer、java.lang.Boolean;人家String也有自己的实现,java.lang.String,数组是什么家伙?

Let’s go!

证明数组是一种引用类型

证明一个对象是引用类型的,找到它的类就好啦。

虽然我们找不到Java里任何数组的类的实现(注意java.util.Arrays只是数组的工具类,并不是数组的类),但我们可以用反射来证实:

int[] int_array = new int[10];
System.out.println("int[]的类型是:" + int_array.getClass());

得到这么一个奇奇怪怪的结果:
int[]的类型是:class [I

没见过的读者可能会困惑,这是啥?别急,看下去~~

证明数组的父类是java.lang.Object

因为我们知道,Java里面所有的类都有公有的父类:java.lang.Object,找到这个父类可以继续实锤“数组是引用类型”这样一个事情。

还是用反射来证实。
我们先获取int[]的类再获取其父类:

int[] int_array = new int[10];
System.out.println("int[]的类型是:" + int_array.getClass());
System.out.println("int[]的父类:" + int_array.getClass().getSuperclass());

结果:
int[]的类型是:class [I
int[]的父类:class java.lang.Object

OK,证实。

我们写代码的时候能不能直接用类[I

当然不能,要不封装给你一个数组干啥呢?
写的话根本不会被识别,只能被当做错误类型的变量,语法检查不通过啦!!

各种基本类型数组的类型一览

下面的代码可以给我们答案:

long[] long_array = new long[10];
int[] int_array = new int[10];
short[] short_array = new short[10];
byte[] byte_array = new byte[10];
char[] char_array = new char[10];
double[] double_array = new double[10];
float[] float_array = new float[10];
boolean[] boolean_array = new boolean[10];
System.out.println("long[]的类型是:" + long_array.getClass());
System.out.println("int[]的类型是:" + int_array.getClass());
System.out.println("short[]的类型是:" + short_array.getClass());
System.out.println("byte[]的类型是:" + byte_array.getClass());
System.out.println("char[]的类型是:" + char_array.getClass());
System.out.println("double[]的类型是:" + double_array.getClass());
System.out.println("float[]的类型是:" + float_array.getClass());
System.out.println("boolean[]的类型是:" + boolean_array.getClass());

输出结果:
long[]的类型是:class [J
int[]的类型是:class [I
short[]的类型是:class [S
byte[]的类型是:class [B
char[]的类型是:class [C
double[]的类型是:class [D
float[]的类型是:class [F
boolean[]的类型是:class [Z

当然了,这个也没必要记,知道就好啦。

某些引用类型数组的类型一览

下面以如下几个类的数组作为例子:

  • java.lang.String
  • java.util.Arrays
  • java.math.BigInteger
String[] string_array = new String[10];
Arrays[] arrays_array = new Arrays[10];
BigInteger[] bigInteger_array = new BigInteger[10];
System.out.println("String[]的类型是:" + string_array.getClass());
System.out.println("Arrays[]的类型是:" + arrays_array.getClass());
System.out.println("BigInteger[]的类型是:" + bigInteger_array.getClass());

输出结果:
String[]的类型是:class [Ljava.lang.String;
Arrays[]的类型是:class [Ljava.util.Arrays;
BigInteger[]的类型是:class [Ljava.math.BigInteger;

包装类数组的类型一览

包装类也是引用类型,这里展示两例:

Integer[] integer_array = new Integer[10];
Boolean[] boolean_b_array = new Boolean[10];
System.out.println("Integer[]的类型是:" + integer_array.getClass());
System.out.println("Boolean[]的类型是:" + boolean_b_array.getClass());

输出结果:
Integer[]的类型是:class [Ljava.lang.Integer;
Boolean[]的类型是:class [Ljava.lang.Boolean;

二维数组和多维数组的类型一览

这里只选取二位int数组和三维int数组进行展示:

int[][] int_int_array = new int[10][10];
int[][][] int_int_int_array = new int[10][10][10];
System.out.println("int[][]的类型是:" + int_int_array.getClass());
System.out.println("int[][][]的类型是:" + int_int_int_array.getClass());

输出结果:
int[][]的类型是:class [[I
int[][][]的类型是:class [[[I

引用类型数组结论

引用类型数组的类型格式是:
[className
className为引用类型的类全名,比如java.lang.Integer,比如[I,比如[[[[[[B

为什么要写成[className

只是一种表示方式而已,反正都是要交个JVM处理的嘛。

Java数组怎么实现的

呃呃,这个问题,Java的数组不是用Java写的……

别信网上那个用Java写数组,亲爱的Java连指针都隐藏起来了,上哪去搞数组?
网上那些都是顺序表……说白了就是低低低低低配版ArrayList而已……你还不如去学学数据结构的“顺序表”或者读读java.util.ArrayList源码,你说呢?

数组使用避坑

感兴趣的话可以看过来 → Here
这是我以前写过的一些小总结,相信对初学者还是有用的。

完整测试代码

import java.math.BigInteger;
import java.util.Arrays;public class ArrayTypeTest {public static void main(String[] args) {long[] long_array = new long[10];int[] int_array = new int[10];short[] short_array = new short[10];byte[] byte_array = new byte[10];char[] char_array = new char[10];double[] double_array = new double[10];float[] float_array = new float[10];boolean[] boolean_array = new boolean[10];//某些引用类型的数组String[] string_array = new String[10];Arrays[] arrays_array = new Arrays[10];BigInteger[] bigInteger_array = new BigInteger[10];//包装类的数组Integer[] integer_array = new Integer[10];Boolean[] boolean_b_array = new Boolean[10];//二维数组int[][] int_int_array = new int[10][10];//三维数组int[][][] int_int_int_array = new int[10][10][10];System.out.println("long[]的类型是:" + long_array.getClass());System.out.println("int[]的类型是:" + int_array.getClass());System.out.println("short[]的类型是:" + short_array.getClass());System.out.println("byte[]的类型是:" + byte_array.getClass());System.out.println("char[]的类型是:" + char_array.getClass());System.out.println("double[]的类型是:" + double_array.getClass());System.out.println("float[]的类型是:" + float_array.getClass());System.out.println("boolean[]的类型是:" + boolean_array.getClass());System.out.println("String[]的类型是:" + string_array.getClass());System.out.println("Arrays[]的类型是:" + arrays_array.getClass());System.out.println("BigInteger[]的类型是:" + bigInteger_array.getClass());System.out.println("Integer[]的类型是:" + integer_array.getClass());System.out.println("Boolean[]的类型是:" + boolean_b_array.getClass());System.out.println("int[][]的类型是:" + int_int_array.getClass());System.out.println("int[][][]的类型是:" + int_int_int_array.getClass());//父类System.out.println("int[]的父类:" + int_array.getClass().getSuperclass());}
}

完整测试结果

long[]的类型是:class [J
int[]的类型是:class [I
short[]的类型是:class [S
byte[]的类型是:class [B
char[]的类型是:class [C
double[]的类型是:class [D
float[]的类型是:class [F
boolean[]的类型是:class [Z
String[]的类型是:class [Ljava.lang.String;
Arrays[]的类型是:class [Ljava.util.Arrays;
BigInteger[]的类型是:class [Ljava.math.BigInteger;
Integer[]的类型是:class [Ljava.lang.Integer;
Boolean[]的类型是:class [Ljava.lang.Boolean;
int[][]的类型是:class [[I
int[][][]的类型是:class [[[I
int[]的父类:class java.lang.Object

总结

Java数组是重要的结构,虽然使用起来往往不如集合框架里封装好的数据结构好使……
数组是引用类型,不是什么基本类型,指针也不是在Java层面上看得到的,所以建议学学C/C++的指针与数组吧。
java.util.Arrays为操作数组提供了大量的常见操作,一定要了解这些API,很重要。
不要照着什么C/C++写这种代码:int array[10];,在Java里就应该这么写:int[] array = new int[10];
多用多总结,排排坑就会越来越好啦!

新春快乐@大家!

【Java】探究Java数组的本质相关推荐

  1. 探究Java常量本质及三种常量池(JVM)

    简介: 探究Java常量本质及三种常量池 可以从他人的博文,还有一些书籍中了解到 常量是放在常量池 中,细节的内容无从得知,相信每个人都会觉得面前的东西是一个几乎完全的黑盒,总是觉得不舒服,翻阅< ...

  2. 零基础Java学习之数组

    数组 数组的概念 数组的定义 方式一:静态初始化 方式二:静态初始化 方式三:动态初始化 数组元素的访问 数组的遍历 数组元素的默认值 数组内存图 内存概述 Java虚拟机的内存划分 数组在内存中的存 ...

  3. 解析java中的数组

    文章目录 一 数组的定义 二 数组的基本语法 三 数组的使用 1 数组获取长度与访问元素 注意事项: 2 数组的遍历 (1)for循环遍历 (2)for-each遍历数组 四 数组作为方法的参数 (1 ...

  4. java二维数组高纬低纬_2018-05-17 第十一天

    一.数组 (一)数组的优缺点: 优点:1:数组通过下标访问元素的效率很高.指定下标n的元素的地址:首地址+n*元素类型字节数. 2:数组可以保存若干个元素的值. 缺点:1:数组的长度是不能更改的. 2 ...

  5. 探究Java File类中list()、listFiles()的使用及区别,认识和使用匿名内部类

    转载自     探究Java File类中list().listFiles()的使用及区别,认识和使用匿名内部类 内容概要: 1.认识File类: 2.File的构造函数: 3.list()及其重载方 ...

  6. java面试题24 关于Java中的数组,

    java面试题24 关于Java中的数组,下面的一些描述,哪些描述是准确的:(        ) A 数组是一个对象,不同类型的数组具有不同的类 B 数组长度是可以动态调整的 C 数组是一个连续的存储 ...

  7. 深入探究Java中hashCode()和equals()的关系

    目录 一.基础:hashCode() 和 equals() 简介 equals() hashCode() 二. 漫谈:初识 hashCode() 与 equals() 之间的关系 三. 解密:深入理解 ...

  8. Java中大数据数组,Java基础学习笔记之数组详解

    摘要:这篇Java开发技术栏目下的"Java基础学习笔记之数组详解",介绍的技术点是"java基础学习笔记.基础学习笔记.Java基础.数组详解.学习笔记.Java&qu ...

  9. java怎样定义一个对象数组,java定义一个对象数组

    java怎么定义一个动态数组,Java初学者入门应该掌握的30个概念,java定义一个对象数组,java一维数组定义 摘要: java 是面向对象程序设计语言, 对象数组作为 javase 中的基础. ...

最新文章

  1. hdu 4190(二分)
  2. 达达真人漫画秀,微博演绎男版杜拉拉生存记
  3. vb6中使text控件的光标随着增加的内容向下移动
  4. Verilog UDP(User Defined Primitives)
  5. docker命令整理
  6. 遭遇“烧钱瓶颈” 优酷成本结构堪忧
  7. [dhtmlxGantt]浮动Milestone显示
  8. 在线HTML转JSX工具
  9. Windows Media Player单例模式
  10. python解析XML文件并转存到excel
  11. 华为U2000云平台和APP管理系统建设
  12. 【Unity3D】动态路障导航
  13. Node版本管理控制器n
  14. 计算机技术中采用二进制,计算机中采用二进制编码的原因是什么
  15. 原始点,姜治百病理论,害人不浅
  16. 基于Python的头脑王者脚本(纯娱乐)
  17. 操作系统之死锁检测算法:银行家算法
  18. 清华工科博士答辩PPT(转载)
  19. OPPO R9m刷机包_OPPO R9m线刷包救砖包教程下载
  20. 如何优雅的将DTO转化成BO

热门文章

  1. Django项目创建图解
  2. 图文详解linux/windows mysql忘记root密码解决方案
  3. 玩下软工项目,第一轮--全局Context的获取,SQLite的建立与增删改查,读取用户通话记录信息...
  4. Android App性能測试
  5. spring配置数据库
  6. java使用itext填充pdf模板,超简单教学,有手就行
  7. Team Foundation Server (TFS) 2015 安装指导
  8. python爬取淘宝数据魔方_淘宝数据魔方技术架构解析
  9. 龙武2服务器在维护,龙武5.25更新维护时间_龙武5.5更新维护详情_牛游戏网
  10. java中关键字、标识符、常量、变量、数据类型