閱讀874 返回首頁    go windows


《數據結構與抽象:Java語言描述(原書第4版)》一2.2.1 可變大小數組

本節書摘來華章計算機《數據結構與抽象:Java語言描述(原書第4版)》一書中的第2章 ,第2.2.1節,[美]弗蘭克M.卡拉諾(Frank M. Carrano) 蒂莫西M.亨利(Timothy M. Henry) 著 羅得島大學  新英格蘭理工學院 辛運幃 饒一梅 譯 更多章節內容可以訪問雲棲社區“華章計算機”公眾號查看。

2.2.1 可變大小數組

策略。當教室滿了時,能容納更多學生的一種辦法是移到一間更大的教室。用類似的方式,當數組滿了時,可以將它的內容移到一個更大的數組中。這個過程稱為調整(resizing)數組大小。圖2-7顯示兩個數組:一個是有5個連續內存單元的原始數組,另一個數組(兩倍於原始數組大小)在計算機的另一塊內存中。如果將數據從原始的小數組中複製到新的大數組的開頭部分,得到的結果像是擴展了原來的數組一樣。這種機製的唯一不足是新數組的名字:你想讓它與原始數組同名。馬上就會看到如何完成這個工作。

image

細節。假定已有myArray指向的數組,如圖2-8a所示。我們先定義一個別名oldArray,它也指向這個數組,如圖2-8b所示。下一步是創建一個比原始數組更大的新數組,讓myArray指向這個新數組。如圖2-8c所示,一般地新數組要兩倍於原始數組的大小。最後一步是將原始數組的內容複製到新數組中(見圖2-8d),然後丟棄原始數組(見圖2-8e)。下列偽代碼概括了這些步驟:

image

圖2-8 a)一個數組;b)指向同一數組的兩個引用;c)原始數組變量現在指向新的更大的數組;d)原始數組中的項複製到新數組中;e)丟棄原始數組

注:當數組不再被引用時,它的內存在垃圾回收時被收回,就像是對其他對象發生的那樣。
代碼。將前麵的偽代碼轉換為Java時,可以使用Java類庫中的方法Arrays.copyOf (sourceArray, newLength)來做很多事情。例如,對如下的簡單整數數組進行操作:
image

此時,myArray指向一個數組,如圖2-9a所示。接下來,調用Arrays.copyOf。將變量myArray中的引用賦給這個方法的第一個參數sourceArray,如圖2-9b所示。接下來,方法創建一個新的更大的數組,並將參數數組中的項複製給它(見圖2-9c)。最後,方法返回指向新數組的一個引用(見圖2-9d),我們將這個引用賦給myArray(見圖2-9e)。下麵的語句執行這些步驟:
image

圖2-9 語句myArray = Arrays.copyOf(myArray, 2 * myArray.length);的效果。a)參數數組;
b)指向參數數組的參數;c)獲得參數數組內容的新的更大的數組;d)指向新數組的返回值;
e)將返回值賦給參數變量

注:圖2-9中的數組含有整數。這些整數是基本類型值,且像這樣占據數組中的位置。與之相對,例如圖2-6中的數組,含有指向對象的引用而不是對象本身。

調整數組的大小或許沒有第一眼看上去這樣有吸引力。每次擴展數組的大小時,必須複製它的內容。如果每次需要數組外的一個額外空間而讓數組增大一個元素,則這個過程將耗時過大。例如,如果含50個元素的數組滿了,為了容納另一個項,需要將數組複製到有51個元素的數組中。再添加一項時又會要求你將含有51個元素的數組複製到含有52個元素的數組中,以此類推。每次添加都會導致複製數組。如果在原含有50個項的數組中添加100項,則要複製100次數組。
另一種做法是將數組擴展m個元素,將複製開銷分攤在m次添加上而不是集中在一次上。每次當數組滿時倍增它的大小,這是一種典型的方法。
例如,當在含有50個項的滿數組中添加一項時,在進行添加前先將50個元素的數組複製到100個元素的數組中。那麼接下來的49次添加都可以快速完成而不需要複製數組。所以數組複製隻需一次。

程序設計技巧:當增大數組時,將它的項複製到更大的數組中。應該充分地擴展數組,以減少複製代價的影響。常用的辦法是倍增數組大小。
注:說“調整數組的大小”實際上是用詞不當,因為數組的長度不會改變。調整數組大小的過程是創建了一個含有原始數組項的全新數組。給新數組與原始數組一樣的名字——換句話說,指向新數組的引用賦給指向原始數組引用的變量。然後丟棄原始數組。
注:引入一個類
若一個類使用了Java類庫中的類,則它的定義前必須有import語句。例如,要使用類Arrays,應該將下麵的語句寫在你的類定義和描述性注釋之前:
image

有些程序員將這條語句中的Arrays替換為星號,目的是在程序中可以使用包java.util中的所有類。

自測題18 考慮下列語句定義的字符串數組:
image

為數組text增大5個元素的容量且不改變當前內容的Java語句是什麼?
自測題19 考慮字符串數組text。如果放到這個數組中的字符串的個數小於它的長度(容量),你如何減少數組的長度而不改變它的當前內容?假定字符串的個數保存在變量size中。

最後更新:2017-06-26 17:32:53

  上一篇:go  免費商城網站模板與付費商城網站模板的區別?
  下一篇:go  PostgreSQL · 實現分析 · PostgreSQL 10.0 並行查詢和外部表的結合