Java数组到底是什么

问题引入

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];
多用多总结,排排坑就会越来越好啦!

新春快乐@大家!

发布了366 篇原创文章 · 获赞 625 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/weixin_43896318/article/details/104083129