什麼纔是java的基礎知識?

近日裏,不少人邀請我回答各類j2ee開發的初級問題,我無一都強調java初學者要先紮實本身的基礎知識,那什麼纔是java的基礎知識?又怎麼樣纔算掌握了java的基礎知識呢?這個問題還真值得仔細思考。
我作j2ee開發已經超過十載,做爲過來人,心路歷程估計和你們差很少。編碼的前幾年,很長一段時間以爲java簡單,開發實現各類功能都很輕鬆,代碼寫起來根本不費勁(主要是由於寫的代碼都是一些功能業務邏輯)。但同時本身內心明白,本身其實沒有什麼水平,本身這3,4年以來學懂的東西就那麼多,其餘人幾個月就能夠學會,本身的競爭力在哪裏?這種矛盾的心理,困擾了我很是長的時間,很是的苦惱!總有一種報國無門無處發力的感受。
這個時期,熱衷了使用各類框架,各類api,常以今天學習了某個api,組件,框架的使用就以爲本身學到了東西,設計模式也看過不止一次,但都沒有啥感受。一方面很努力學習,一方面又以爲不踏實,由於例如這個api我知道而你不知道,但我告訴你以後你就知道了,那我比你的優點在哪裏呢?苦惱*2
過了很長一段這種惶惶不可終日的日子,決定本身要改變,改變的方向就是閱讀本身用到的java相關的源代碼,看看jdk是如何實現的。就從基本的數據結構看,而後看多線程相關,在學習前臺等等。寫的代碼仍是那些代碼,代碼仍是那麼簡單,但我力求作到知道代碼背後的真相,這就是我最開始努力的方向。因而再也不把時間都花在追求各類新框架、新API的使用上,天天都花時間在看實現原理上。就這樣過了大半年左右,終於再也不迷茫,不會在以爲本身只懂api的使用,以爲本身沒有那麼膚淺了,說脫胎換骨也不爲過。那段時間,是我成長最快的時期,也是最充實的一段時光。css

Talk is cheap,show me the code。舉例說明你們會比較有感受。
如學習了hashmap的源代碼知道了工做原理以後,使用hashmap
Map map = new HashMap<>();
代碼仍是那個代碼,但我已經知道了hashmap背後的東西
1.數據結構是鏈表的數組(注:後面的版本爲了提高性能,已是改爲鏈表或者樹(節點較多)了)
2.思想上是空間換時間的算法
3.構造函數上有容量和負載因子2個參數以及做用
4.決定性能的是key的hashcode是否夠快、結果夠分散(不分散就會變成鏈表的性能了),和擴容的開銷(何時擴容,和負載因子有關)
而後寫代碼的時候,若是知道了最終的容量(尤爲是數據量大的時候),我都會指定初始化容量,相似以下
List list = doSomeThing();
Map map = new HashMap<>((int)(list.size()/0.75));//0.75爲默認負載因子
若是工做中某個map使用特別多,性能還須要繼續優化,我就會考慮從如下方面優化
1.若是key是本身定義的對象,那麼hashcode方法是否夠快(最少應該緩存保證只計算一次,並且放入以後不能改變,決定hashcode的字段不能改變)? hash的結果是否夠分散?
2.能夠考慮調小負載因子,花更多的空間來換時間
學習源代碼的時候,特別有意思,你會強烈感受到一個詞:觸類旁通!舉一反三!學習api使用的時候,若是你只知道使用不知道原理,很難觸類旁通,感受的是死記硬背。但學習了原理以後,知識成體系後,很容易觸類旁通,學的越多就容易,仍是以hashmap爲例,我舉一個hashmap反三個點。html

  1. 你會知道但凡是有數組的數據結構,構造函數都有一個容量的初始化參數(或者說構造函數有初始化容量的可能都是數組的數據結構)。構造函數以下
    public ArrayList(int initialCapacity) //LinkedList不是數組就沒有public HashMap(int initialCapacity) public StringBuffer(int capacity)
    你就會知道,數組擴容很耗性能(數據量大容易oom),儘可能指定容量。
  2. 算法是空間換時間,還有沒有其餘算法是這種思想的?你最少能找到一個桶排序。
  3. 數據庫的分庫分表,思路和hashmap大同小異
  4. 各類分佈式的hash一致性算法,第一步都是建立一個最大的數組(Integer.MAX_VALUE),就是避免了hashmap最耗性能的擴容運算。
    學習了hashmap以後,你很天然就會去了解其餘的map,如TreeMap,LinkedHashmap(超級有用),HashTable,ConcurrentSkipListMap(算法思路頗有意思),ConcurrentHashMap等,你會知道set就是用map作的,都不須要學。到了這步,map相關就能夠暫告一段落。
    在學習中,我發現思想上的東西是最重要的,你理解了思想,一會兒就豁然開朗了,在也不須要死記硬背了。如學習CAS的時候,你們都知道這是一種指令級的免鎖實現。看代碼的時候,我一度疑惑爲何會有個while死循環(原諒我天資駑鈍)
    public final int getAndUpdate(IntUnaryOperator updateFunction) {
    int prev, next;
     do {
         prev = get();
         next = updateFunction.applyAsInt(prev);
     } while (!compareAndSet(prev, next));
     return prev;複製代碼
    }
    後來從思想上理解,才知道樂觀鎖的概念,就是很樂觀,假設你不會出錯,但你要是出錯了我就重試有辦法給你修復,對應的就是悲觀鎖,就是很悲觀,以爲不鎖就會出錯,如synchronize關鍵字和reentrantlock。這體現了2種不一樣大相徑庭的管理思想。這種思想常常體如今多個系統集成的設計,有些時候若是你用悲觀的思想設計,實現起來很麻煩或者沒法實現,但若是你用樂觀的思想,減小出錯條件,而後出錯了能解決,代價就會小不少。
    說了這麼多,我想說的就是,j2ee的基礎知識就是你作項目中代碼背後的東西。提升本身水平的方法很簡單,就是把大部分時間去了解實現原理,瞭解思想,讓本身的知識串起來,造成體系。j2ee的知識特別多,學得人想哭,千萬不要一開始把時間花在各類框架、組件的使用上,在我看來那是本末倒置。簡單來講:先修內功再練招式。

