Java中如何存儲數據的(2)—數組

一、數組基礎

(一)數組的初始化

(1)如何聲明定義一個一維數組

int [] array1;
double [] array2;
boolean [] array3;
string [] array4;
object [] array5;

(2)怎麼初始化一個一維數組?

(a)靜態初始化

		int [] array = {1,2,3,4};

注意:大括號後面是有分號的

(b)動態初始化 

		int [] array = new int[5];//這裏的5表示數組的元素個數,初始化一個5個長度的int類型數組,每一個元素默認值0
		string [] array = new string[6]; //初始化6個長度的String 類型數組,每個元素默認值爲null

(3) 什麼時候採用靜態初始化方式,什麼時候採用動態初始化方式?

當你存儲數組的時候,確定數組中存儲的那些具體的元素的時,採用靜態初始化方式,

當你創建的數組的,不確定將來數組中存儲那些數據,你可以採用動態初始化的方式,預先分配內存空間

(二) 認識數組

(1)Java語言中的數組是一種引用數據類型,不屬於基本數據類型,數組的父類是Object。

(2)數組實際上是一種容器,可以同時容納多個元素。

(3)數組當中可以存儲基本數據類型的數據,也可以存儲引用數據類型的數據。

(4)數組是引用類型,所以數組對象是在堆內存當中的,(數組是存儲在堆當中的)。

(6)對於數組當中存儲的是“java對象”的話,實際上存儲的是對象的"引用(內存地址)"(數組中不能直接存儲Java對象)

  (7)數組一旦創建,長度不可變。

二、數組內存結構

(一)一維內存結構

(1)數組在內存中的存儲原理?

(a)所以數組對象都有length屬性(java自帶),用來獲取數組中元素的個數。

(b)java中的數組要求數組中的元素的類型要統一,比如Int類型數組只能存儲int類型。(存儲的類型統一)

person類型數組只能存儲person類型。

(c)數組在內存方面存儲的時候,數組中的元素內存地址(存儲的每一個元素都是有規則的並且挨着排列的)是連續的,內存地址連續,這是數組存儲元素的特點(特色)。數組實際上是數據結構

(d)所以的數組,都是拿着第一個小方框的內存地址,作爲整個數組對象的內存地址。

(e)數組中每一個元素都是有下標的,下標以0開始,以1遞增,最後一個元素的下標是length-1

(f)下標是非常重要的,因爲我們對數組中元素進行存取的時候,都是需要通過下標進行。 

(2)數組這種數據結構的優點和缺點?

優點:查詢/查找/檢索某個下標上的元素時效率極高,可以說是查詢效率最高的一個數據結構。

爲什麼檢索效率高?

第一:每一個元素的內存地址在空間存儲上是連續的。

第二:每一個元素類型相同,所以佔用空間大小一樣。

第三:知道第一個元素內存地址,知道每一個元素佔用空間的大小,又知道下標。所以通過一個數學表達式就可以計算出某個下標上元素的內存地址。直接通過內存地址定位元素,所以數組的檢索效率是最高的。

數組中存儲100個元素,或者存儲100萬個元素,在元素查詢/檢索方面,效率是相同的,因爲數組中元素查找的時候不會一個一個找,是通過數學表達式計算出來的。(算出一個內存地址,直接定位的)

缺點:

第一 由於爲了保證數組中每一個元素的內存地址連續,所以在數組上隨機刪除或者增加元素的時候,效率極低,因爲隨機增刪元素會涉及到後面元素統一向前或者向後位移的操作。

第二 數組中不能存儲大數據量,爲什麼?

因爲很難在內存空間上找到一塊特別大的連續的內存空間。

注意:對於數組中最後一個元素的增刪,是沒有效率影響的。

(二)二維內存結構

我一直感覺二維數組的內存結構和一維數組的引用類型內存結構特別的像。

三、方法的參數是數組

(1)

packageArray;

public class ArrayTest03{
public static void main(String[]args){
//靜態的方式傳遞
int[]array={1,2,3,4};
show(array);
//採用動態的方式傳遞
int[]array1=newint[6];
show(array1);
}
public static void show(int[]array){
for(inti=0;i<array.length;i++){
System.out.println(array[i]);
}

}
}

(2)如果直接傳遞一個靜態數組

(3)直接採用動態數組的傳遞方式

四、數組的擴容

在java開發中,數組長度一旦確定不可變,那麼數組滿了怎麼辦?
這個時候就需要擴容了。先新建一個大容量的數組,然後將小容量數組中的數據一個一個拷貝到大數組當中。

結論:數組擴容效率較低,因爲涉及到拷貝的問題。所以在以後的開發中請注意:儘可能少的進行數組的拷貝。

可以在創建數組對象的時候預估計一下多長合適,最好預估準確,這樣可以減少數組的擴容次數。提供效率。

 

 內存圖:

例子:

Object [] objs = {new Object(),new Object(),new Object()};
Object [] newobjs = new Object[10];
System.arraycopy(objs,0,newObjs,0,objs.length)

 五、如何進行排序

Arrays工具類的使用

public class ArraysTest{
    public static void main(String[] args){
        //java.util.Arrays;工具類中有哪些方法,我們開發的時候需要參考API幫助文檔
       int [] arr = {3,6,5,12,1,2};
        //排序
        Array.sort(arr);
        //輸出
        for(int i =0; i<arr.length;i++){
            System.out.println(arr[i]);
        }
        //二分查找(建立在排序的基礎之上)
        int index = Arrays.binarySearch(arr,5);
        System.out.println(index == -1? "該元素不存在":"該元素下標是:"+index)
    }
}

總結,其實數組和之前的內容一模一樣,其實並沒有新東西,就比方說在內存圖中的結構和麪向對象引用類一模一樣,存儲數據和變量也沒有什麼不同。只不過把之前的東西總結了成了數組,這樣運用起來可能更加方便一些。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章