關於數據結構和麪向對象


20161030 圖書館301-18
 
今天無意間看到了一個有關hashmap的應用,由於對hashmap並不怎麼了解,就以爲可能會看不懂了吧。但是實際上,沒我想的那麼複雜,hashmap就是個對應關係。就功能方面來說,算不上強大,實現方法也不是很複雜,但是感覺很實用。由此想到數據結構的強大,而我和大部分周圍同學在學習數據結構或者學完數據結構時都不知道這玩楞有什麼用,我也只是最近剛剛懂了數據結構的重要。於是,想寫寫我對數據結構和麪向對象的理解(大神請走開)。
首先還是看看這個hash(hashmap是基於hash表對map接口的實現)。有各種中譯名,比如哈什表、哈希表,更過分的也有叫散列表的,我大一下用的課本上就叫散列表。在這裏吐槽一下當前各種計算機方面的中譯名。首先不同的老師都有各自的叫法,一個老師,自己對一個東西也有不同的叫法,讓後輩們在交流時,明明是在說同一個東西,但是大家都不知道對方在說什麼,有時候老師這節課用“散列表”說,下節課說“哈希表”,學生還以爲講了新課,在網上找資料也是很費勁。其次,對單詞的翻譯過於裝逼以致晦澀,這就好像很多家長給孩子起名字非要在字典裏找那些連自己都不認識的不常見字以示自己很有學問,當然這還可以忍,畢竟是父母對孩子的一種期盼。但是散列表,什麼是散列表,好像只知道是個什麼表,但是什麼是散列,反正我現在也不知道。所以呢,本文就用hashmap的原名——hashmap。
開頭跑題兩分鐘,下面再次進入正題 ,看看這個hashmap。碼就不現寫了,主要看看有什麼用,以及實現機制。
java裏有個叫hashmap的類,有這樣的用處,當信息量比較大且信息之間有兩兩對應的關聯時,比如一個網站有很多賬戶,每個賬戶有賬號和密碼,如果單純用String來存這些信息,在密碼驗證的時候,就很費勁,一個蘿蔔一個坑,哪個纔是我的坑?但是如果用一個String數組,好像就能方便一點,在用戶註冊的時候,把賬戶的密碼存在賬號後面,這樣在驗證的時候,就可以先找到賬號,然後比較一下賬號後面的String和輸入的String是否一樣,就O了。但是,由於數組在插入刪除方面天然的劣勢(每刪一個元素,都要將後面的每一個元素往前移,當賬戶有很多的時候……),必然是不能用數組來存的,或者要寫很複雜很複雜的算法,來回調用以提高效率。這個時候其實可以考慮一下用鏈表的方法,單鏈表就行。用一個結構體(先不用類,類的實現都是後話了),存兩個String(賬號和密碼),一個引用(下一個結構體的地址,c相關語言裏也叫指針,但是java等其他語言裏沒有指針的概念,所以,這裏就用引用這個概念吧)。這樣賬號和密碼就可以永遠幸福快樂地生活在一起了,這樣是不是方便多了?想象一下結構體的出現會給編程從業者(這裏不叫程序猿,因爲當時會編程,基本可以叫科學家)帶來怎樣的福音(再扯一點題外話,其實真的是福音嗎?並不是,技術的進步都是伴隨着慘烈的犧牲,比如蒸汽機的發明,會使多少手工生產者失業以至於餓死?二戰又是怎麼爆發的?結構體是方便了編程,同時也降低了編程的門檻,以前很高智商的人才會編程,現在是個人都能編程,所以……?科學家淪爲程序猿。科學技術的進步真的能推動人類的進步並使人類過上更美好的生活嗎?也許會有人認爲前人的犧牲是爲後人更好的生活,像現在我們就過得很好,但是萬一明天又有革命性的科學進步呢?萬一明天遼科大的老師發明了時光穿梭機?…………??然後又過了若干年後,時光穿梭機也成爲人們的日用品後,會不會又有科技的 革 命 性 進步?你總不會以爲科技的發展會有盡頭吧)。回來,剛纔說到福音,不管對編程從業者來說是怎樣的體驗,單單就編程這一方面來說,還是較大的進步。
其實,上面說的那個有兩個String和一個引用的結構體已經算得上是一個數據結構了,是一個很簡單的數據結構。然後現在我們調用指針回到文章的開頭,hash。
開頭說要介紹hashmap的用處和實現機制,其實用處和機制都已經說了,和上面那個很簡單的結構體差不多,把賬號和密碼放在一起,當一個xx在門口叫"賬號,你給我出來”時,賬號就可以對躺在牀上的密碼說“老公,外面有人叫我,我好怕,你陪我一起出來吧”,hashmap就是實現這樣的兩兩對應關係。
看到這裏,可能還有人沒想到我說的數據結構和書上的數據結構有什麼關係,”沒什麼相似點啊,書上的數據結構都是類啊,還有很多函數(方法)“,簡單解釋一下,書上的數據結構不是“一個很簡單的數據結構”[偷笑]。回到正題,如果我把那兩個String和一個引用放在一個類(比如就叫account類)裏,然後,這個類可以放很多方法(函數),這些方法可以實現很多功能,其中一個功能(方法、函數)可以寫成這樣:當賬號、密碼作爲參數傳來時,在方法體裏,首先先通過遍歷找到含有傳來賬號的那個”賬號-密碼“對,然後比較傳來密碼和”賬號-密碼“對裏的密碼,如果一樣,返回(return)”密碼正確“,否則返回”密碼錯誤“。這樣,在用這個用戶系統的時候,就不用編寫專門的算法來獲取、驗證密碼,只需要穿過去兩個參數就行了。而且,這個”賬號系統“是可以移植的,遊戲的賬號系統可以這麼用,學生成績單系統也可以這麼用,這就大大提高了代碼的可重用性,如果說結構體的出現,讓科學家變成技術員,那麼類的出現,技術員就變成了碼農,或者程序猿。(前幾天我買了一本用c寫的數據結構,boom)。課本上的數據結構功能很強大,很實用,但是有一點很多同學都不明白,因爲,像鏈表或者隊列等其他的一些數據結構,一般的編程語言裏都提供了封裝好的類,爲什麼還要我們自己寫?這是因爲,練習編寫那些東西,能幫助我們更深入理解數據結構的原理,鍛鍊剛剛會打點c代碼的我們的編程能力,最重要的一點,學會如何自己創建一個適合各種情景的數據結構。
其實剛纔把那個“驗證密碼”的功能添加到account類裏時,我們已經進入了文章的第二部分,面向對象。
還是先跑題三分鐘,很多外行人都認爲程序猿大都沒有感情思維,其中有很多都是沒有對象的單身狗,然而,我想說,對象能幹什麼?有個很傻的xx回答給我說:把“什麼”去掉。這個人平日裏淨說胡話,我一句都聽不懂。再說,我隨手寫上幾行代碼,對象想來多少就有多少。你以爲我的“對象”們什麼都沒有很虛無嗎?其實不是,你可以看看我的一個很普通的對象——elizabeth(光聽名字是不是就已經石更了?):

