標籤:try port 資料結構 logs 為什麼 遍曆 資料 物件導向 dma
初識JAVA是在大一上學期期末,主要是從慕課上學習JAVA的基本文法。其實感覺大可不必,大一下學期在資料結構課上對C語言的深度學習,其實已經將C語言的文法結構瞭解透徹,資料結構也有了更加深入的理解。而JAVA在文法上與C語言大同小異,而其核心是物件導向。
JAVA給我印象最深的地方就是各種各樣的方法。這讓我能夠更加關注程式要實現什麼,而不用花過多的時間糾結於基本的資料結構。
在資料結構課程上,我們要花大量的時間搞明白各種資料結構的實現方法。就拿圖來說,我們關注二叉樹。二叉樹如何產生、如何遍曆、如何插入,這些基礎但繁瑣的代碼都是我們自己一行一行的敲出來的,然而JAVA豐富多樣的內庫為我們省下了很多構建基礎資料結構實現代碼的時間,讓我們能夠更加專註於項目而非程式。還是拿圖來說,雖然只接觸了HashMap,但我已經為JAVA方法的豐富所深深震撼。
構建一個雜湊圖很簡單:
1 HashMap<String, Integer> map = new HashMap<String, Integer>();
這裡我們建立了一個Key值為String類型,value值為Int類型的雜湊圖。
對雜湊圖的操作,JAVA提供了豐富多彩的方法,我自己最常用到的是下面幾個:
1 this.map.containsKey(key) //<是否含有key>2 this.map.get(key) //<擷取key的value>3 this.map.put(key,value) //<插入資料>4 this.map.replace(key,value) //<替換資料>
然後就是對HashMap的排序了,一般來說,將排序的結構儲存到ArrayList中,實現代碼如下:
1 public ArrayList<Entry<String, Integer>> sortmap(HashMap<String, Integer> oldmap){2 ArrayList<Entry<String, Integer>> list = new ArrayList<Entry<String, Integer>>(oldmap.entrySet());3 Collections.sort(list, new Comparator<Map.Entry<String, Integer>>(){4 public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2){5 return (o2.getValue() - o1.getValue());6 }7 });8 return list;9 }
這裡要說的是HashMap的Entry,代表的是<Key,Value>構成的資料實體,想要使用它,不能簡單這樣做
1 import java.util.Map;
而要匯入這個:
1 import java.util.Map.Entry;
這樣就能使用Entry了,排序的實現順序是這樣的:
1 構建ArrayList(通過Entry) --> 使用Collection方法對ArrayList進行排序(通過自訂的Comparator比較子實現)
需要注意的是,對HashMap自身進行排序是沒有意義的,我們只能擷取排序結果而不能改變HashMap本身的資料結構。
感覺上面的稱述有些繁瑣了,但自我感覺HashMap這個資料結構的快速與強大,而JAVA內建的方法也讓其如虎添翼。
好吧,我應該詳細講講自己在物件導向方面的收穫與感受的。
第一點:無論如何不要將class中的資料設定為public,這是物件導向的大忌。
設定為public就意味著使用者可以隨意修改你程式的資料,這是十分危險而且不可接收的,老師用一個例子生動的闡述了這一點。
比如,我們現在構造一個很簡單的類getVolumn,使用者輸入長、寬、高,通過這個類計算出長方體的體積。
好的,要實現這個目的,我們需要建立一個volumn對不對?
1 public double volumn;
這樣一來,壞了。我們這樣:
1 gotVolumn myvol = new getVolumn(); //a,b,c分別為長寬高2 myvol.a = 100;3 myvol.b = 1;4 myvol.c = 2;5 myvol.calculate();6 myvol.vol = 300;7 System.out.println("the volumn is : ",myvol.vol);
這個輸出結果是啥?顯然是300和原來的結果200根本不相符。所以說,讓使用者能夠直接修改資料是很危險的,而我們應該做的就是將資料封裝起來。
最簡單的封裝當然就是構造所謂的setter()和getter()方法,當然,這是為了讓你明白封裝的原理,真正寫程式的時候,只要滿足:
1 private/protected 資料類型 變數名;
就基本OK了,然後通過類的各種方法修改變數的值。其本質就是限制使用者對程式的行為,讓使用者只能通過程式規定的方法擷取或修改資料,大大提高程式的安全性。
第二點,繼承
為什麼要繼承?繼承可以看成對類功能的擴充。在繼承原有類的基礎上,進一步擴充。這樣的效果就是讓一個類能更專註於實現本類的功能,讓這個類不太累,從而提升程式的運行效率。
繼承的實現方法如下:
1 public class 本類 extends 被繼承類{2 方法1;3 方法2; 4 }
繼承後,需要注意的是構造方法:
1.對於被繼承類無參的構造方法,不需要任何特殊操作(實際上是編譯器自動產生super());2.對於被繼承類有參的構造方法,需要在本類構造方法的<第一行>調用:super(參數1,參數2,參數3,···);
繼承之後,本類可以直接使用被繼承類中的方法和protected資料。
繼承方面實際上作為初學者我瞭解和使用的並不多,但它的讓一個類更專註別太忙什麼都乾的思想確實讓我很受用。
第三點、多態,說實在的,多態雖然瞭解,但我還沒有用到一次,水平有限,嘿嘿。
第四點、介面。
如何建立介面呢?
這樣就可以建立介面了,介面專註與程式應該實現什麼方法,而不是如何?這些方法,可以說,介面是一個規範。
來一個小小的安利:
可以看到,介面根本不用管怎麼實現方法,甚至連{}都扔了,對於介面中規定的方法,可以這樣實現:
可以看到,執行個體化之後,直接使用介面中的方法就OK了,如果多個類實現了介面中的方法,直接對介面執行個體化,這樣就能讓代碼顯得更簡潔,同時,這也是多態的一個體現。
到這裡,對物件導向的感想就結束了,其實比起物件導向,我更喜歡JAVA豐富多彩的類庫和各種各樣的方法。
投入JAVA的懷抱之後無法自拔了,使用JAVA不僅提高了寫程式的速度,也提高了程式的品質,有物件導向的規範,還有通過構造不同的類實現不同的功能,以及JAVA整合的資料結構,讓代碼更加簡潔高效。
作為一位初學者,我的感觸也就這些了,並不多,但覺得是我個人代碼能力提高的一個裡程碑吧。
畢竟以後還要跟各種各樣的學習內容打交道,還要寫各種各樣功能的程式,但一句話:
JAVA,讓寫程式更簡單!
JAVA 學習筆記