Java基礎(chǔ)之?dāng)?shù)組超詳細(xì)知識總結(jié)
一、一維數(shù)組
1、Java語言中的數(shù)組是一種 引用數(shù)據(jù)類型
。不屬于基本數(shù)據(jù)類型。數(shù)組的父類是 Object
。
2、數(shù)組實際上是一個容器,可以同時容納多個元素。(數(shù)組是一個數(shù)據(jù)的集合)
3、數(shù)組當(dāng)中可以存儲“基本數(shù)據(jù)類型
”的數(shù)據(jù),也可以存儲“引用數(shù)據(jù)類型
”的數(shù)據(jù)。
4、數(shù)組因為是引用類型,所以數(shù)組對象存儲在 堆內(nèi)存
當(dāng)中。(數(shù)組是存儲在堆當(dāng)中的)
5、數(shù)組當(dāng)中如果存儲的是“java對象”的話,實際上存儲的是對象的“引用(內(nèi)存地址)
”,數(shù)組中不能直接存儲java對象。
6、數(shù)組一旦創(chuàng)建,在java中規(guī)定,長度不可變
。(數(shù)組長度不可變)
7、數(shù)組的分類:一維數(shù)組、二維數(shù)組、三維數(shù)組、多維數(shù)組…(一維數(shù)組較多,二維數(shù)組偶爾使用!)
8、所有的數(shù)組對象都有 length
屬性(java自帶的),用來獲取數(shù)組中元素的個數(shù)。
9、java中的數(shù)組要求數(shù)組中元素的 類型統(tǒng)一
。
比如:int類型數(shù)組只能存儲int類型,Person類型數(shù)組只能存儲Person類型。
10、數(shù)組在內(nèi)存方面存儲的時候,數(shù)組中的元素內(nèi)存地址(存儲的每一個元素都是有規(guī)則的挨著排列的)是連續(xù)的。內(nèi)存地址連續(xù)
。(數(shù)組特點)
11、所有的數(shù)組都是拿“第一個小方框的內(nèi)存地址”作為整個數(shù)組對象的內(nèi)存地址。
(數(shù)組中首元素的內(nèi)存地址作為整個數(shù)組對象的內(nèi)存地址。)
12、數(shù)組中每一個元素都是有下標(biāo)的,下標(biāo)從0開始,以1遞增。最后一個元素的下標(biāo)是:length - 1
13、數(shù)組這種數(shù)據(jù)結(jié)構(gòu)的優(yōu)點和缺點是什么?
- 優(yōu)點:查詢/查找/檢索某個下標(biāo)上的元素時效率極高。
原因:
第一:每一個元素的內(nèi)存地址在空間存儲上是連續(xù)的。
第二:每一個元素類型相同,所以占用空間大小一樣。
第三:知道第一個元素內(nèi)存地址,知道每一個元素占用空間的大小,又知道下標(biāo),所以通過一個數(shù)學(xué)表達式就可以計算出某個下標(biāo)上元素的內(nèi)存地址。直接通過內(nèi)存地址定位元素,所以數(shù)組的檢索效率是最高的。
注意:
數(shù)組中存儲100個元素,或者存儲100萬個元素,在元素查詢/檢索方面,效率是相同的,
因為數(shù)組中元素查找的時候不會一個一個找,是通過數(shù)學(xué)表達式計算出來的。(算出一個
內(nèi)存地址,直接定位的。)
- 缺點:
第一:由于為了保證數(shù)組中每個元素的內(nèi)存地址連續(xù),所以在數(shù)組上隨機刪除或者增加元素的時候,效率較低,因為隨機增刪元素會涉及到后面元素統(tǒng)一向前或者向后位移的操作。
第二:數(shù)組不能存儲大數(shù)據(jù)量。因為很難在內(nèi)存空間上找到一塊特別大的連續(xù)的內(nèi)存空間。
注意:
對于數(shù)組中最后一個元素的增刪,是沒有效率影響的。
14、怎么聲明/定義一個一維數(shù)組?
語法格式:
int[] array1; double[] array2; boolean[] array3; String[] array4; Object[] array5;
15、怎么初始化一個一維數(shù)組呢?
包括兩種方式:靜態(tài)初始
化一維數(shù)組,動態(tài)初始化
一維數(shù)組。
靜態(tài)初始化語法格式:
java風(fēng)格:
int[] array = {100, 2100, 300, 55};
C++風(fēng)格:
int array[] = {100, 2100, 300, 55};
動態(tài)初始化語法格式:
Java風(fēng)格:
int[] array = new int[5]; // 這里的5表示數(shù)組的元素個數(shù)。 // 初始化一個5個長度的int類型數(shù)組,每個元素默認(rèn)值0 String[] names = new String[6]; // 初始化6個長度的String類型數(shù)組,每個元素默認(rèn)值null。
C++風(fēng)格:
int array[] = new int[5]; // 這里的5表示數(shù)組的元素個數(shù)。 // 初始化一個5個長度的int類型數(shù)組,每個元素默認(rèn)值0 String names[] = new String[6]; // 初始化6個長度的String類型數(shù)組,每個元素默認(rèn)值null。
注意:
采用動態(tài)初始化,數(shù)組會賦默認(rèn)值!
注意:
和c++的區(qū)別
c++定義數(shù)組 //靜態(tài)初始化 int a[10]; int a[] = {1, 2, 3, 4}; int a[100] = {1, 2, 3, 4}; //動態(tài)初始化 int *a = new int[10];
16、怎么修改一維數(shù)組某一個元素的值?
語法格式:
數(shù)組名[下標(biāo)] = 值; eg. a[1] = 100;
17、 什么時候采用靜態(tài)初始化方式,什么時候使用動態(tài)初始化方式呢?
- 當(dāng)你創(chuàng)建數(shù)組的時候,確定數(shù)組中存儲哪些具體的元素時,采用靜態(tài)初始化方式。
- 當(dāng)你創(chuàng)建數(shù)組的時候,不確定將來數(shù)組中存儲哪些數(shù)據(jù),你可以采用動態(tài)初始化的方式,預(yù)先分配內(nèi)存空間。
18、方法形參為一維數(shù)組如何傳參?
public void print(int[] num){ for (int i = 0; i < num.length; i++){ System.out.println(num[i]); } } 傳參: int[] a = {1, 2, 3, 4}; print(a);
還可以這樣傳參:
傳靜態(tài)數(shù)組 print(new int[]{1, 2, 3, 4});
new int[]{1, 2, 3, 4}
還可以.length
是一個數(shù)組對象!
19、數(shù)組擴容(效率低)
方法:(System類的方法)
/** *@src 拷貝源 *@srcPos 拷貝源起始位置 *@dest 目標(biāo)數(shù)組 *@destPos 目標(biāo)數(shù)組起始位置 *@length 拷貝長度 */ static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
eg.
int[] a = {1, 2, 3, 4}; int[] b = new int [10]; System.arraycopy(a, 0, b, 0, aa.length); //從a數(shù)組下標(biāo)為0開始拷貝,拷貝到從b數(shù)組下標(biāo)為0開始存入,長度為整個a數(shù)組
二、二維數(shù)組
1、二維數(shù)組其實是一個 特殊的一維數(shù)組
,特殊在這個一維數(shù)組當(dāng)中的每一個元素是一個一維數(shù)組。
2、三維數(shù)組是什么?
三維數(shù)組是一個特殊的二維數(shù)組,特殊在這個二維數(shù)組 中每一個元素是一個一維數(shù)組。
實際的開發(fā)中使用最多的就是一維數(shù)組。二維數(shù)組也很少使用。三維數(shù)組幾乎不用。
3、二維數(shù)組靜態(tài)初始化
int[][] array = { {1,1,1}, {2,3,4,5}, {0,0,0,0}, {2,3,4,5}, {2,3,4,5}, {2,3,4,5}, {2,3,4,5} };
4、二維數(shù)組動態(tài)初始化
eg.
int[][] array = new int[3][4];
5、關(guān)于二維數(shù)組中元素的:讀和改。
a[二維數(shù)組中的一維數(shù)組的下標(biāo)][一維數(shù)組的下標(biāo)] a[0][0]:表示第1個一維數(shù)組中的第1個元素。 a[3][100]:表示第4個一維數(shù)組中的第101個元素。
注意:
對于a[3][100]來說,其中 a[3] 是一個整體。[100]是前面a[3]執(zhí)行結(jié)束的結(jié)果然后再下標(biāo)100。
6、方法形參為二維數(shù)組如何傳參?
public void print(int[][] num){ for (int i = 0; i < num.length; i++){ for (int j = 0; j < num[i].length; j++){ System.out.println(num[i][j]); } } } 傳參: int[][] a = {{1,2,3,4},{4,5,6,76},{1,23,4}}; print(a);
還可以這樣傳參:
傳靜態(tài)數(shù)組 print(new int[][]{{1,2,3,4},{4,5,6,76},{1,23,4}});
new int[][]{{1,2,3,4},{4,5,6,76},{1,23,4}}
還可以.length
是一個數(shù)組對象!
三、總結(jié)
1. 數(shù)組的優(yōu)點和缺點,并且要理解為什么。
第一:空間存儲上,內(nèi)存地址是連續(xù)的。
第二:每個元素占用的空間大小相同。
第三:知道首元素的內(nèi)存地址。
第四:通過下標(biāo)可以計算出偏移量。
通過一個數(shù)學(xué)表達式,就可以快速計算出某個下標(biāo)位置上元素的內(nèi)存地址,
直接通過內(nèi)存地址定位,效率非常高。
優(yōu)點:檢索效率高。
缺點:隨機增刪效率較低,數(shù)組無法存儲大數(shù)據(jù)量。
注意:數(shù)組最后一個元素的增刪效率不受影響。
2. 一維數(shù)組的靜態(tài)初始化和動態(tài)初始化
靜態(tài)初始化:
int[] arr = {1,2,3,4}; Object[] objs = {new Object(), new Object(), new Object()};
動態(tài)初始化:
int[] arr = new int[4]; // 4個長度,每個元素默認(rèn)值0 Object[] objs = new Object[4]; // 4個長度,每個元素默認(rèn)值null
3. 一維數(shù)組的遍歷
for(int i = 0; i < arr.length; i++){ System.out.println(arr[i]); }
4. 二維數(shù)組的靜態(tài)初始化和動態(tài)初始化
靜態(tài)初始化:
int[][] arr = { {1,2,34}, {54,4,34,3}, {2,34,4,5} }; Object[][] arr = { {new Object(),new Object()}, {new Object(),new Object()}, {new Object(),new Object(),new Object()} };
動態(tài)初始化:
int[][] arr = new int[3][4]; Object[][] arr = new Object[4][4]; Animal[][] arr = new Animal[3][4]; // Person類型數(shù)組,里面可以存儲Person類型對象,以及Person類型的子類型都可以。 Person[][] arr = new Person[2][2]; ....
5. 二維數(shù)組的遍歷
for(int i = 0; i < arr.length; i++){ // 外層for循環(huán)負(fù)責(zé)遍歷外面的一維數(shù)組。 // 里面這個for循環(huán)負(fù)責(zé)遍歷二維數(shù)組里面的一維數(shù)組。 for(int j = 0; j < arr[i].length; j++){ System.out.print(arr[i][j]); } // 換行。 System.out.println(); }
6. 數(shù)組的拷貝:System.arraycopy()方法的使用
數(shù)組有一個特點:長度一旦確定,不可變。
所以數(shù)組長度不夠的時候,需要擴容,擴容的機制是:新建一個大數(shù)組,將小數(shù)組中的數(shù)據(jù)拷貝到大數(shù)組,然后小數(shù)組對象被垃圾回收。
補充:
數(shù)組長度為0:
int[] f = {};//數(shù)組長度為0 System.out.println(f.length);//0 int[] g = new int[0];//數(shù)組長度為0 System.out.println(g.length);//0 int[] h = null; //System.out.println(h.length);//空指針異常
到此這篇關(guān)于Java基礎(chǔ)之?dāng)?shù)組詳解的文章就介紹到這了,更多相關(guān)Java數(shù)組內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用mybatis報Invalid bound statement解決分析
這篇文章主要為大家介紹了使用mybatis報Invalid bound statement原因解決分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-12-12SpringBoot常用計量與bean屬性校驗和進制數(shù)據(jù)轉(zhuǎn)換規(guī)則全面分析
這篇文章主要介紹了SpringBoot常用計量、bean屬性校驗與進制數(shù)據(jù)轉(zhuǎn)換規(guī)則,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2022-10-10如何利用Spring把元素解析成BeanDefinition對象
這篇文章主要介紹了如何利用Spring把元素解析成BeanDefinition對象,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-08-08Java Callable接口實現(xiàn)細(xì)節(jié)詳解
這篇文章主要介紹了Java Callable接口實現(xiàn)細(xì)節(jié)詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-05-05