privite class mazi{
  String name=new String(“elizabeth”);
  String 外貌=new String(”美若天仙“);
  char 找杯=‘e’;//我從不打錯別字
  String 性格=new String(int n){//這裏做個String類重載
  if(n==1)
    return “外向活潑型”;
  else
    return “溫柔體貼型”;
  };
  boolean 是否對我百般服從=“true”;
  String 陪我玩(){
    return “來呀~~快活呀~~~~反正有~~~~大把時光~~~~~~”;
  }
};

我還有很多車,比如我的這輛
private class Car{
……//不用我說你都知道有多屌
};

而我的生活是這樣的
private class mylife{
  Car car[]={“布加迪威龍”,“科尼塞克”,“邁巴赫”,……(還有幾輛寶馬奔馳那樣的雜牌車我就不說了)};
  mazi mazi1=new mazi(”elizabeth“);
  mazi mazi2=new mazi(”angelababy“);
  ……(還有很多);
  void 早上(){
    開車去東北,帶6個mazi,開邁巴赫;
  }
  void 中午(){
    讓6個mazi揹我回家,並且把邁巴赫砸了;
  }
  void 晚上(){
    ……;
  }
};

如果沒有面向對象,你是否覺得這些這些牛逼很難吹出來?或者,很難吹出來這些美麗的牛逼。
面向對象就是一個假想的世界模型,你根本不用去想用什麼算法實現什麼樣的功能,你只要知道各種”對象“(什麼是對象?萬物皆對象)可以幹什麼,並寫出來,當你在編程的時候不知道某一步該怎樣的時候,你只要想想在真正的生活中,是怎樣的。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章