我以爲重要的、工做會用獲得的知識就是一個請求從前臺到後臺處理的過程須要用到的東西,最少包括如下點:js,html,css,ajax,ajax跨域,跨站腳本,web緩存,web優化,nginx,apache做用,鑑權方式,cookie,session,servlet,filter,基本數據結構,線程池,線程併發,緩存,io等等,知識點很是多。如你前臺用jq,你應該瞭解他的選擇器和ajax是如何實現的(其實去了解就會發現不復雜)?而不是隻是會用。後臺你用springmvc,你要了解他是如何工做,每個配置是作什麼,爲何?java

j2ee知識點特別多,每個都能寫不少,我也在不斷學習中。具體要寫我還真不知道如何下手,我就列舉一下我以爲基礎的東西(面試的時候問的問題),有簡單有難,你以爲偏多是你沒有作過這塊的開發或者作得比較淺:
1.map有哪些,特色和使用場景?(只知道hashmap,hashtable是不夠的。。。)
2.哪些方面會影響hashmap的性能?
3.線程安全的map有哪些,concurrenthashmap是如何實現線程安全的(jdk1.8大不一樣)?
4.鎖有哪幾種?
5.公平鎖,讀寫鎖等如何實現?
6.synchronize能加在哪些地方?什麼區別?
7.死鎖的造成條件?如今不多死鎖了,不多問
8.原子數據對象的原理?
9.reentrantlock相關知識,condition如何使用?(很重要的知識點,強烈推薦閱讀ArrayBlockingQueue源碼,教科書般)
10.volatile的相關知識(內存屏障,重排)
11.ThreadLocal原理和使用?(超級有用的知識點,工做中使用不少,讓代碼漂亮不少,後面專門開貼寫)
12.多個線程同步等待?(CountDownLatch,CyclicBarrier,Semaphore信號量不少語言都有,實際上使用不是不少,線程池就能夠實現大部分等待功能)
13.線程池?(種類,重要的方法,這個通常是使用層面,簡單)
14.動態代理?反射?內省?(考察知識面)
15.session相關知識?和cookie關係?分佈式session實現原理?
16.cookie相關知識?有哪些屬性?(有些屬性頗有用,只是咱們不多留意而已!)
17.nginx,apache 實際項目能作哪些?(鑑權,轉發,緩存,反向代理等)和tomcat什麼關係?最少了解
18.ajax跨域緣由?解決方式?(重點知識,作SE避免不了的問題。這裏不少知識點。)
19.jsonp原理?後臺須要改動嗎?(jsonp雖然如今落伍了,但仍是會問問)
20.web優化知識點?(常規知識點)
21.前臺緩存相關?(200cache,304,ajax緩存,如何實現緩存)
一列舉就根本停不下來了。。。其餘的spring框架的東西也不少,還有jvm的東西,系統集成相關,數據庫相關,io作得不多也不懂問,後面再慢慢把個人學習過程和偶得寫下來。不少東西我也是瞭解個大概,就是看看你有沒有學習過,不斷學習是程序員最重要的特徵。
我不算高手,只能算一個合格的老程序員。這裏只是說了一下本身以前學習的方向和列舉了幾個學習中的例子,你們見仁見智。帖子也是針對迷茫的初學者有感而發,但願能幫助到你們。
最後我總結一下:初學者先廣再精,關注代碼背後的實現,關注內功修煉,瞭解實現原理和思想,造成本身完整的技術體系,知識成片以後就容易舉一反三,進步的速度就會愈來愈快。最後以我在每個項目組和開發人員聊天都會說的幾個例子結尾:「少林功夫裏面有功和拳之分,馬步功,石鎖功是功,蛇拳猴拳是拳,你不可能練會了蛇拳猴拳就能打人,你必須先重點練功。喬峯在聚賢莊用太祖長拳把你們打得落花流水,咱們用太祖長拳就只是個廣播體操。想要朝這方面發展或者真心有興趣的。能夠找我要一些基礎的學習視頻,Q號碼:3300863615,這個是免費的,但願同窗找我要的時候不要有理所應當的態度,畢竟都是個人心血,但願你是真的有一顆想要學好java的心,我也會盡所能的去幫助你成爲一名優秀的程序員。一樣,咱們要分清編程裏面那些是功那些是拳,代碼背後的實現和思想是功,各個框架、api使用是拳。初學者應該大部分時間花在練功上,功到了拳天然就有了,切勿本末倒置。」謝謝你們閱讀!
做者:曉風輕nginx

相關文章
相關標籤/搜索