【Java】探究Java数组的本质
問題引入
Java中的數(shù)組是封裝好的,我們直觀地是看不到實(shí)現(xiàn)的細(xì)節(jié)的,但這是否意味著數(shù)組是Java中的基本類型?
答案是否定的。
眾所周知,Java為了便于開發(fā)者使用,提供了8種基本類型:long、int、short、byte、char、double、float、boolean。
所以,顯然沒有著名的String,沒有著名的數(shù)組,沒有著名的包裝類,因?yàn)樗鼈兌际且妙愋汀?/p>
那就奇怪了,人家包裝類有自己的類的實(shí)現(xiàn),比如java.lang.Integer、java.lang.Boolean;人家String也有自己的實(shí)現(xiàn),java.lang.String,數(shù)組是什么家伙?
Let’s go!
證明數(shù)組是一種引用類型
證明一個(gè)對(duì)象是引用類型的,找到它的類就好啦。
雖然我們找不到Java里任何數(shù)組的類的實(shí)現(xiàn)(注意java.util.Arrays只是數(shù)組的工具類,并不是數(shù)組的類),但我們可以用反射來證實(shí):
int[] int_array = new int[10]; System.out.println("int[]的類型是:" + int_array.getClass());得到這么一個(gè)奇奇怪怪的結(jié)果:
int[]的類型是:class [I
沒見過的讀者可能會(huì)困惑,這是啥?別急,看下去~~
證明數(shù)組的父類是java.lang.Object
因?yàn)槲覀冎?#xff0c;Java里面所有的類都有公有的父類:java.lang.Object,找到這個(gè)父類可以繼續(xù)實(shí)錘“數(shù)組是引用類型”這樣一個(gè)事情。
還是用反射來證實(shí)。
我們先獲取int[]的類再獲取其父類:
結(jié)果:
int[]的類型是:class [I
int[]的父類:class java.lang.Object
OK,證實(shí)。
我們寫代碼的時(shí)候能不能直接用類[I
當(dāng)然不能,要不封裝給你一個(gè)數(shù)組干啥呢?
寫的話根本不會(huì)被識(shí)別,只能被當(dāng)做錯(cuò)誤類型的變量,語法檢查不通過啦!!
各種基本類型數(shù)組的類型一覽
下面的代碼可以給我們答案:
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());輸出結(jié)果:
long[]的類型是:class [J
int[]的類型是:class [I
short[]的類型是:class [S
byte[]的類型是:class [B
char[]的類型是:class [C
double[]的類型是:class [D
float[]的類型是:class [F
boolean[]的類型是:class [Z
當(dāng)然了,這個(gè)也沒必要記,知道就好啦。
某些引用類型數(shù)組的類型一覽
下面以如下幾個(gè)類的數(shù)組作為例子:
- java.lang.String
- java.util.Arrays
- java.math.BigInteger
輸出結(jié)果:
String[]的類型是:class [Ljava.lang.String;
Arrays[]的類型是:class [Ljava.util.Arrays;
BigInteger[]的類型是:class [Ljava.math.BigInteger;
包裝類數(shù)組的類型一覽
包裝類也是引用類型,這里展示兩例:
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());輸出結(jié)果:
Integer[]的類型是:class [Ljava.lang.Integer;
Boolean[]的類型是:class [Ljava.lang.Boolean;
二維數(shù)組和多維數(shù)組的類型一覽
這里只選取二位int數(shù)組和三維int數(shù)組進(jìn)行展示:
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());輸出結(jié)果:
int[][]的類型是:class [[I
int[][][]的類型是:class [[[I
引用類型數(shù)組結(jié)論
引用類型數(shù)組的類型格式是:
[className
className為引用類型的類全名,比如java.lang.Integer,比如[I,比如[[[[[[B。
為什么要寫成[className
只是一種表示方式而已,反正都是要交個(gè)JVM處理的嘛。
Java數(shù)組怎么實(shí)現(xiàn)的
呃呃,這個(gè)問題,Java的數(shù)組不是用Java寫的……
別信網(wǎng)上那個(gè)用Java寫數(shù)組,親愛的Java連指針都隱藏起來了,上哪去搞數(shù)組?
網(wǎng)上那些都是順序表……說白了就是低低低低低配版ArrayList而已……你還不如去學(xué)學(xué)數(shù)據(jù)結(jié)構(gòu)的“順序表”或者讀讀java.util.ArrayList源碼,你說呢?
數(shù)組使用避坑
感興趣的話可以看過來 → Here
這是我以前寫過的一些小總結(jié),相信對(duì)初學(xué)者還是有用的。
完整測(cè)試代碼
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];//某些引用類型的數(shù)組String[] string_array = new String[10];Arrays[] arrays_array = new Arrays[10];BigInteger[] bigInteger_array = new BigInteger[10];//包裝類的數(shù)組Integer[] integer_array = new Integer[10];Boolean[] boolean_b_array = new Boolean[10];//二維數(shù)組int[][] int_int_array = new int[10][10];//三維數(shù)組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());} }完整測(cè)試結(jié)果
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
總結(jié)
Java數(shù)組是重要的結(jié)構(gòu),雖然使用起來往往不如集合框架里封裝好的數(shù)據(jù)結(jié)構(gòu)好使……
數(shù)組是引用類型,不是什么基本類型,指針也不是在Java層面上看得到的,所以建議學(xué)學(xué)C/C++的指針與數(shù)組吧。
java.util.Arrays為操作數(shù)組提供了大量的常見操作,一定要了解這些API,很重要。
不要照著什么C/C++寫這種代碼:int array[10];,在Java里就應(yīng)該這么寫:int[] array = new int[10];。
多用多總結(jié),排排坑就會(huì)越來越好啦!
新春快樂@大家!
總結(jié)
以上是生活随笔為你收集整理的【Java】探究Java数组的本质的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【程序性能分析利器】Google Per
- 下一篇: 洛谷P1634、P1888、P3954、