前兩天申請了第一個專欄系列,今天一看已經申請成功了,有點小激動...申請寫這個專欄系列的初衷源于:
在去年公司的某個項目告一段落的時候,終于有時間閑下來,回顧一下自己畢業進入工作這一年多來的情況。
然后警惕的發現,有這樣一種潛在的危險情況,讓我感到迷茫和困擾。那就是,作為一名菜鳥程序員,我發現:
也許我們能夠通過自身所學習的技術與知識,來完成工作中的一些任務。
但是!值得警惕!這并不意味著我們真的已經“掌握”了這門技術。
"使用"和“掌握”是兩回事,而“掌握”和“精通”又有了一道巨大的鴻溝。
如果你和我一樣,也是一名經驗尚淺的菜鳥,你不妨你也可以坐下來想想,是不是也常有這樣一種困擾。
作為一名Java語言的使用者,我們都知道通過:
~~~
String str = new String("abc")
~~~
這樣的方式能夠聲明一個字符串對象。但是!當你遇到類似于:
通過String str = new String("abc")在內存中產生了幾個對象?這樣的面試題時。
是不是會突然間感到措手不及。而當看到答案是:1個或2個的時候,就更加惆悵了。
實際上這是因為涉及到了內存中的字符串常量池。
JVM在裝載運行一段程序時,如果遇到通過關鍵字new聲明的String類型對象,其首先會檢測字符串常量池中是否已經存在一個值為"abc"的對象。
如果常量池中還不存在,那么會首先向常量池中存儲進一個"abc"字符串對象,然后再向堆內存中存儲進一個"abc"字符串對象。
而如果常量池已經存在該對象,則會直接產生一個"abc"字符串對象存儲進堆內存當中。所以答案會是:一個或兩個。
又例如:當使用迭代器對一個集合容器進行迭代,如下:
~~~
ArrayList<String> strList = new ArrayList<String>();
Iterator<String> it = strList.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
~~~
但可能你在查看Java的某些源碼的時候,可能發現別人使用這樣的書寫方式:
~~~
ArrayList<String> strList = new ArrayList<String>();
for (Iterator<String> it = strList.iterator(); it.hasNext();) {
System.out.println(it.next());
}
~~~
那兩者之間的差別在哪呢?就實現的功能來說,完全沒有任何的區別。其區別在于:
使用第一種方式,等同于你在該方法內聲明了一個Iterator類型的局部變量,于是當該方法開始運行后,該局部變量也會進入到棧內存當中進行存儲,直到隨著該方法的執行結束而彈棧,完成內存釋放。
而使用第二種方式,等同于在for循環的代碼塊中聲明了一個局部變量,在該for循環結束之后,該局部變量就會從內存中釋放,而不必等到該方法的結束。
所以其好處實際在于,從一定程度上,減少了內存開銷。
出現的這樣的情況,似乎不難預見。其根本還是在于我們學習一樣新事物時的目的性。舉例來說:
在學生時代老師在講解某道難題時會說:大家盡量理解,如果實在無法理解,那么就記住這個方法,以后遇到類似的題目,記得使用這樣的方法就行。
這沒有問題,因為在中國特色的教學體制下,學生時代里大多數人的根本目的在于應對考試,你不能明白解題的原理不要緊,只要你能記住這個方法在考試中答對答案就行。
同理,當你作為一個菜鳥,一個初學者接觸一門編程語言時,我們首先關心的是,使用這門語言我們能夠實現什么功能。當我們畢業時,我們的首要目的在于找到一份工作。在這樣的情況下,造成類似上述"情況”的出現,也就不足為奇了。
所以當我逐漸被類似于這樣的情況困擾的時候,我不得不開始思考一個問題:我是否有必要重新深入的學習一下Java了?最后得到的答案是肯定的:
假設你想成為一名車手,那么首先你應該知道“如何駕駛車輛”,例如:可以通過方向盤控制汽車的方向,可以通過剎車讓汽車停止運行,可以通過油門讓汽車加速等等。但這不過是成為一名車手的基本素質而已。當你慢慢積累的過程中,你應該思考的是:“我如何能成為比其它人更優秀的車手”。于是你想到了:“我要比其它人更快”!這絕對是一個好的方式。但是問題來了?如果你不了解一輛汽車的原理,而只是僅僅知道“可以通過方向盤控制汽車的方向”這樣的東西時,你要如何才能將你的汽車改造的比其他人更快呢?
那么,同樣的:作為一名程序員,通過你學習的語言或技術來完成某樣功能,這只是一名程序員所必備的素質而已。同樣的一個功能,你需要20行代碼來實現;而另一個人只需要5行。同樣的一段計算程序,你的代碼需要1分鐘完成運算;而別人的只需要10秒。這就是體現價值與差距的地方了。所以說”使用“,“掌握”,“精通”,這是完全不一樣的概念。
有了計劃,接下來就是付諸行動。于是開始通過一些書籍和相關資料,開始重新深入的學習Java。學習主要是利用平時空余的時間,斷斷續續從去年10月底到今年年初,現在再回望一眼,的確收獲頗豐。中間也寫了一些學習總結性質的博客,但比較散亂,不夠系統,更不夠深入和細致。這就又有悖于我的初衷了。就好比我的初衷原本是:我做了一道數學題,然后我要理解這道為何是這樣解答的,然后把解題思路和原理記錄下來。結果最終變成了:我做了一道數學題,沒有記錄其解題思路和原理,反而將這道題靠著記憶在紙上重新默寫了一遍。
于是,索性申請了一個專欄系列:
- **新的視角**:以更加細致和深入的角度記錄知識結點,完成更系統性的總結歸納。也算是自己做一次系統的記憶鞏固。
- 如果和我一樣的菜鳥有緣看到了謀篇文章,希望能給您帶來一點點幫助;而如果您發現了問題,也希望不吝指出。
所以,如果你和我一樣,是一個經驗尚淺的菜鳥,就讓我們一起用一個小菜鳥的新視角,重走這J2SE之路。
- 前言
- 第一個專欄《重走J2SE之路》,你是否和我有一樣的困擾?
- 磨刀不誤砍材工 - 環境搭建(為什么要配置環境變量)
- 磨刀不誤砍材工 - Java的基礎語言要素(定義良好的標示符)
- 磨刀不誤砍材工 - Java的基礎語言要素(關鍵字)
- 磨刀不誤砍材工 - Java的基礎語言要素(注釋-生成你自己的API說明文檔)
- 磨刀不誤砍材工 - Java的基礎語言要素(從變量/常量切入,看8種基本數據類型)
- 磨刀不誤砍材工 - Java的基礎語言要素(運算符和表達式的應用)
- 磨刀不誤砍材工 - Java的基礎語言要素(語句-深入理解)
- 磨刀不誤砍材工 - Java的基礎語言要素(數組)
- 換一個視角看事務 - 用&quot;Java語言&quot;寫&quot;作文&quot;
- 牛刀小試 - 淺析Java的繼承與動態綁定
- 牛刀小試 - 詳解Java中的接口與內部類的使用
- 牛刀小試 - 趣談Java中的異常處理
- 牛刀小試 - 詳解Java多線程
- 牛刀小試 - 淺析Java集合框架的使用
- 牛刀小試 - Java泛型程序設計
- 牛刀小試 - 詳細總結Java-IO流的使用