1. 程式人生 > >【數據結構】之順序表(Java語言描述)

【數據結構】之順序表(Java語言描述)

arraylist 表數據 nbsp real 不同 1.5 根據 長度 tar

  之前總結過使用C語言描述的順序表數據結構。在C語言類庫中沒有為我們提供順序表的數據結構,因此我們需要自己手寫,詳細的有關順序表的數據結構描述和C語言代碼請見【我的這篇文章】。

  在Java語言的JDK中,為我們提供了專門的順序表的數據結構API—— ArrayList

  Java中的ArrayList的基本存儲思路和C語言中的思路相似,即將所有元素存儲在一個數組中,當數組中的元素個數達到某種標準時,就要擴容。由於順序表中的其他操作在Java和C中的實現方式大同小異,因此,本文不再詳細介紹這些操作,而是著重介紹Java中的順序表擴容思想。

  Java中的擴容方式和C語言中的擴容方式有所不同,原因是C語言可以直接操作內存,而Java語言不能直接操作內存。

  C語言中的擴容操作是通過 realloc() 方法來實現的,realloc()方法的執行思路是:先計算得到擴容之後用戶想要的容量,然後在內存中判斷該數組當前已經占有的空間及其後與之相鄰的空閑內存空間之和是否滿足用戶想要的擴容結果,如果滿足,則在原來內存的基礎上直接擴容,否則,才考慮重新選擇一片連續的內存空間,重新創建數組,並將原數組中的所有數據都移植到新數組中去。通過上面的介紹可以看出,C語言中對於數組擴容的操作,並不是每一次都會重新分配內存空間。

  Java語言不像C語言,它不可以控制內存,因此,在Java語言中,要想對一個數組進行擴容操作,就必須要重新創建一個新的數組,並將原數組中的內容移植到新數組中。可見,單純在數組擴容這一點上,Java的性能會略低於C語言。

  Java中ArrayList的擴容流程具體如下:

(1)判斷是否需要擴充長度;
(2)如果需要擴充長度,則根據新的長度,判斷新長度是否大於舊長度的1.5倍(即擴容是否超過一半);
(3)如果擴容超過一半,則直接擴充到新長度;否則擴充原來長度的一半;
(4)新建一個數組,長度定義為新長度;
(5)將舊數組中的數據都移動到新數組中,完成數組的擴容。

【數據結構】之順序表(Java語言描述)