更多課程 選擇中心
        Java培訓

        400-111-8989

        Java培訓 > Java教程  > 正文

        Java 程序員進入 BAT 所需要掌握的基本技能

        • 發布:Java培訓
        • 來源:Java教程
        • 時間:2017-09-27 12:02

        基本技能就是指,你必須要學會的知識,而且這里面大部分內容,在面試里出現的概率都是極高的。因此,這部分內容你沒有選擇,只能選擇啃下它,你可以花一年,也可以花十年,或者帶到棺材里學習也可以。

        1、語言的基礎部分:

        基本要求的第一個,當然是語言的基礎部分。

        基礎部分其實就是語法以及一些關鍵字的作用,像一些 if/else、for 循環這類基礎的語法,以及一些 new、class、public 這類的基礎關鍵字,大部分情況下面試問的是比較少的,因為這部分內容,只要你寫過幾年 Java,基本上都沒有什么問題。

        那么基礎部分的重點,其實主要就是 static、final、transient、volatile 這一類的關鍵字,以及內部類、泛型這一類的高階語法。

        說到 static,首先要記住的最重要的一點就是,類屬性中被 static 所引用的變量,會被作為 GC 的 root 根節點。

        作為根節點就意味著,這一類變量是基本上不會被回收的。因此,static 很容易引入內存泄漏的風險

        如果一個面試官讓你解釋 static 關鍵字,你告訴他 static 可以修飾屬性、方法和內部類,以及修飾之后又有什么效果的話,那么面試官基本上不會記住你這個回答,整個印象就是平庸。

        但是如果你說完以后,補充一下說道,你曾經遇到過一個內存泄漏的問題,就是因為 static 修飾的一個 Map 類型的變量導致的,最后排查了堆棧信息找到了問題的所在,并且解決了這個問題。

        那么,面試官這個時候內心中對你的印象,就會不自然的提升幾分。

        而且,對于 static,更深入的理解是,static 會將所引用的屬性、方法以及內部類,與類直接產生引用關系,而非與類的實例。

        這就是為什么,你可以使用類名.屬性、類名.方法以及類名.內部類名,來直接引用一個被 static 所修飾的屬性、方法或者內部類。

        如果你沒有用 static 修飾,那么你就必須使用實例才能引用這些方法、屬性或者是內部類,最典型的就是內部類。

        相信很多同學都好奇過,為什么一個沒有被 static 修飾的內部類,必須要這么聲明。

        OutterClass.InnerClass innerClass = new OutterClass().new InnerClass();

        因為你沒有使用 static 修飾 InnerClass,所以你必須 new 出來一個 OutterClass 的實例,才能在此基礎上 new 出內部類的實例,因為內部類只能通過外部類的實例才能引用。

        如果你使用了 static 修飾,那么你就可以這樣使用內部類。

        OutterClass.StaticInnerClass staticInnerClass = new OutterClass.StaticInnerClass()

        這兩種方式最大的區別就是:

        第一種方式,如果你想要獲得 InnerClass 的實例,你必須有一個 OutterClass 的實例,所有其實這種方式你創建了兩個實例,所以有兩個 ew 關鍵字。

        第二種方式就好理解一些,靜態內部類不依賴于外部類的實例存在,因此只需要直接創建內部類的實例就可以了,所以只有一個 new 關鍵字。

        static 說的有點多了,其實不光說了 static 關鍵字,也一起連同內部類的語法也大致都說了下。

        那么接下來,基礎部分還有一個比較考驗人的東西,就是 volatile 關鍵字。

        這個關鍵字的重點就三個字,就是——可見性。

        但是面試的時候,你說出可見性三個字,基本上滿分100的話,最多只能得到20分。剩下的那80分,就要靠你用硬功夫去獲得了。

        所謂的硬功夫,其實就是要整明白,在并發當中,可見性到底是什么意思。

        那么,為了弄明白可見性什么意思,就需要你了解什么叫主存和工作內存。

        只有把這些概念都搞明白了,你才會知道 volatile 的真正作用到底是什么。

        不過有一點要提醒你的是,volatile 并不保證同步,這一點一定要記住。

        不光是應付面試官,在真正使用 volatile 的時候,也要注意這一點,否則很容易出現問題。

        好了,基礎部分就說這么多吧,挑了一些有代表性的說了下,歸根結底,這一部分就是要你非常清晰的了解 Java 當中的關鍵字和語法,這里所謂的了解,是清晰的了解其實現原理,而非簡單的會用而已。

        2、Java 運行時環境

        Java 運行時環境就是 JRE 的中文翻譯,本質上其實就是指 JVM。

        首先對于 JVM 必須要知道的是,JVM 與 Hotspot 的關系。

        JVM 更多的是指 JVM 規范,而 Hotspot 是 JVM 的一種實現,也是我們最常用的 JVM 實現。

        你可以把 JVM 規范當做接口,Hotspot 當做實現類,這樣去理解會比較簡單一些。

        此外,JVM 最重要的三個部分必須要非常清楚,內存劃分、class 加載機制以及 GC 策略。

        搞清楚這三部分不僅僅是為了面試,也是為了讓你對于 Java 有更深刻的理解,這對于你的 Java 生涯非常有幫助。

        而且,關于內存劃分,還有一點要注意,咱們常說的劃分方式,其實是指的 Hotspot 的劃分方式,而非 JVM 規范所規定的。

        Hotspot 的內存劃分簡單說分為三個部分,Young Generation(年輕代)、Old Generation(年老代)以及 Perm Generation(永久代)。

        其中的 Young Generation(年輕代),又分為 Eden、From 和 To,其中From 和 To 又統稱為 Survivor Spaces(幸存區)。

        正常情況下,一個對象從創建到銷毀,應該是從 Eden,然后到 Survivor Spaces(幸存區),再到 Old Generation(年老代),最后在某次 GC 下消失。

        當然,一個對象也可能直接在 Eden 里死掉,也可能一直在 Old Generation(年老代)存活,這些都是有可能的。

        關于內存劃分,可以自己沒事用內存分析工具看看,比如 jmap、jvisualvm 等等,觀察一下各個區域的內存變化,結合實際去了解一下。

        關于 classloader 機制的學習,可以結合 tomcat 去學習,了解清楚 tomcat 的 classloader 機制,看 tomcat 是如何保證各個 APP 之間的類隔離的。

        如果可能的話,看一下 tomcat 中 classloader 的源碼,當中包含了與 tomcat 類加載機制相似的部分。

        至于 GC,需要清楚 GC Roots 都有哪些,以及如何判斷一個對象可以被回收。

        此外,GC 的算法和策略也要有大概的了解。

        3、并發知識與 concurrent 包

        要想進入一線互聯網公司,這部分內容必須要會,否則的話,你始終都只能停留在比較 low 的段位。

        關于并發知識,最重要的兩個概念一定要搞清楚,那就是可見性和原子性。

        其中可見性與前面提到的 volatile 關鍵字是息息相關的,可見性只是并發領域里的一個概念,而 volatile 則是 Java 語言中,實實在在保證變量可見性的關鍵字。

        前面說了,要弄清楚可見性,就需要搞清楚主存和工作內存。

        關于主存和工作內存,其實又屬于 JVM 的知識范疇。所以從這里就可以看出來,知識都是有關聯性的。

        原子性其實相對于可見性來說,反倒更好理解一些,相信那個萬年不變的銀行匯款的關于事務的例子,就足以大部分人理解原子性這個概念了,它其實就是一個或多個操作,被視作一個整體的意思。

        有了并發的基礎知識以后,你就需要研究一下 concurrent 包了。

        這里面的東西其實是一個寶藏,一旦你需要寫并發相關的功能,你會發現這里面的東西非常實用。

        其中 ConcurrentHashMap 是面試最容易被問到的一個類,幾乎所有的面試都會問你,ConcurrentHashMap 和普通的同步 HashMap 有什么區別。

        這個問題其實需要你知道兩個知識就可以了,一個是 HashMap 的數據結構,一個是鎖分段的技術,具體的大家自己下去找相關資料看吧。

        此外,concurrent 包里有一個非常重要的類,叫做 AbstractQueuedSynchronizer,幾乎所有的 concurrent 包內的并發工具類,都是基于這個抽象類擴展出來的。

        因此,把 AbstractQueuedSynchronizer 這個類研究透徹,非常有助于你理解 concurrent 包。

        最后一點,面試的時候還經常會被問到的一個問題,就是 ReentrantLock 和 synchronized 關鍵字有什么區別。

        其實它們的區別很簡單,簡單的說,就是 synchronized 由于是底層 JVM 實現的互斥,因此效率會高一些。

        而 ReentrantLock 的功能則比 synchronized 更多,比如定時獲取某個鎖,多個等待條件等。

        并發這一部分是一個程序員進階的重要部分,希望所有 Java 程序員都可以重視這一部分。

        4、設計模式和反射

        設計模式和反射這部分內容,個人覺得是一個高階程序員必須精通的部分。

        用好了這部分知識,可以讓你在實際開發中少寫N多代碼,而且還可以使得程序的結構更加良好。

        關于反射,其實就是 reflect 包里的內容,這個包里的類其實并不難,主要是得多用,多看。

        比如 Java 領域里最常用的 spring 框架,里面其實大量充斥著設計模式和反射的真實使用場景,沒事多研究一下,絕對讓你受益匪淺。

        5、文件 IO、NIO、網絡 IO 以及網絡協議

        文件 IO、NIO 以及網絡 IO 這一部分也是工作當中要經常用到的部分,因此也必須要掌握。

        其中 NIO 更多的是了解其原理,此外,tomcat 中有多種協議的實現,其中包括了 BIO、NIO 和 APR,這三者一定非常清楚它們的區別,這個可以在 connector 的 protocol 屬性配置。

        至于網絡 IO 部分,其實就是 net 包里的內容。

        這里面的內容是非常常用的東西,比如你調用 HTTP-API,那么就需要使用這里面的類。

        在這個 restful-API 泛濫的時代,你少不了要使用 HTTP 協議調用 API。

        此外,在了解這部分的時候,網絡協議也要適當的了解一下,最典型的 TCP 和 HTTP 協議是一定要了解的。

        在參加的面試中,基本上 TCP 協議是一定會問的,比如 TCP 協議的重試機制,三次握手的過程,TCP 與 UDP 的區別這一類的知識,還是要了解一下的。

        至于 HTTP 協議,相對來說就簡單很多了,應用層的協議主要是知道其協議格式即可,比如都支持哪些 header、每個 header 都是什么含義等等。

        以上知識點,不論是進入 BAT 還是其它 IT 公司都需要掌握的基本技術。

        感謝大家閱讀由java培訓機構分享的“Java程序員進入BAT所需要掌握的基本技能”希望對大家有所幫助,更多精彩內容請關注Java培訓官網

        免責聲明:本文由小編轉載自網絡,旨在分享提供閱讀,版權歸原作者所有,如有侵權請聯系我們進行刪除

        預約申請免費試聽課

        填寫下面表單即可預約申請免費試聽!怕錢不夠?可就業掙錢后再付學費! 怕學不會?助教全程陪讀,隨時解惑!擔心就業?一地學習,可全國推薦就業!

        上一篇:Java序列化的幾種方式以及序列化的作用
        下一篇:Java反射初探 —“當類也學會照鏡子”
        • 掃碼領取資料

          回復關鍵字:視頻資料

          免費領取 達內課程視頻學習資料

        • 視頻學習QQ群

          添加QQ群:1143617948

          免費領取達內課程視頻學習資料

        Copyright ? 2021 Tedu.cn All Rights Reserved 京ICP備08000853號-56 京公網安備 11010802029508號 達內時代科技集團有限公司 版權所有

        選擇城市和中心
        貴州省

        福建省

        • 達內廈門軟件園中心
        廣西省

        海南省

        国产高清情侣视频2019年,限制电影福利在线观看,23伊人大香蕉 百度 好搜 搜狗
        <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <文本链> <文本链> <文本链> <文本链> <文本链> <文本链>