java數據結構

        問題總是在具體需求出現的纔會顯現的,我之前遇到一個需要將一串字符串,按照逗號分隔來,用一個數組來包裝這些數據,很簡單的split功能,返回的就是一個數組。

        可我在這之後想再往裏面添加元素,但是發現你要操作的對象是個數組,而不是一個集合。很尷尬,於是不得不將數組編程集合然後再添加。仔細想想爲什麼數組會那麼不方便,請教了大神,扯到到計算機原理才總結出自己的理解。

        首先,假設有一個數組<E>,在內存空間中是從100開始,長度爲100。記爲a[100,100]那麼理解吧,同時再創建一個從200開始,長度爲100的b,記爲b[200,100]。好,到目前爲止,計算機已經滿足你的需求了。然而你現在發現a添加數據後,有幾個數據放不下,你和計算機說再給我幾個爲止,從200-200+x的位置給我,它能同意嗎?空間都已經給b了。所以,像計算機這種多任務,多線程的東西,必然要存在着線程安全,內存安全這種機制,然而也就是這種機制,約定了一切基於計算機開發的必須按照它的要求來開發。

3個月後的今天,我在再次整理回顧的時候,發現之前的理解還是片面,不完整,現在即將再次完善。首先,我是想通過深入瞭解ArrayList和LinkList這之類的東西,去淺嘗下計算機的數據結構這個東西,不是專業出身的就是那麼的蛋疼......現在就以剛剛的二個爲例子展開分析, 

 * 1.ArrayList是實現了基於動態數組的數據結構,LinkedList基於鏈表的數據結構。

 * 2.對於隨機訪問get和set,ArrayList覺得優於LinkedList,因爲LinkedList要移動指針。

 * 3.對於新增和刪除操作add和remove,LinedList比較佔優勢,因爲ArrayList要移動數據。

好了這個簡單的知道之後,那個引出了2個陌生的東西,數組和鏈表,對於數據結構這種東西,學起來是很枯燥乏味快哭了,但是沒辦法啊,強迫自己至少懂點基礎的吧。

數組是將元素在內存中連續存放,由於每個元素佔用內存相同,可以通過下標迅速訪問數組中任何元素。但是如果要在數組中增加一個元素,需要移動大量元素,在內存中空出一個元素的空間,然後將要增加的元素放在其中。同樣的道理,如果想刪除一個元素,同樣需要移動大量元素去填掉被移動的元素。如果應用需要快速訪問數據,很少或不插入和刪除元素,就應該用數組。

鏈表恰好相反,鏈表中的元素在內存中不是順序存儲的,而是通過存在元素中的指針聯繫到一起。比如:上一個元素有個指針指到下一個元素,以此類推,直到最後一個元素。如果要訪問鏈表中一個元素,需要從第一個元素開始,一直找到需要的元素位置。但是增加和刪除一個元素對於鏈表數據結構就非常簡單了,只要修改元素中的指針就可以了。如果應用需要經常插入和刪除元素你就需要用鏈表數據結構了。

   *C++語言中可以用數組處理一組數據類型相同的數據,但不允許動態定義數組的大小,即在使用數組之前必須確定數組的大小。而在實際應用中,用戶使用數組之前有時無法準確確定數組的大小,只能將數組定義成足夠大小,這樣數組中有些空間可能不被使用,從而造成內存空間的浪費。鏈表是一種常見的數據組織形式,它採用動態分配內存的形式實現。需要時可以用new分配內存空間,不需要時用delete將已分配的空間釋放,不會造成內存空間的浪費。
  (1) 從邏輯結構角度來看
     a, 數組必須事先定義固定的長度(元素個數),不能適應數據動態地增減的情況。當數據增加時,可能超出原先定義的元素個數;當數據減少時,造成內存浪費。
     b,鏈表動態地進行存儲分配,可以適應數據動態地增減的情況,且可以方便地插入、刪除數據項。(數組中插入、刪除數據項時,需要移動其它數據項)
  (2)從內存存儲角度來看
     a,(靜態)數組從棧中分配空間, 對於程序員方便快速,但自由度小。
     b, 鏈表從堆中分配空間, 自由度大但申請管理比較麻煩.

總結下,主要是通過幾個日常的知識,引出了後面的廬山真面目,這不僅僅是爲了寫出來理解,概念性的很容易忘記,寫下來以後也可以瀏覽,補全之類的。非專業出身的更加任重道遠,絕對的,合理估計,會是專業出身的3倍壓力。


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