03.05 自學java?

epep321


學習 JavaSE

HTML+CSS

js+jQuery

學習JavaEE:jsp+servlet

數據庫:MySQL+Oracle(建議先學MySQL)

框架SSH(Struts2+Spring+Hibernate)

SSM(Spring+SpringMVC+mybatis)

大致就是這些了,相信小夥伴們學完這些,學習能力已經有了很大的提升,即使在以後的 Java 工作學習中,遇到自己沒有接觸過的新技術。也可以通過自己的努力,把新的技術學到手。

在這份學習路線中,第一階段的 JavaSE 和 第二階段的 HTML+CSS+JS 順序是可以顛倒的,因為兩者並沒有什麼必然的前置關係。

最後說一句:

我們生活在黃金年代,社會在快速的發展,你不想被淘汰,就要學習,而我們北大青鳥提供最新的知識,以幫你應對變化的世界,讓你與時俱進。


西安北大青鳥華美教育


類似的問題也回答過很多,其實我最早也是個Java小白,只在本科課堂上上過一門非常基礎的Java課程,沒多久就忘光了,直到研究生期間重拾Java,才開始真正的Java學習旅程。
對於學習Java,我也經歷了很多個階段,一開始,我主要通過自己找視頻、找入門書籍的方式來學習Java,接著又通過做項目、參與實習工作等方式來鞏固自己的Java技能,研究生期間我開始系統地學習Java,主要通過看書、看博客、自己寫博客等方式逐漸熟悉Java這門語言,到最後終於符合了能拿到Java大廠offer的水平。
所以題主也不必著急,學習Java是一條漫長的道路,需要花時間、精力,用心去慢慢學習。
接下來還是分享一下我的一篇文章《Java工程師學習指南》本文將會更系統地總結學習Java的學習過程。
在下是某985小碩,在2018年的校園招聘中拿到BAT頭條網易滴滴亞馬遜的offer。我用了兩年的時間從一個小白成長成為了能夠進入BAT的JAVA工程師,下面我也會分享一下我零基礎自學Java的心得體會和學習路線,一路走來也遇到很多困難,也踩了很多坑,同時我自己也探索了很多的學習方法,總結了很多心得體會,
我寫過一個Java工程師學習指南,我把它分為了四個部分,第一步是打好Java基礎,掌握Java核心技術,第二步是掌握Java Web技術棧,能夠做一些項目,第三步是掌握Java方面的進階技術,包括網絡編程、併發編程、JVM等,第四步是掌握後端進階技術,比如分佈式、緩存、消息隊列等技術。
按照這樣的一個脈絡,我覺得能夠掌握這裡面的絕大部分內容,並且有過相應的一些實踐,那麼可以算是學好了Java。當然,學好Java只是一個開始,要真的幹好活,做好項目,以及其他各方面的技術工作,則是在學好Java的基礎去延伸和展開的。

最近開了個微信公眾號【Java技術江湖】致力於分享Java技術文章,將會記錄我兩年時間裡學習Java的經驗心得,以及在阿里的技術之路,有興趣的朋友可以瞭解關注一下。

接下來就是具體的四篇文章,建議大家按順序閱讀,有點長,收藏的時候記得點贊或者評論哈。筆芯!
Java工程師學習指南
入門篇
最近有很多小夥伴來問我,Java小白如何入門,如何安排學習路線,每一步應該怎麼走比較好。原本我以為之前的幾篇文章已經可以解決大家的問題了,其實不然,因為我之前寫的文章都是站在Java後端的全局上進行思考和總結的,忽略了很多小白們的感受,而很多朋友都需要更加基礎,更加詳細的學習路線。
所以,今天我們重新開一個新的專題,分別按照四篇文章講述Java的學習路線(分別是入門篇,初級篇,中級篇,高級篇),筆者也打算趁此機會,回憶一下自己的Java學習歷程。今天我們要講的是,小白同學如何入門Java。
先聲明一點,文章內容不會詳細到每一步怎麼操作,只會提供大致的思路和方向,給大家以啟發,如果真的要一步一步指導操作的話,那至少需要一本書的厚度啦。
本文所述的方法不一定適合所有人,如有錯誤敬請諒解。
01 前期準備工作
開發環境搭建
這一步我們往往會直接跳過,但既然是面向小白的教程,這裡就提一下吧。首先你需要一臺電腦,然後安裝好JDK和JRE,JDK提供的是Java開發工具,也就是一些必備的jar包,JRE則是Java的運行環境組件,我們熟悉的JVM就在這裡面。
安裝好這兩個東東之後,一般還要配置一下環境變量,否則有一些目錄可能無法被正確找到。
IDE選擇和安裝
IDE指的就是本地開發編輯器,沒有了它,你就只能直接在記事本這類工具裡敲代碼了。IDE最大的好處就是整合了大量的工具和功能模塊,讓你非常輕鬆地完成開發。
以前大家都用eclipse,不過eclipse已經不流行了,現在我推薦你直接用intellij idea作為你的第一個代碼編輯器。如果是用過eclipse的同學,基本上也可以無痛切換。
intellij idea可以直接在官網上下載,試用版30天,如果想要永久使用,網上也有一些辦法滴。
關於jar包
jar包是什麼,其實就是將一堆class格式文件打包,Java中把它稱為jar包,這些jar包在編譯器中能被直接識別,讓開發者使用。
對於新手來說,可能只需要用到JDK自帶的一些API,但是如果你要引用外部jar包,可能就會遇到一些困難了。對於idea來說,導入外部jar包有兩種辦法,一種是手動導入jar包,一種是使用maven。後者會在Java Web相關的文章中講起。
手動導入jar包其實也不難,你需要先下載好jar包,然後在對應的項目下選擇導入jar包即可,具體的方法這裡就不展開說了,因為在網上都找得到。
02 學習Java基礎的幾種方法
瞭解基礎語法
學習一門語言,最開始要做的事情就是學習它的語法。我最早學習Java語法是在Runoob,這個網站可以讓你對任意一門語言完成最快速的語法入門,當然,這只是相當於你瀏覽了一遍基礎語法。
想要真正掌握Java語言基礎,光看基礎語法還遠遠不夠,我在大三第一次接觸Java課程,聽老師講面向對象三大特徵聽得一頭霧水,連數組的初始化方式都理不清楚,但這些內容都是我們需要掌握的。所以,為了學好Java基礎,我們還需要看視頻或者看書進行學習。
看視頻
視頻的話,可以到極客學院或者慕課網聽Java基礎課程,當然也可以看我分享的Java視頻課程。大家也都知道,現在Java的培訓班非常多,基本上學的東西也都大同小異,不過它們的有些課程還不錯,大家有渠道的話也可以去看一看。
看視頻的好處是你可以更好地接收知識,同時也會耗費你更多實踐,所以,有時候你也可以選擇看書。
看書
看書的話,對於小白來說不推薦太複雜的書,比如《Java編程思想》這種書,新手千萬不要看。我個人建議,你只需要先看看《Java入門到精通》這種類型的書就足夠了,因為這個部分的學習只是為你後面的學習開個頭,你以後可能還要回過頭來重新研究這些內容。
現在市面上介紹Java基礎的書籍實在太多了,質量參差不齊,內容同質化嚴重,筆者看過的其實也不多。給大家一個建議,你只需要挑一兩本書來看即可,這裡推薦兩本最簡單的吧,《head first java》和《Java從入門到精通》。
看博客
這裡再推薦另一種學習方式,就是看博客,博客比起書籍來說,更適合對於某個技術點的學習,你可以很容易地在網上找到這個知識點相關的原理,實現方法,以及代碼範例。
我的博客裡沒有講解特別基礎的東西,如果你看一些比較基礎的文章,可以到Runoob等網站上查看。如果你有一個很明確的知識點想要學習,相信搜搜引擎會給你更好的答案。
代碼實踐
除此之外,一般的Java書籍或者視頻課程都會要求你相應完成一些練習題,這部分內容你需要自己在電腦裡使用IDE完成。
在IDE裡,你可以很好地熟悉Java語言的使用,基本代碼的實現,同時可以嘗試各種各樣的API,並且測試一些語言特性,比如繼承,封裝,多態等等。
另外,這也是你熟悉IDE的一個好機會,因為在公司裡做開發可能要用到IDE各種各樣的功能,提前熟悉好IDE絕對是有益無害的。
03 Java入門必備知識點梳理
在Java入門階段,你可能需要接觸到以下這部分知識,不管你是從通過哪種方式學習,這些內容都是你學習Java基礎時繞不過的重點。
Java基礎知識
這部分內容是你必須要掌握的內容,在入門階段你需要把這些基礎打紮實,以便於在學習後面的內容時可以更上一層樓。
如何把基礎打紮實呢,最好的辦法就是在IDE上把書上或者視頻上的每個例子都實現一遍,當然有的時候你也可以自己寫一些有意思的例子。
1 基本數據類型
比如int,double,char,以及其包裝類。
熟悉基本數據類型的使用,瞭解每種類型所佔的字節數,以及它們和包裝類之間的相互轉換。
2 流程控制
比如for循環,if else,while循環等等
如果是學過c語言的同學,這部分可以跳過了。
3 字符串類型String的使用
字符串類型是Java中很重要的類型,它不是基本數據類型,但卻很常用,熟悉和實踐String相關的api,開始你對字符串的學習吧。
4 數組
數組的初始化方式有哪些,二維數組應該怎麼寫,把數組當成方法參數又該怎麼處理?
5 類和對象
Java中最重要的兩個概念:類和對象,它們有什麼用呢,有什麼區別和聯繫呢,請在代碼中實踐它們吧。
Java核心技術
對於這部分內容,我相信很多小白只能瞭解它們的基本使用方法,但是並不明白其背後的一些原理:比如為什麼接口和抽象類有這些區別,多態的意義是什麼,為什麼要有反射。
新手在學習這部分內容時,只需要知道怎麼用就可以了。當然,你最好把這些特性都實現一遍,以加深印象。
至於為什麼有這些特性,這些特性背後的原理是什麼,不是我們現在討論的內容,這些內容我們將在初級和中級篇中講述。因為,要了解這些原理,你得了解JVM,瞭解併發技術的基礎,瞭解網絡基礎,甚至更多。顯然,這不是你現在能做到的。
1 接口和抽象類
寫一些接口,同時寫一些實現類去實現這些接口,並且瞭解一下為什麼我們需要接口,為什麼子類需要實現接口裡的方法。
同理,去實現一些抽象類吧。然後,看看它和接口有什麼不同。
2 繼承,封裝和多態
如何理解繼承,子類和父類之間有什麼聯繫呢。
封裝是一種保護代碼的方式,有哪些方式可以實現封裝呢。
多態一般分為重載和重寫,它們分別怎麼使用?
3 異常處理
Java中的異常處理主要用於捕獲和處理錯誤,請你寫一些try catch代碼塊去捕獲錯誤吧。
4 集合類
集合類是我們經常需要打交道的東西,List,Map,Set等等,趕快去熟悉API,然後寫一些測試例子吧。
5 IO輸入流和輸出流
IO輸入流和輸出流可以操作文件,網絡數據等內容,如何在Java代碼中完成這麼複雜的操作呢,其實只需要簡單的幾個api就可以了。
6 多線程
為了讓系統資源最合理地分配和調度,我們需要多線程,多線程會讓程序變得有趣,也會帶來很多問題,使用Thread和相關API,去嘗試這些有趣的事情吧。
可選內容:
1 反射(瞭解即可,不是入門必須)
2 枚舉類型和泛型(瞭解即可,不是入門必須)
3 網絡通信(瞭解基本的socket使用即可,需要網絡基礎)
4 數據庫操作(瞭解基本的JDBC即可,需要數據庫基礎)
04 總結
總而言之,對於一個Java小白來說,入門Java可以分為這幾步:
1 首先搭建好Java開發環境 2 通過Runoob等一些網站熟悉Java的基本語法 3 通過看書看視頻等方式熟悉Java基礎知識,通過代碼實踐加深理解 4 通過看書看視頻等方式初步瞭解Java核心技術,通過代碼實踐加深理解。
本文主要是為大家提供一個學習的思路,以及推薦一些學習方法,如果你能夠按照這樣的步驟去學習,並且配合上一些適合你自己的學習方法來完成學習計劃,相信你可以很好地完成對Java的入門。
Java工程師學習指南
初級篇
最近有很多小夥伴來問我,Java小白如何入門,如何安排學習路線,每一步應該怎麼走比較好。原本我以為之前的幾篇文章已經可以解決大家的問題了,其實不然,因為我之前寫的文章都是站在Java後端的全局上進行思考和總結的,忽略了很多小白們的感受,而很多朋友都需要更加基礎,更加詳細的學習路線。
所以,今天我們重新開一個新的專題,分別按照四篇文章講述Java的學習路線(分別是入門篇,初級篇,中級篇,高級篇),筆者也打算趁此機會,回憶一下自己的Java學習歷程。今天我們要講的是,小白同學如何入門Java。
先聲明一點,文章內容不會詳細到每一步怎麼操作,只會提供大致的思路和方向,給大家以啟發,如果真的要一步一步指導操作的話,那至少需要一本書的厚度啦。
本文所述的方法不一定適合所有人,如有錯誤敬請諒解。
01 Java Web項目指南
jav在上一篇文章中,我們講到了入門Java的幾個步驟,先搭建好環境,然後熟悉基本語法,接著熟悉Java的一些核心技術,並且在代碼中進行實現。
如果你已經完成了這部分內容的學習,應該會感覺自己對Java已經有一定了解了,可以輕鬆地寫出一些Java代碼,比如實現多線程輸出數字,再如操作IO流等等。
當然,這些代碼通常只是一些demo,我們在實際的項目中可能並不會這麼簡單地使用這些技術,我們可能會同時使用集合類,多線程,以及操作數據庫的API。
所以,在今天的初級篇中,我們就來談談怎麼做項目吧。
Java Web項目
對於大部分Java新手來說,最適合他們入門的項目就是Java Web了。因為Java天然適合做Web應用,並且生態完善,更有很多開源的工具和框架去支撐這些應用,比如Spring,Hibernate,SpringMVC等等。
那麼,如何開始著手做一個Java Web項目呢。個人認為最好的方式就是看視頻了。因為,看書的話,很多內容比較過時,並且一般不會提供源代碼。也有一些大佬喜歡推薦開源的項目(在GitHub上面的項目),但是對於小白來說,如果沒有很完整的文檔去指導他們,那也是毫無意義的。
曾幾何時,Java Web的項目還在使用JSP + Servlet進行開發,後來出現了Struts2,再後來,出現了我們現在也一直在用的SpringMVC,說實話,不論使用哪種開發框架,你都需要先花一些時間去學習相關的技術,否則你會發現,即使是看視頻,你也不知道里面在講什麼。
要想做好一個JavaWeb項目,你不僅需要一個好的項目課程,還需要足夠的知識儲備,下面就讓我們來理一理這些內容把。
知識儲備
Java基礎部分的內容咱們上次說過了,這裡就不再重複啦~下面我們分別來說說其他幾方面的知識儲備把
02 前端知識
推薦資源:在w3cschool學習html,css和js,支持在線測試代碼。
既然是做Web,就難免要涉及到前端技術,不過,現在前後端分離已經是一種趨勢,所以,如果你對前端不感興趣,也沒必要花太多時間去學習。
對於大部分同學來說,你最好要了解html的基本標籤和格式,自己能夠寫一些簡單頁面,CSS的話,也可以稍微接觸一些。相對於前面兩個服務於樣式的技術,我們倒是更應該去學習一下JavaScript,瞭解它的一些基本語法,以及ajax的使用,因為在前後端交互時,ajax是非常重要的。
所以,做一個Java Web項目,你不需要花太多時間在寫前端頁面上,如果有源代碼可以直接使用,當然,對於一些需要修改的前端頁面,你得怎麼去做修改它,因為有時候你需要使用JSP,JSP既包括前端代碼也包括Java代碼,如果你完全看不懂前端代碼的話,那就很尷尬了。
03 Java Web常用技術
JavaWeb的技術棧其實比較龐大,所以我們不要求面面俱到,只是希望你能夠熟悉一下項目中可能用到的技術。下面列舉一些常見的技術,大家最好要了解一下。
1 JSP和Servlet
推薦資源:《JavaWeb入門到精通》,慕課網、極客學院等網站上的JavaWeb基礎課程
這是Java Web開發最原始的形態,現在很少直接使用了,但是後來的各種框架其實也是建立在servlet之上來做的。你們需要了解這兩個技術分別是用來幹什麼的,最好能寫一些demo來實踐。
對於JSP,有時候你可能還要學習jstl等標籤語言,因為這些標籤可以讓你更方便地往JSP中插入Java代碼。
2 Spring和SpringMVC
推薦資源:《Spring實戰》,慕課網、極客學院等網站上的SpringMVC基礎課程。
事實上,除了上述資源之外,你也可以直接到官網上查看快速開始文檔。
Struts2早已被時代拋棄,Spring則是當今的霸主,你需要了解Spring如何使用,以及SpringMVC如何使用,並且學會在項目中使用它。
由於SpringBoot最近很火,並且搭建方式比SpringMVC更簡單,你也可以先學習SpringBoot,以便更快速地搭建起你的第一個Java Web項目。
3 MySQL
推薦資源:《Sql必知必會》,Runoob上的MySQL基礎教程,慕課網、極客學院等網站上的視頻課程
一個JavaWeb應用一定要有數據啊,所以我們需要用到數據庫,其實搭一個mysql數據庫是非常簡單的,但是對於初學者來說最麻煩的就是寫sql了,所以,先學會建表,熟悉sql,對你以後做項目也是大有裨益的。
4 Hibernate和Mybatis
推薦資源:Runoob上的Hibernate和Mybatis基礎教程,慕課網、極客學院等網站上的視頻課程
當你學會了使用sql去查詢數據,可能還不足以讓你在項目中很方便地處理數據,因為我們還需要一個步驟,就是把數據庫的數據轉化成Java裡的對象。orm框架就是為了解決這一問題而出現的,它可以讓一張表和Java類一一對應,讓數據查詢變得非常方便。Hibernate和Mybatis都是orm框架,只不過現在mybatis越來越火了。
所以,你需要了解這一技術,因為它會廣泛地運用到大部分Java Web項目中。
5 Maven
推薦資源:《maven實戰》,易百教程裡的maven教程,慕課網、極客學院等網站上的視頻課程
剛才咱們已經說過了Spring,orm框架,以及MySQL等方面的技術了。實際上,一個簡單的Java Web項目也只需要這些東西了。
但是,有一個問題,就是:一個項目裡用到這麼多技術,所需要的jar包也會很多,我們如何管理這些jar包呢。如果直接導入所需jar包,那當jar包更新或者需要替換時,每次都要手動操作,非常麻煩。另外,當jar包很多時,項目打包後的war格式文件也會很大,不利於傳輸。
為了解決上述問題,maven應運而生了。maven通過pom.xml文件來指定所需的jar包,並且自帶了很多構建相關的功能,比如編譯,打包,運行單元測試等等,因為它本身就是一個構建工具。
當然,新手可能還難以理解這些概念,你必須要知道的是,大部分Java Web項目需要用maven來管理,你需要學會maven的基本用法,最基本的用法就是:學會修改pom.xml文件。
6 Tomcat
推薦資源:慕課網、極客學院等網站上的視頻課程。
對於小白來說,Tomcat相關的技術是非常複雜的,畢竟它是一個應用服務器啊,事實上這個時候,你只需要學會如何安裝Tomcat即可。畢竟,它在項目中的作用就是提供一個運行環境而已。
正常來說,你只要下載解壓Tomcat的壓縮包即可。由於現在的IDE都支持集成Tomcat,所以一般情況下你都可以在IDE中配置好你的Tomcat路徑,然後設置好你的項目路徑,IDE會自動把你的工程代碼部署到Tomcat服務器上。
如果你使用想跳過IDE直接部署工程到Tomcat上,也可以直接編譯工程並且打包得到war格式的文件(這個步驟可以使用maven來完成),然後拷貝war文件到Tomcat下的特定目錄即可。
上述兩種部署方式的詳細步驟請到搜索引擎尋找答案。
7 Git和GitHub
推薦資源:廖雪峰的Git教程,GitHub官網,慕課網、極客學院等網站上的視頻課程。
既然要做項目,為什麼不把它發佈在GitHub上。當你熟悉了Git指令之後,你可以很方便地發佈你項目中的每一次更新,並且同步到GitHub上,這樣既可以讓你更好地管理項目版本,又可以讓你GitHub更加活躍,為你未來的面試加分。
所以,趕緊學好Git指令,然後開啟你的項目之旅吧。
04 其他常用組件
除了上面幾種必備的技術之外,有時候我們在項目中還會用到其他東西,在這裡我們把它們叫做組件。這裡只做簡單的介紹,至於具體怎麼使用,在網上都可以很容易地找到相關文章。
1 日誌系統
當項目代碼比較多的時候,容易發生錯誤,日誌可以很好地記錄代碼運行時的錯誤,常用的日誌系統有log4j,logging等等,另外你還需要了解一下slf4j。
2 單元測試
日誌系統可以記錄代碼問題,單元測試則是為了避免代碼出錯,常用的單元測試組件主要是JUnit,建議你找個文檔看一看,然後下載下來玩一下。
3 JSON
JSON逐漸成為前後端數據交互的標準格式,為了在項目中使用JSON的API,你也需要導入它的jar包,一般我們都會使用阿里提供的fastjson,趕快下載來玩一玩吧。
當然,常用的Java Web組件還有很多,比如HTTPClient,再比如一些加密工具,一些壓縮工具等等,這裡就不再一一列舉了。
05 推薦項目課程
現在網上的項目課程那麼多,哪一款更適合你呢?
其實我看過的視頻課程也不是很多,早先在慕課網和極客學院看過一些項目課程,覺得比較一般,對新手來說不太友好。
我的一些同學看過一些培訓機構的課程,專業講師錄的項目課程可能會稍微好一點。在我公眾號後臺回覆“Java”可以領取某機構的視頻課程,不過我不是打廣告的,這個機構也沒有給我錢啦。
當然,你也可以自己去找一些你感興趣的項目課程,後續我也會收集更多的視頻課程來分享給大家。
PS:如果找不到我說的這些資源,也可以微信私我。老規矩,公眾號後臺回覆“少俠”可以勾搭作者。
06 總結
今天的內容就到這裡了,與其說是初級篇,反而更像是“項目篇”呢。因為學完基礎內容之後,做項目是最好的複習和實踐方式了。所以這篇文章圍繞著做項目來展開,也就不足為奇了。
今天我們主要講的是,做好一個JavaWeb項目,需要哪些知識儲備,需要了解哪些技術,並且我也推薦一些比較精品的視頻課程。
後面我還會寫一篇文章,專門講一講怎麼做項目,會更加詳細,更加側重怎麼去做,敬請期待吧。
總結以下今天說的幾個要點吧:
1 Java基礎知識儲備 2 前端知識儲備 3 瞭解和使用JavaWeb常用技術 4 JavaWeb常用組件介紹 5 視頻課程推薦
俗話說的好,磨刀不誤砍柴工,相信你看了本文之後,可以更好地做好知識儲備,然後開始Java Web的項目實踐,希望你能夠順利地完成你的第一個項目。
▼更多精彩內容
想了解Java後端學習路線?你只需要這一張圖!
Java工程師修煉之路(校招總結)
你不可錯過的Java學習資源清單
Java基礎知識點總結
Java秋招面經大合集
筆者在今年秋招中成功拿到BAT頭條網易等大廠的研發offer,期間總結了很多經驗和技巧,我把它們寫成文字,做成專題,發表在公眾號上,希望讓更多有需要的朋友看到。
關注微信公眾號【程序員江湖】後,可以在後臺回覆“Java”即可領取精品Java學習資源(不斷更新中),學習資源包括基礎,實戰以及求職等內容。
1、後臺回覆“少俠”,可以獲取我的微信,有什麼問題都能聊。 2、如果你想要加入微信交流群,那麼可以在後臺回覆“江湖”。 3、如果你想要到我的技術博客看更多的Java後端技術文章,請回復“練級”。
Java工程師學習指南
中級篇
最近有很多小夥伴來問我,Java小白如何入門,如何安排學習路線,每一步應該怎麼走比較好。原本我以為之前的幾篇文章已經可以解決大家的問題了,其實不然,因為我寫的文章都是站在Java後端的全局上進行思考和總結的,忽略了很多小白們的感受,而很多朋友都需要更加基礎,更加詳細的學習路線。
所以,今天我們重新開一個新的專題,分別按照四個部分講述Java的學習路線,筆者也打算趁此機會,回憶一下自己的Java學習歷程。今天我們要講的是第三部分,Java工程師學習指南(中級篇)。
先聲明一點,文章裡面不會詳細到每一步怎麼操作,只會提供大致的思路和方向,給大家以啟發,如果真的要一步一步指導操作的話,那至少需要一本書的厚度啦。
當然,本文提到的大部分內容都能在我的博客中找到對應的一些文章。所以也歡迎大家去我博客找到你們需要的資源。
本文中的方法不一定適合所有人,如有錯誤還請諒解。
上期回顧
在上一篇文章中,我們主要討論的是如何做一個Java Web項目,以及前期需要哪些方面的基礎。最後,我還推薦了幾個比較不錯的視頻課程,以便給大家參考。
當然,跟著視頻課程做完一個項目,你只是照葫蘆畫瓢又練習了一遍,可能其中有很多東西你並不太理解,比如你可能不知道為什麼代碼要分層,為什麼要用maven進行線上編譯,為什麼Tomcat啟動時會輸出那麼多的日誌。
有疑問很正常,因為一個Java Web項目涉及的技術還是很多的,如果要理解這些技術的原理,光靠一個項目課程是遠遠不夠的。所以,在你體驗了Java Web項目的開發流程以後,你應該花些時間去了解相關技術原理了,今天我們要講的也是這部分內容。
對於即將參加校招的同學來說,最重要的也是這部分內容,你需要了解JVM虛擬機原理,Java併發原理,並且熟悉JDK的部分源碼,瞭解這些API的底層實現。除此之外,還有很多,下面我們分別來談一談。
PS:文中多次提到我的博客,是因為我的博客裡整理了多個技術專欄,基本上包含了下面所說的內容。關注公眾號後,在公眾號後臺回覆“練級”即可獲得我的技術博客地址,以及其他相關的資源。
01 計算機基礎知識
計算機基礎課程(非科班)
如果你不是計算機專業的同學,那你可能要注意一下了。在學習下面這些內容之前,你最好要學習一下計算機基礎課程。
這裡我們說的計算機課程是:數據結構,操作系統,計算機網絡。
數據結構:這門課應該算是三門課程比較簡單的一門了,推薦《數據結構與算法(Java語言描述)》,看書結合代碼實踐,把基本的數據結構算法寫一寫就可以了。
操作系統:關於操作系統我看了很多本書,但是沒有感覺特別好的,所以如果有時間的話可以先看另外一本書《深入理解計算機系統》,這本書講了很多計算機的基本概念,不侷限於操作系統。
然後可以看一看湯小丹寫的《操作系統》,或者你們學校的教材。
計算機網絡:網絡方面的書也非常多,推薦看一下《計算機網絡:自頂向下方法》,另外還有一本《TCP/IP 詳解:卷一》也是備受推崇的書。
除此之外,我還要推薦一下劉欣老師的書《碼農翻身》,書中用一些有趣的故事來講解操作系統和計算網絡的一些複雜概念,有助於大家理解這部分內容。
02 JVM虛擬機
JVM虛擬機
為什麼把JVM放在第一位,因為它是最基礎也最重要的一塊內容。所有的Java代碼都運行在JVM上,事實上,JVM在操作系統中只是一個進程。為了瞭解Java代碼的運行方式,底層引擎的執行原理,以及內存的分配情況,我們必須要學習JVM虛擬機。
推薦資源:《深入理解JVM虛擬機》
很高興地告訴你們,學習JVM你只需要把這本書吃透即可,當然,看一遍可不夠,筆者前後至少看了三遍,有條件的話最好把書中的實例都跑一跑。
另外,JVM也是面試必考的內容,所以,相應地去準備一些面試題也是很有必要的,如果你基本掌握了這本書的內容,相信你不會懼怕任何JVM面試題。
03 設計模式與源碼閱讀
設計模式
為什麼在這裡提到設計模式呢,因為設計模式是Java編程規範的經典總結,並且在JDK源碼中經常使用,由於我們後面會講到JDK源碼方面的學習,所以對於設計模式,建議大家先學習一下,最好的學習方式就是看書結合實踐,把一些常用的設計模式自己實現一下。
推薦資源:《head first 設計模式》
JDK源碼(主要指集合類源碼)
接下來下場的選手是:JDK源碼。不過對於大部分人來說,只要能夠掌握集合類,字符串這些源碼就可以了,其他部分的源碼主要集中在JUC併發包裡,而這些內容我們會放在Java併發技術裡來講。
為什麼我們需要掌握集合類源碼呢,其一是因為面試喜歡考,其二是因為集合類的源碼實現都比較經典,難度也不算太大,並且運用了很多優化方法,所以瞭解它對於學習Java的同學來說大有裨益。
推薦資源
市面上並沒有哪本書專門來講JDK源碼的,所以這部分內容的學習資源主要是兩個部分,一是JDK源碼本身,而是一些技術博客。
1 對於JDK源碼,直接看可能比較有難度,不推薦新手這麼做。 2 講解源碼的文章質量參差不齊,所以我只推薦幾個我自己比較熟悉的,一個是importnew。一個是我的博客。另外,我之前分享的一篇文章《你不可錯過的Java學習資源》中也推薦了很多大牛和博客,大家也可以去看看。
Spring源碼
說實話,Spring源碼的複雜度遠高於集合類的源碼,這也是因為Spring運用了很多的設計模式,並且有著非常繁雜的類關係。所以,我不建議大家直接去讀Spring源碼,因為即使是看Spring源碼解析的書籍,你也會感到很吃力。
所以,我推薦的方式是,看書+看一些比較好的源碼解析文章。另外要告訴大家的是,Spring的源碼很多,並不是所有內容都需要你掌握的,大家都知道Spring最常用的特性就是IOC和AOP,所以看源碼解析時,最重要的也是這兩個部分了。
另外,看完Spring的源碼解析以後,別忘了看SpringMVC的源碼解析,學習方法也是一樣的,找重點內容看即可。
推薦資源:《Spring源碼深度》,我的博客專欄
04 Java併發技術
Java併發技術
相信你為了搞定集合類源碼和Spring源碼花了不少功夫了,接下來輪到Java併發技術出場了。我們在入門篇其實已經談到了多線程,但是也僅僅停留在使用Thread或者Runnable實現簡單的多線程demo。
實際上,為了理解Java併發技術的底層實現,我們還需要知道JMM模型,瞭解synchronized和volatile的底層實現,同時還要明白Java中的多線程和操作系統的多線程和什麼聯繫和區別。除此之外,我們經常談到的線程安全,有哪些實現方法,也是這部分內容的要點。
學習併發技術,我建議分為三個步驟
1 首先熟悉Java的多線程基礎知識,比如Thread的使用,線程的狀態轉換,以及一些api的使用方式。 2 瞭解一些理論基礎,比如JMM,操作系統的多線程實現。這部分內容推薦通過看書和看博客來學習。 3 瞭解並使用JUC的一些API,然後開始看JUC的一些源代碼。這個階段是最重要也是最困難的。
推薦資源: 書籍:《Java併發編程藝術》,《Java併發編程實戰》 網站:我的博客專欄,併發編程網,importnew,《你不可錯過的Java學習資源》
05 Java網絡編程
Java網絡編程
在搞懂Java併發編程技術之後,相信這部分內容也難不倒你。當然,前提是你對計算機網絡有一定了解,因為網絡編程涉及到TCP和HTTP相關的知識點。
在學習這部分內容的時候,你首先要了解socket的使用以及原理,然後再去了解NIO的相關API,多寫一些客戶端和服務端通訊的demo,以便熟悉這些內容。為了更好地理解網絡編程,你還要去了解UNIX網絡編程模型。
除此之外,如果你想要更好地理解Java網絡編程,你還需要去了解Tomcat的實現原理。同時,Netty也是值得你去學習的一部分內容,最好有機會去用一用這一網絡編程框架,學有餘力的同學還可以考慮看看它的源碼(筆者沒有看)。
推薦資源:我的技術博客,《Java網絡編程》,《你不可錯過的Java學習資源》
05 Java8
Java的版本一直在更新,但目前在用的主要還是Java8和Java7,等再過幾年可能這部分的內容就過時了。但是目前看來,對Java8的學習和了解還是很重要的,畢竟面試也喜歡考。
對這部分內容學習的最好方式就是:看文章+代碼實踐
推薦資源:《Java8實戰》
06 總結
今天的內容貌似有點多,大家會不會感覺有點吃不消呢。沒關係,因為這部分內容確實需要花很多時間去學習。對於一個在校的Java學習者來說,可能沒有機會接觸到多麼高大上的項目,所以對內功的修煉顯得格外重要。
看書,寫demo,讀源碼,看似簡單的事情實際上需要花費大量時間和精力,這個過程是需要你靜下心來,慢慢沉澱的,在學習的過程中你也可以和筆者一樣,寫一些總結和博客,以便更好地回顧自己的學習歷程。
總結以下今天所講的內容吧:
1 計算機基礎課程:數據結構,網絡和操作系統 2 JVM基本原理 3 設計模式,JDK源碼,Spring源碼 4 Java併發技術,JUC源碼 5 Java網絡編程 6 Java8
關注微信公眾號【程序員江湖】後,可以在後臺回覆“資料”即可領取3T精品學習資源(不斷更新中),學習資源包括基礎,實戰以及求職等內容。
1、後臺回覆“少俠”,可以獲取我的微信,有什麼問題都能聊。 2、如果你想要加入微信交流群,那麼可以在後臺回覆“江湖”。 3、如果你想要到我的技術博客看更多的Java後端技術文章,請回復“練級”。

黃小斜


覺得這個問題我最有發言權了~大三開始自學,到現在工作6年,一路走來不容易,看著上面的回答一堆培訓機構上來就是各種路線圖加免費送視頻的,我就不發了,需要也可以私信我要就是了,這裡和你分享下我的自學經歷吧。

首先給你一個肯定的觀點,只要有一定自學能力,並且對編程有興趣,一定要有興趣!不要抱著我找不到工作只能學編程混口飯吃的觀點。

上大學開始就在接觸編程最早接觸C,C++,主要就是編寫點冒泡排序呀,漢諾塔,啥的小程序,如果你對編程感興趣或許一個程序寫完帶給你的一定是喜悅,至少當初我是這樣。如果看到編程就頭髮我覺得還是別硬著頭皮學了,見過太多混日子的程序員也是很難受,工資上不去天天CRUD。

入門階段

大三開始接觸java開始了真正的自學之路,我是從馬士兵的javase基礎視頻看起當初應該是挺火的,然後開始一點點摸索自學,主要就是去找各種培訓機構的免費視頻看尚學堂、傳智播客、北風網、領航致遠一堆的機構免費放出的視頻,我基本是全部都看了一遍,大三開始基本每天6小時以上學習時間寒暑假也不例外(主要是扣不捨得花幾萬塊培訓)

慢慢的開始對整個java領域有了基本的,知道java能做什麼,我不建議死扣知識點去學習,這隻會消磨掉學習的興趣,因為完全沒有成就感,就像玩遊戲每關都要有個Boss。

學習的過程要設置小目標,就像培訓機構現在都是一個階段給你個項目練練手(而且項目名字一般都是高大上的,讓你有成就感)

我當初就是邊學邊做培訓機構放出的免費視頻,坦克大戰、購物商城、OA、CMS等等,項目名可以千變萬化實際還是那些知識點,一般免費的視頻技術多少都比較老,做項目同時我自己去找新版本來用,google查用法差別,自己用新的方法做

提升階段

培訓機構的視頻看完,找個實習的工作基本沒問題了,大四上學期的開始找工作(其實還有課但是我基本上都翹了),簡歷投了兩家,面試後都要我,留在了一家上市公司,我還是比較求穩定的人,開始步入職場,程序員的職場相對其他職業還是純粹很多,主要還是看技術能力,這階段就是不斷提升自己,多看些深入的書籍,jvm內存分析啦,還有 in action系列的書,反正主要挑一些外國出名的書閱讀,這階段基本不用看教學視頻了,你會覺得太低級了不用看,自學看書要快的多,工作三年後基本上覺得自己所向無敵了

無盡模式

工作三年後我跳槽了(不聯繫為了錢頻繁跳槽),主要是覺得自己在公司能學到的技術到了瓶頸(還有工資),來到新公司的頭一年壓力巨大,一個是環境重新適應,還有就是新技術的接觸,頭一年又是學習新東西的最好一年,慢慢的會發現自己在成長,但是我會發現越來越多的東西不懂就像是白紙上的圓畫的越大空白越多,微服務,大數據,人工智能等等東西接踵而至,那麼接下來的就又是一個循環了,我開始找相關的資料學新技術,然後看書。。。。。

待續。。。

當然不可能一輩子只會編碼,技術只是基礎,要往上爬還會需要很多其他的知識,我還沒爬到就不說了,先好好當一個程序員一步步來吧

碼字好辛苦就到這了,語言組織不太好,想看的小夥伴看看吧,如果你剛入門可以私信找我要視頻,當然是給你最新的,內容沒的說反正我也在看又開始新的一輪。。。


瘋狂的程序員


我在讀大學期間,JAVA是選修課,老師是一個只會念課件的老頭,最後的考試也是背背題庫就可以通過。當年太年輕,不知道Java的重要性,等到要找工作的時候才知道自己當初有多麼傻。於是發奮圖強,自學Java,最終拿到了心儀公司的offer,職位就是JAVA開發工程師。

至於我的同事呢,我們項目組有兩位很厲害的大神,都不是計科出身,反而是電子方向的。他們出於對編程的興趣,自學了Java(還有其他編程語言),最終成功加入了我們公司。目前看來,非專業背景,在實際工作中沒有給他們帶來任何困擾。

那麼接下來,我們就聊聊,怎樣才能更好的自學Java。

從論壇上獲取最新信息

當你決定要自學java後,不妨多逛逛相關的論壇,貼吧。這樣做主要有兩個目的:

1 通過閱讀論壇上的信息,能夠補充自學過程中的遺漏。舉個例子,通過自學,你知道java裡的常用隊列有ArrayList和LinkedList,但是這二者有什麼區別,在什麼場景適合使用呢,書裡可能沒有說。而在論壇裡,你會看到大家對此的討論,因此明白ArrayList是基於動態數組的,而linkedlist是基於鏈表的;此外前者讀寫快,後者增刪快等等。

這些,都是在面試中常見的問題,所以大家才會樂於在論壇上討論,對於完善你的知識體系,也是很有幫助的。

2 多多接觸樂於分享的答主,從而擴充自己的人際圈子。網上的答主也是很樂於得到別人的肯定的,在你來我往的帖子交流中,一些專業水平很高的答主很有可能注意到你,如果有機會能夠得到他們的推薦與指點,那麼別說你的java水平能夠得到提升,甚至有可能加入他們所在的公司,一步到位解決了你的就業問題。

閱讀編程書籍

無論你是否選擇通過閱讀的方式來學習Java,Java工具書都是必不可少的,因為在實際工作中,也難免會遇到需要查閱書籍來確定問題的情況。

首先推薦Java書籍界的聖經《Thinking in Java》,中文版《JAVA編程思想》,也被我稱為立志成為java開發工程師的信仰之源。

這本書適合任何水平的java愛好者與從業者。它不僅深入淺出,從0基礎開始介紹java,更是著重培養讀者的獨立思考能力。它不是教你成為一個普通的碼農,而是將“匠人精神”的堅持也融合了進去。網上甚至有人稱呼這本書為JAVA界“上古卷軸”。這是一本可以反覆閱讀,每次閱讀都會有新理解的書籍,早已經超越了工具書的範疇。如果能夠完整讀懂其中三分之一,相信你已經可以去任何公司面試JAVA開發工程師的職位了。

如果覺得上面的JAVA聖經有點難啃,那麼我再推薦一本風格輕快的《head first java》,這是一個系列,還有其他《head first servlet》等等,以後如果想尋找其他語言的工具書的話,不妨試試關鍵字head first+語言名。

這本書裡舉了很多的例子來幫助初學者理解java一些比較晦澀難懂的概念與名詞,語言也是十分幽默,不像其他大部頭一樣,讓人讀著讀著就想睡覺。裡面還有一些實戰部分,如果能夠跟著做下來,真的是讓人受益匪淺。

市面上還有很多其他的java開發書籍,像什麼七天學會java,十四天上手J2EE等等。個人對這類書籍持保留態度,各位看官可以根據自身情況,謹慎選擇。

學習免費的視頻資源

隨著互聯網的普及,越來越多的知識都可以通過網絡來獲取,這也降低了學習的門檻。

不妨在網易公開課,慕課網,牛客網,甚至是B站等網站上,尋找學習資源。畢竟只要輸入關鍵字,就能搜到其他人認真構思的課程與教案,同時免去了你為自己計劃學習進度與學習深度的工作。

在這個過程中,最好找到一個同行者,與你一同學習。這樣即可在有問題時互相溝通,也可互相督促,避免獨自學習產生懈怠感,拖慢甚至放棄學習。

以上是我推薦的自學java的方法,如果你覺得有點道理,或者從中收穫到了一點信息,請點個贊給我呀,如果有進一步的想法交流,歡迎在下面給我評論。

我是蘇蘇思量,頭像是我本人,來自BAT的java開發工程師,歡迎關注我,經常回答科技類的話題,與大家分享我的所見所想。


一個存在感小透明


答案分為 學生版 與 非學生版(光收藏不點贊可恥,拒絕伸手黨,從點贊做起!)

學生版

哈工大本碩985,北京公司,收到去哪兒(13K*16),華為,vipkid(18*14),茄子快傳(20*16),創新工廠(12*13),秒針(18*16)offer,目前最低的月薪12K*13,最高的華為優招20K*16,最終還是簽了百度畢竟bat,職位java開發工程師今年給的還挺多。

可以說我應該達到了題目中所說的北京java開發月薪2W的標準,來答一發。

--------------------------------------------------------------------------------

為了避免知乎大佬覺得我吹逼,把目前收到的offer圖貼出來(應評論區建議,已經把名字打碼,謝謝提醒)。有人需要聯繫方式,放一下微信公眾號 程序員喬戈裡 個人微信在公眾號裡面可獲得。另外我要有3T的編程資料,需要的可以加我微信!!!

-----------------------------------------------------------------------------

會在offer圖的後面附上java自學找工作的經驗,並解答評論區的一些問題!!!

會在offer圖的後面附上java自學找工作的經驗,並解答評論區的一些問題!!!

會在offer圖的後面附上java自學找工作的經驗,並解答評論區的一些問題!!!

3T的編程資料!!!!!!關注公眾號 程序員喬戈裡 免費分享 !!!

3T的編程資料!!!!!!關注公眾號 程序員喬戈裡 免費分享 !!!

3T的編程資料!!!!!!關注公眾號 程序員喬戈裡 免費分享 !!!

-----------------------------------------------------------------------------

----------------------------------------------------------------------------------------------

以下開始講述一些我找工作的經驗,希望對大家有幫助(覺得有幫助的,記得點個贊關注走一波,謝謝大家)

----------------------------------------------------------------------------------------------

一.簡歷篇

我是使用的喬布簡歷,在裡面買了一個模板,本科還是免費的,研究生階段就收費了,呵呵。

(1)個人聯繫方式

簡歷的話要把電話,email這些重要的信息放到顯眼的位置,方便聯繫。

(2)技能掌握

熟悉 精通等詞彙慎用(精通應屆生就不要用了),我舉一下我的java為何用了熟悉的例子,java看了《java核心技術卷1》《java編程思想》前幾章《深入瞭解java虛擬機》前7章,《java併發編程的藝術》《java多線程編程核心技術》還看了一堆網上的博客,看了這麼多我才寫上了熟悉java。

瞭解的話適用於只是看過一點書,只是一種淺嘗輒止的感覺,比如你只是通過刷了刷面經,瞭解了一些數據庫的面試常見的問題,那麼這種就應該用瞭解。一般都寫上了解吧,你應聘啥工程師,對應的語言寫上熟悉。

(3)榮譽獎勵

獎學金,優秀幹部,競賽獲獎,paper啥的都往上懟,多多益善。

(4)項目

項目篇很重要,基本面試的第一個環節都是扣你的項目。

項目一定要準備1到2個亮點(難點)!!!

項目一定要準備1到2個亮點(難點)!!!

項目一定要準備1到2個亮點(難點)!!!

有些人看到這裡就會說,我這項目水的一批,一點亮點都沒有,咋整,全完了呀,別慌,聽我給你吹一波。

一開始我第一次面試的時候(第一次就去面阿里,我也是膽賊大),阿里面試官上來就懟項目,

問我這是啥,那是啥,我說了以後,他就問著玩意底層是咋實現的,我用的是一個開源的爬蟲,然後我就說我只會用,底層沒有看過,他估計很失望;然後他問我的項目亮點是啥,我當時一下愣住了,扯了一些有的沒的,都是失敗的慘痛的教訓,大家參考參考就好,不一定就一定要照著我學,非要知恥而後勇,咋提前準備好也是不錯的。

經過這次慘痛的教訓以後,我就開始有意識地去想一些項目的亮點,即使不是我遇到的問題,我強行把這些問題加到我的項目上面,當做我的項目亮點。

亮點舉例:我的第一個項目的我說我負責輿情監控項目的地域分析,這個模塊其實平平無奇,很水,就是利用一個開源的NER命名實體識別的包去識別出來新聞正文的地點,然後統計地點出現的次數這樣的一個簡單的模塊。我就這樣吹:最深刻的一個項目就是最近做的網絡輿情監控項目,其中我在裡面有負責一個地域分析模塊,就是從最新爬進來的新聞數據裡面提取出來地域信息,最後在地圖上顯示出來,當時把後臺模塊寫好了以後,是可以在本地的windows系統上運行的,然後導出jar包的時候,想把jar包在linux系統上運行起來,但是一運行就顯示OOM內存溢出錯誤,當時遇到的這個問題的時候第一時間想起來了以前看的關於虛擬機方面的書,於是我在虛擬機的配置上添加了一個-XX:+HeapDumpOnOutOfMemoryError,嘗試將dump文件保留到本地,然後採用了jmap命令去分析這個dump文件,發現代表老年代的參數Old Generation每次一啟動都是一直滿著的,然後去看了虛擬機的配置參數,發現虛擬機中的-xmx參數只有256M,而程序需要的內存大小為500M(因為需要加載一個MIT的提取名詞的包),所以最後通過設置成1024M解決了這個問題,我感覺通過這個學到了很多。在項目中扮演了核心角色,獨立完成了地域分析模塊。

示例看不懂也沒關係,這個得有一定的java虛擬機的知識才可以看懂,推薦看《深入瞭解java虛擬機》

看到這裡,你完全可以把我的這個項目的這個亮點融合到你自己的項目裡面,換個背景就是你的項目亮點了,我上面推薦的《深入瞭解java虛擬機》裡面也有很多虛擬機調優的經驗,你可以看懂之後,把這些融合到自己的項目裡面,完全是可以的。

除此之外,關於項目還有一個問題:就是你看了我的簡歷,會發現許多項目都是與爬蟲相關的,面試管會問你在爬蟲上你遇到了啥問題,這種完全可以上網去搜爬蟲和反爬蟲的技術博客,然後理解記憶,說給面試官聽。說到這裡,其實也就是在說,你的項目可能涉及到的點你都得有準備,有備無患,你如果不知道自己項目涉及到哪些點,那麼可以通過一些公司練練手,他問到的一些問題,就有可能是你的項目需要準備的點。

-------------------------------------------------------------------------------------------

二.簡歷投遞篇

(1)官方網申

學歷不好的,不建議這走這條路,容易被刷,985/211也有一定幾率被刷。

(2)內推

關注 牛客網- 互聯網求職神器和備考學習平臺 的內推信息,都是真實可靠的,雖然不一定免筆試,但是可以保證你簡歷不被刷啊!!!

微信公眾好 互聯派 也有很多內推的信息,值得關注。

(3)內推完之後的添加個人信息

強推 牛客網簡歷助手 助手介紹_牛客簡歷助手-簡歷一次填寫,N網閃填__牛客網

爽的一批,誰用誰知道,你填寫完牛客網的簡歷助手,進來其它求職網站的時候,可以把插件調出來,如果調不出來,多點幾下,自己摸索哈。

三.筆試面試篇

提前批:一般公司的提前批是面筆試的,這個機會一定要抓住,提前批不耽誤正常網申流程,相當於多了一次機會。(其實你每次應聘都是會有記錄的,現在的面試官可以看到你所有的過往的面試記錄,但我覺得影響不大,你這次能過和上次沒過還是取決於你自己的實力,能不能打動面試官)

筆試:就算你內推成功了,也會有極大可能筆試,如果你算法功力強,可以獨當一面,那麼不用看這裡,直接跳過,如果你算法一般的話,我說一下我在秋招過程中看到的一些其他人是怎麼辦的。周圍人一般都是三五成群,算法題互相說思路,基本知道思路就知道咋寫了,也有的比如他1道題AC了,他是C++版本的,其他人把這個AC代碼改成了java版本等等,也可以請周圍大神幫忙A幾道等等,其實周圍同學的算法功底真的說不上多強,反正是通過這種方法也算是把筆試給過了。其實筆試題吧,你把劍指offer刷一刷,leetcode刷個幾百道(建議一個tag一個tag的刷),問題不大,我是通過刷leedcode,然後感覺這些公司的筆試題也就那麼回事,還OK,當然阿里筆試題另說,還是A不了,真的變態!!!

面試:面試這個就看平時積累了。電話面試視頻面試其實還是有一定操作空間的,現場面全憑自己實力。

四.平時積累篇

-------------------------------------------------------------------------------------------

下文中截圖來源於我做的一個pdf版本的面經,把所以知識點的答案整理了下來,耗費我將近至少1個月時間,在本文最後部分把這個pdf分享給大家,覺得有用的麻煩點贊關注走一波,謝謝!!!面經中有我的知識點的答案,如下圖示例,非常詳細!!!

下文中截圖來源於我做的一個pdf版本的面經,把所以知識點的答案整理了下來,耗費我將近至少1個月時間,在本文最後部分把這個pdf分享給大家,覺得有用的麻煩點贊關注走一波,謝謝!!!面經中有我的知識點的答案,如下圖示例,非常詳細!!!

下文中截圖來源於我做的一個pdf版本的面經,把所以知識點的答案整理了下來,耗費我將近至少1個月時間,在本文最後部分把這個pdf分享給大家,覺得有用的麻煩點贊關注走一波,謝謝!!!面經中有我的知識點的答案,如下圖示例,非常詳細!!!

--------------------------------------------------------------------------------------------

1.數據結構與算法篇

你是java開發你就用java代碼去實現,是C++開發就用C++去實現。

書籍參考:

(0)《圖解算法》入門

(1)《劍指offer》 劍指Offer_編程題_牛客網

(2)《程序員代碼面試指南 IT名企算法與數據結構題目最優解》參考左神視頻

(3)leetcode LeetCode - The World's Leading Online Programming Learning Platform

leedcode注意去英文官網,別去中國區,中國區討論區討論的少。

leedcode 注意一個tag一個tag的刷,例如動態規劃,就把動態規劃下的題目都刷了,基本刷個10多道,其它也基本有思路了,而且動態規劃的題目筆試面試也常出。其次就是二叉樹,鏈表,數組,回溯的題目。

(4)數據結構(嚴蔚敏)/大話數據結構 //如果覺得教材無聊就可以看大話系列

需要掌握的知識點:

  • 數組、鏈表、二叉樹、隊列、棧的各種操作(性能,場景)
  • 二分查找和各種變種的二分查找(循環有序數組找最大值最小值找n,有序數組找最左下標,最右下標)
  • 各類排序算法以及複雜度分析(快排、歸併、堆、冒泡、直接選擇、插入排序)
  • 各類算法題(手寫)
  • 理解並可以分析時間和空間複雜度。
  • 動態規劃(筆試回回有。。)、貪心。
  • 紅黑樹、AVL樹、Hash樹、Tire樹、B樹、B+ 樹(除了紅黑樹,其它要會插入刪除查找,紅黑樹如果會更好,也算一個亮點)。
  • 圖算法(克魯斯卡爾算法、普林母算法、迪克拉斯算法)
  • 樹的前序後序中序遍歷的遞歸非遞歸實現,層次遍歷,深度優先遍歷,廣度優先遍歷遞歸與非遞歸實現

排序算法總結:常見排序算法小結 - CSDN博客

排序算法遞歸與非遞歸的java實現版本:

Lintcode 快排遞歸與非遞歸實現 464. 整數排序 II java

Lintcode 464. 整數排序 II 冒泡排序三種實現 直接插入排序 直接選擇排序 java

Lintcode 464. 整數排序 II 歸併排序遞歸與非遞歸實現 java

2.海量數據篇

看這一篇就足夠用了,什麼bitmap,布隆過濾器都得知道。

教你如何迅速秒殺掉:99%的海量數據處理面試題 - CSDN博客

3.計算機網絡篇

參考書籍:《圖解http》《圖解TCP/IP》《TCP/IP詳解卷1》《計算機網絡(謝希仁)》

知識點:

所有的知識點,需要做到,不看面經,能知道答案是啥,自己可以用嘴說出來!!!

所有的知識點,需要做到,不看面經,能知道答案是啥,自己可以用嘴說出來!!!

所有的知識點,需要做到,不看面經,能知道答案是啥,自己可以用嘴說出來!!!

4.數據庫篇

參考書籍:《高性能MySQL》 《MySQL技術內幕:InnoDB存儲引擎(第2版)》

知識點:

5.操作系統篇

參考書籍:

知識點:《操作系統精髓與設計原理(原書第6版)》

LRU會手寫一個LRU的set與get的時間複雜度是o(1)的代碼

6.Linux命令篇

參考書籍:《linux 鳥哥的私房菜》

7.安全加密

8.重頭戲java篇

基礎篇:

推薦書籍:《Java程序員面試筆試寶典-何昊》突擊java面試的好書啊!!!

《寫給大忙人看的JavaSE8》 《深入理解Java虛擬機:JVM高級特性與最佳實踐》

《JAVA併發編程實戰》《Java多線程編程核心技術》《java核心技術卷1》

1.基礎篇:

2.集合篇:

3.鎖

4.多線程

多看看《Java多線程編程核心技術》這塊就沒問題

5.jdk中的concurrent 俗稱juc包

都要搞懂底層原理!!!

都要搞懂底層原理!!!

都要搞懂底層原理!!!

6.java虛擬機

主要看《深入理解java虛擬機》

7.設計模式

參考書籍:《大話設計模式》

知道每種設計模式是啥意思,可以手寫一個單例模式,手寫適配器模式,工廠模式,觀察者模式,裝飾器模式。

知識點:

----------------------------------------------------------------------------------------------

基本把我上面列的知識點都搞懂,算法題都刷地明明白白的,不說battmd這些公司,至少我覺得互聯網前50+

如果沒有項目經驗,想做項目,可以推薦你去淘寶上去買黑馬視頻,照著整個java web的項目、

-----------------------------------------------------------------------------------

附上我嘔心瀝血整理的java面經,覺得有用的點贊關注走一波!!!

附上我嘔心瀝血整理的java面經,覺得有用的點贊關注走一波!!!

附上我嘔心瀝血整理的java面經,覺得有用的點贊關注走一波!!!

關注我的公眾號 現名字:程序員喬戈裡

在後臺回覆:面經 按照要求即可獲取到我的面經,也算是對我繼續輸出乾貨的一種鼓勵。謝謝大家!!!

-------------------------------------------------------------------------------------------

1.實習對於找工作的作用???

答:很重要,也不重要。很重要:實習經歷的作用:1.面試都是有固定的時間,比如一些公司規定一次面試最短時間是40分鐘,你如果做過實習,可以好好加工一下你的實習經歷,使勁吹,可以佔個10分鐘多點時間,然後後來問你的東西就少了些;2.學歷不好的可以通過一些實習經歷獲得大公司的筆試面試的機會;3.在同等面試表現的前提下,有實習經歷的優先考慮

不重要:

春招的暑期實習和提前批的時間衝突,春招的暑期實習和提前批的時間衝突,春招的暑期實習和提前批的時間衝突,(如果你現在距離秋招的8月還有挺長時間,如果獲得實習機會直接就去,如果是7月和8月的實習得慎重,實習也不一定能留用)所以你如果春招找到的實習不是自己想最後工作的小公司,那麼不建議去實習,不如好好準備秋招。如果是心儀的部門和崗位比如BAT之類的可以去實習。假如去實習了,一定要關注轉正的事,好好努力,同時也別忘準備秋招,晚上和週末看書刷題看面經。沒轉正立馬走人準備秋招。(實習的時候也可以投提前批電話面試,樓主當初沒投,其實可以投幾個單獨招聘的提前批,比如百度很多部門都是自己招聘提前批的,不走系統,過了才錄入系統)

完全可以用實習這段時間,好好複習,準備提前批也是個不錯的選擇,當然如果你前期準備充分,那麼可以去實習,如果你時間已經非常緊了,比如你6月份才開始準備,人家8月份就提前批了,你去不去實習就得好好衡量了,大廠的實習一定要去,秋招加成不少。

2.啥時候開始準備?

現在!!!現在!!!現在!!!

3.沒有java開發的項目咋辦???

答:0.關注我的公眾號:原名字:HIT程序猿的日常 現名字:程序員喬戈裡

在我的公眾號有我做過的一些項目的源碼分享,以及一些練手項目的視頻教程。

1.去淘寶買黑馬的視頻,照著做一個javaweb的項目,然後使勁扣項目,到時候就是和麵試官吹,30元左右,沒錢買的話,大家可以在我評論下眾籌一波,哈哈哈啊哈哈哈。

2.淘寶買牛客網的項目視頻,聽說葉神的項目不錯;

4.HR面試

一頓跪舔就行,就是你們公司真好,你自己羅列個123哪裡好;女朋友,有也說沒有(也可以說有,女朋友就在xx公司的地方上班/上學);父母不干涉決定;薪資,互聯網的普遍薪資就行(適用於第一份offer,以及非常想去的公司)。總之就是求生欲強一些。

5.答主,我選算法還是開發呀?

你如果是北京時間2018.10.3號看見了我這篇回答,而且自己本身的學歷不錯本碩985/211專業都是計算機相關的,那麼我強烈建議你選算法。原因有:1.算法工資比開發高;2.算法比開發輕鬆;你會說算法難啊,不好找啊!!!我不知道你怕啥,你就硬著頭皮去整(每天高三一般的生活,如果你每天吊兒郎當的,最後沒找到,怪我了,那你滾一邊去哈,我不背這鍋),你本身條件不錯,最後肯定會有offer。而且有的公司,就算你算法不行,會問你可以轉開發不,所以搞算法何樂而不為呢???

如果你是距離2019年或者8021年的臨近秋招前的2-3個月時間看到我這篇回答,而且你學歷不是很好,那麼我建議你去整開發。

上述說的情況也不完全適用,反正就是follow your heart!!!

6.答主你咋不回覆我評論啊???

你都不讚我,我也不想回復你。。。。

7.java開發需要看的書籍推薦???

具體請查看我的專欄文章

Java後端書架

非學生版

一、基礎篇JVM

JVM內存結構

堆、棧、方法區、直接內存、堆和棧區別

Java內存模型

內存可見性、重排序、順序一致性、volatile、鎖、final

垃圾回收

內存分配策略、垃圾收集器(G1)、GC算法、GC參數、對象存活的判定

JVM參數及調優Java對象模型

oop-klass、對象頭

HotSpot

即時編譯器、編譯優化

類加載機制

classLoader、類加載過程、雙親委派(破壞雙親委派)、模塊化(jboss modules、osgi、jigsaw)

虛擬機性能監控與故障處理工具

jps, jstack, jmap、jstat, jconsole, jinfo, jhat, javap, btrace、TProfiler

編譯與反編譯

javac 、javap 、jad 、CRF

Java基礎知識

閱讀源代碼

String、Integer、Long、Enum、BigDecimal、ThreadLocal、ClassLoader & URLClassLoader、ArrayList & LinkedList、 HashMap & LinkedHashMap & TreeMap & CouncurrentHashMap、HashSet & LinkedHashSet & TreeSet

Java中各種變量類型熟悉Java String的使用,熟悉String的各種函數

JDK 6和JDK 7中substring的原理及區別、

replaceFirst、replaceAll、replace區別、

String對“+”的重載、

String.valueOf和Integer.toString的區別、

字符串的不可變性

自動拆裝箱

Integer的緩存機制

熟悉Java中各種關鍵字

transient、instanceof、volatile、synchronized、final、static、const 原理及用法。

集合類

常用集合類的使用

ArrayList和LinkedList和Vector的區別

SynchronizedList和Vector的區別

HashMap、HashTable、ConcurrentHashMap區別

Java 8中stream相關用法

apache集合處理工具類的使用

不同版本的JDK中HashMap的實現的區別以及原因

枚舉

枚舉的用法、枚舉與單例、Enum類

Java IO&Java NIO,並學會使用

bio、nio和aio的區別、三種IO的用法與原理、netty

Java反射與javassist

反射與工廠模式、

Java序列化

什麼是序列化與反序列化、為什麼序列化

序列化底層原理

序列化與單例模式

protobuf

為什麼說序列化並不安全

註解

元註解、自定義註解、Java中常用註解使用、註解與反射的結合

JMS

什麼是Java消息服務、JMS消息傳送模型

JMX

泛型

泛型與繼承

類型擦除

泛型中K T V E

object等的含義、泛型各種用法

單元測試

junit、mock、mockito、內存數據庫(h2)

正則表達式

常用的Java工具庫

,

什麼是API&SPI異常

異常類型、正確處理異常、自定義異常

時間處理

時區、時令、Java中時間API

編碼方式

解決亂碼問題、常用編碼方式

語法糖

Java中語法糖原理、解語法糖

Java併發編程

什麼是線程,與進程的區別閱讀源代碼,並學會使用

Thread、Runnable、Callable、ReentrantLock、ReentrantReadWriteLock、Atomic*、Semaphore、CountDownLatch、、ConcurrentHashMap、Executors

線程池

自己設計線程池、submit() 和 execute()

線程安全

死鎖、死鎖如何排查、Java線程調度、線程安全和內存模型的關係

CAS、樂觀鎖與悲觀鎖、數據庫相關鎖機制、分佈式鎖、偏向鎖、輕量級鎖、重量級鎖、monitor、鎖優化、鎖消除、鎖粗化、自旋鎖、可重入鎖、阻塞鎖、死鎖

死鎖volatile

happens-before、編譯器指令重排和CPU指令重

synchronized

synchronized是如何實現的?

synchronized和lock之間關係

不使用synchronized如何實現一個線程安全的單例

sleep 和 waitwait 和 notifynotify 和 notifyAllThreadLocal寫一個死鎖的程序寫代碼來解決生產者消費者問題守護線程

守護線程和非守護線程的區別以及用法

二、 進階篇Java底層知識

字節碼、class文件格式CPU緩存,L1,L2,L3和偽共享尾遞歸位運算

用位運算實現加、減、乘、除、取餘

設計模式

瞭解23種設計模式會使用常用設計模式

單例、策略、工廠、適配器、責任鏈。

實現AOP實現IOC不用synchronized和lock,實現線程安全的單例模式nio和reactor設計模式

網絡編程

tcp、udp、http、https等常用協議

三次握手與四次關閉、流量控制和擁塞控制、OSI七層模型、tcp粘包與拆包

http/1.0 http/1.1 http/2之前的區別Java RMI,Socket,HttpClientcookie 與 session

cookie被禁用,如何實現session

用Java寫一個簡單的靜態文件的HTTP服務器

實現客戶端緩存功能,支持返回304 實現可併發下載一個文件 使用線程池處理客戶端請求 使用nio處理客戶端請求 支持簡單的rewrite規則 上述功能在實現的時候需要滿足“開閉原則”

瞭解nginx和apache服務器的特性並搭建一個對應的服務器用Java實現FTP、SMTP協議進程間通訊的方式什麼是CDN?如果實現?什麼是DNS?反向代理

框架知識

Servlet線程安全問題Servlet中的filter和listenerHibernate的緩存機制Hiberate的懶加載Spring Bean的初始化Spring的AOP原理自己實現Spring的IOCSpring MVCSpring Boot2.0

Spring Boot的starter原理,自己實現一個starter

Spring Security

應用服務器

JBosstomcatjettyWeblogic

工具

git & svnmaven & gradle

三、 高級篇新技術

Java 8

lambda表達式、Stream API、

Java 9

Jigsaw、Jshell、Reactive Streams

Java 10

局部變量類型推斷、G1的並行Full GC、ThreadLocal握手機制

Spring 5

響應式編程

Spring Boot 2.0

性能優化

使用單例、使用Future模式、使用線程池、選擇就緒、減少上下文切換、減少鎖粒度、數據壓縮、結果緩存

線上問題分析

dump獲取

線程Dump、內存Dump、gc情況

dump分析

分析死鎖、分析內存洩露

自己編寫各種outofmemory,stackoverflow程序

HeapOutOfMemory、 Young OutOfMemory、MethodArea OutOfMemory、ConstantPool OutOfMemory、DirectMemory OutOfMemory、Stack OutOfMemory Stack OverFlow

常見問題解決思路

內存溢出、線程死鎖、類加載衝突

使用工具嘗試解決以下問題,並寫下總結

當一個Java程序響應很慢時如何查找問題、

當一個Java程序頻繁FullGC時如何解決問題、

如何查看垃圾回收日誌、

當一個Java應用發生OutOfMemory時該如何解決、

如何判斷是否出現死鎖、

如何判斷是否存在內存洩露

編譯原理知識

編譯與反編譯Java代碼的編譯與反編譯Java的反編譯工具詞法分析,語法分析(LL算法,遞歸下降算法,LR算法),語義分析,運行時環境,中間代碼,代碼生成,代碼優化

操作系統知識

Linux的常用命令進程同步緩衝區溢出分段和分頁虛擬內存與主存

數據庫知識

MySql 執行引擎MySQL 執行計劃

如何查看執行計劃,如何根據執行計劃進行SQL優化

SQL優化事務

事務的隔離級別、事務能不能實現鎖的功能

數據庫鎖

行鎖、表鎖、使用數據庫鎖實現樂觀鎖、

數據庫主備搭建binlog內存數據庫

h2

常用的nosql數據庫

redis、memcached

分別使用數據庫鎖、NoSql實現分佈式鎖性能調優

數據結構與算法知識

簡單的數據結構

棧、隊列、鏈表、數組、哈希表、

二叉樹、字典樹、平衡樹、排序樹、B樹、B+樹、R樹、多路樹、紅黑樹

排序算法

各種排序算法和時間複雜度 深度優先和廣度優先搜索 全排列、貪心算法、KMP算法、hash算法、海量數據處理

大數據知識

Zookeeper

基本概念、常見用法

Solr,Lucene,ElasticSearch

在linux上部署solr,solrcloud,,新增、刪除、查詢索引

Storm,流式計算,瞭解Spark,S4

在linux上部署storm,用zookeeper做協調,運行storm hello world,local和remote模式運行調試storm topology。

Hadoop,離線計算

HDFS、MapReduce

分佈式日誌收集flume,kafka,logstash數據挖掘,mahout

網絡安全知識

什麼是XSS

XSS的防禦

什麼是CSRF什麼是注入攻擊

SQL注入、XML注入、CRLF注入

什麼是文件上傳漏洞加密與解密

MD5,SHA1、DES、AES、RSA、DSA

什麼是DOS攻擊和DDOS攻擊

memcached為什麼可以導致DDos攻擊、什麼是反射型DDoS

SSL、TLS,HTTPS如何通過Hash碰撞進行DOS攻擊用openssl籤一個證書部署到apache或nginx

四、架構篇分佈式

數據一致性、服務治理、服務降級

分佈式事務

2PC、3PC、CAP、BASE、 可靠消息最終一致性、最大努力通知、TCC

Dubbo

服務註冊、服務發現,服務治理

分佈式數據庫

怎樣打造一個分佈式數據庫、什麼時候需要分佈式數據庫、mycat、otter、HBase

分佈式文件系統

mfs、fastdfs

分佈式緩存

緩存一致性、緩存命中率、緩存冗餘

微服務

SOA、康威定律

ServiceMeshDocker & KubernetsSpring BootSpring Cloud

高併發

分庫分表CDN技術消息隊列

ActiveMQ

監控

監控什麼

CPU、內存、磁盤I/O、網絡I/O等

監控手段

進程監控、語義監控、機器資源監控、數據波動

監控數據採集

日誌、埋點

Dapper

負載均衡

tomcat負載均衡、Nginx負載均衡

DNS

DNS原理、DNS的設計

CDN

數據一致性

五、 擴展篇雲計算

IaaS、SaaS、PaaS、虛擬化技術、openstack、Serverlsess

搜索引擎

Solr、Lucene、Nutch、Elasticsearch

權限管理

Shiro

區塊鏈

哈希算法、Merkle樹、公鑰密碼算法、共識算法、Raft協議、Paxos 算法與 Raft 算法、拜占庭問題與算法、消息認證碼與數字簽名

比特幣

挖礦、共識機制、閃電網絡、側鏈、熱點問題、分叉

以太坊超級賬本

人工智能

數學基礎、機器學習、人工神經網絡、深度學習、應用場景。

常用框架

TensorFlow、DeepLearning4J

其他語言

Groovy、Python、Go、NodeJs、Swift、Rust

六、 推薦書籍

《深入理解Java虛擬機》

《Effective Java》

《深入分析Java Web技術內幕》

《大型網站技術架構》

《代碼整潔之道》

《Head First設計模式》

《maven實戰》

《區塊鏈原理、設計與應用》

《Java併發編程實戰》

《鳥哥的Linux私房菜》

《從Paxos到Zookeeper》

《架構即未來》

以下是我的編程資料,還有其他的將近3T需要的關注我公眾號程序員喬戈裡:

最後推廣一下我的公眾號,名字:程序員喬戈裡 公眾號中有我的聯繫方式,有上述所以知識點的所有答案的面經整合版,也有我收集的一些java有關的資源,各種視頻教程,我的一些校招經歷,相關電子書籍,以及未來的乾貨分享,相信不會讓大家失望,謝謝大家,來一波關注,謝謝,也算是對我的這篇回答的一個肯定,您的點贊與關注是我創作分享乾貨的源泉!!!您的點贊與關注是我創作分享乾貨的源泉!!!您的點贊與關注是我創作分享乾貨的源泉!!!


程序員喬戈裡


1、如果你不是java專業,想通過java來就業的話,建議還是找個java培訓機構,系統學習下。比如達內,尚學堂等。

2、如果一定要自學的話,可以在騰訊課堂、網易雲課堂上,找一個系統的java培訓課程來學習吧

3、具體的java學習,步驟

。下載jdk,安裝java運行環境,寫個helloworld。

。 學習javaSE。 java的變量、循環、條件語句。基礎類Class、String、Date、List等,線程、併發等

。 學習數據庫操作 JDBC、sql

。學習前端基礎知識html、css、javascript

。 學習javaEE。serverlet、jsp、cookie、session; 常見的企業應用框架,如Spring、springmvc、mybatis、hibernate等

。學習dubbo、springboot 微服務架構

具體的學習內容有很多。入門之後,慢慢就自己有體會,知道自己什麼不懂,需要學習什麼。


java和小熊


我就是自學的,說一下我的情況,自學不出錯誤,或者出一些簡單的錯誤還行,要是出一些jar包衝突,版本衝突的錯誤,可能這一天就幹不了別的了,

自學即使學了框架也只是簡單的crud,多表聯查,也只能做一些小項目,而且這些小項目實現功能即可,也涉及不到線程問題,業務邏輯也簡單,最好是把基礎打好,再去找一份工作,不一定能掙錢,最主要的是體驗一下真實情況的項目開發,和真實項目的業務邏輯,

建議學歷為本科,

自學的話3個月差不多

報培訓班得6個月出來,學費2萬,吃住穿下來估計要1萬

自學再就是看你坐不坐的住了,肩膀,斜方肌僵硬,脖子難受,你都得考慮到!貴在堅持,加油!

給你一份我前兩天的面試題,希望能幫到你



97654326464


Java自學分為四個步驟

1. Java語言基礎,如果是計算機專業基本可以略過,非計算機專業只需要看一下Java編程思想和HeadFirst Java這兩本書就可以了,界面化相關的直接略過,一定要把代碼照著書本在idea或者eclipse裡面大概過一遍,這一部分過完之後一定要發動github上面,這是自學的成果。

2. springbootweb開發,直接對應spring官網找對應文檔進行學習就好。

3.JVM和併發,看深入理解虛擬機和java併發編程之美兩本書就差不多了,也可以找一下別的資料深入學習。

4.分佈式相關的內容,主要是dubbo,apollo,springcloud,rocketmq和netty等相關框架的使用和深入學習。


突破程序員


每個人的學習方法是不同的,一個人的方法不見得適合另一個人,我只能是談自己的學習方法。因為我學習Java是完全自學的,從來沒有問過別人,所以學習的過程基本上完全是自己摸索出來的。我也不知道這種方法是否是比較好的方法,只能給大家提供一點參考了。

學習Java的第一步是安裝好JDK

寫一個Hello ?World,其實JDK的學習沒有那麼簡單,關於JDK有兩個問題是很容易一直困擾Java程序員的地方:一個是CLASSPATH的問題,其實從原理上來說,是要搞清楚JRE的ClassLoader是如何加載Class的;另一個問題是package和import問題,如何來尋找類的路徑問題。把這兩個問題摸索清楚了,就掃除了學習Java和使用JDK的最大障礙。推薦看一下王森的《Java深度歷險》,對這兩個問題進行了深入的探討。

第二步是學習Java的語法

Java的語法是類C++的,基本上主流的編程語言不是類C,就是類C++的,沒有什麼新東西,所以語法的學習,大概就是半天的時間足夠了。唯一需要注意的是有幾個不容易搞清楚的關鍵字的用法,public,protected,private,static,什麼時候用,為什麼要用,怎麼用,這可能需要有人來指點一下,我當初是完全自己琢磨出來的,花了很久的時間。不過後來我看到《Thinking in Java》這本書上面是講了這些概念的。

第三步是學習Java的面向對象的編程語言的特性的地方。

比如繼承,構造器,抽象類,接口,方法的多態,重載,覆蓋,Java的異常處理機制。對於一個沒有面向對象語言背景的人來說,我覺得這個過程需要花很長很長時間,因為學習Java之前沒有C++的經驗,只有C的經驗,我是大概花了一個月左右吧,才徹底把這些概念都搞清楚,把書上面的例子反覆的揣摩,修改,嘗試,把那幾章內容反覆的看過來,看過去,看了不下5遍,才徹底領悟了。不過我想如果有C++經驗的話,應該一兩天時間足夠了。那麼在這個過程中,可以多看看《Thinking in Java》這本書,對面向對象的講解非常透徹。可惜的是我學習的時候,並沒有看到這本書,所以自己花了大量的時間,通過自己的嘗試和揣摩來學會的。

第四步就是開始熟悉Java的類庫。

Java的基礎類庫其實就是JDK安裝目錄下面jre/lib/rt.jar這個包。學習基礎類庫就是學習 rt.jar。基礎類庫裡面的類非常非常多。據說有3000多個,我沒有統計過。但是真正對於我們來說最核心的只有4個,分別是

java.lang.*;

java.io.*;

java.util.*;

java.sql.*;

這四個包的學習,每個包的學習都可以寫成一本厚厚的教材,而O'reilly也確實是這樣做的。我覺得如果時間比較緊,是不可能通過讀四本書來學習。我覺得比較好的學習方法是這樣的:

首先要通讀整個package的框架,瞭解整個package的class,interface,exception的構成,最好是能夠找到介紹整個包框架的文章。這些專門介紹包的書籍的前幾章應該就是這些總體的框架內容介紹。

對包整體框架的把握並不是要熟悉每個類的用法,記住它有哪些屬性,方法。想記也記不住的。而是要知道包有哪些方面的類構成的,這些類的用途是什麼,最核心的幾個類分別是完成什麼功能的。我在給人培訓的時候一般是一次課講一個包,所以不可能詳細的介紹每個類的用法,但是我反覆強調,我給你們講這些包的不是要告訴你們類的方法是怎麼調用的,也不要求你們記住類的方法調用,而是要你們瞭解,Java給我們提供了哪些類,每個類是用在什麼場合,當我遇到問題的時候,我知道哪個類,或者哪幾個類的組合可以解決我的問題,That'all!,當我們具體寫程序的時候,只要你知道該用哪個類來完成你的工作就足夠了。編碼的時候,具體的方法調用,是邊寫代碼,邊查Documentation,所有的東西都在Documentation裡面,不要求你一定記住,實際你也記不住3000多個類的總共將近10萬個方法調用。所以對每個包的總體框架的把握就變得極為重要。

第五步,通過上面的學習,如果學的比較紮實的話,就打好了Java的基礎了,剩下要做的工作是掃清Documentation裡面除了上面4個包之外的其他一些比較有用處的類。相信進展到這一步,Java的自學能力已經被培養出來了,可以到了直接學習Documentation的水平了。除了要做GUI編程之外,JDK裡面其他會有用處的包是這些:

java.text.*;

java.net.*;

javax.naming.*;

這些包裡面真正用的比較多的類其實很少,只有幾個,所以不需要花很多時間。

第六步,Java Web 編程

Web編程的核心是HTTP協議,HTTP協議和Java無關,如果不熟悉HTTP協議的話,雖然也可以學好Servlet/JSP編程,但是達不到舉一反三,一通百通的境界。所以HTTP協議的學習是必備的。如果熟悉了HTTP協議的話,又有了Java編程的良好的基礎,學習Servlet/JSP簡直易如反掌,我學習Servlet/JSP就用了不到一週的時間,然後就開始用JSP來做項目了。

在Servlet/JSP的學習中,重頭仍然是Servlet Documentation。Servlet API最常用的類很少,花比較少的時間就可以掌握了。把這些類都看一遍,多寫幾個例子試試。Servlet/JSP編程本質就是在反覆調用這些類來通過 HTTP協議在Web Server和Brower之間交談。另外對JSP,還需要熟悉幾個常用JSP的標記,具體的寫法記不住的話,臨時查就是了。

此外Java Web編程學習的重點要放在Web Application的設計模式上,如何進行業務邏輯的分析,並且進行合理的設計,按照MVC設計模式的要求,運用Servlet和JSP分別完成不同的邏輯層,掌握如何在Servlet和JSP之間進行流程的控制和數據的共享,以及Web Application應該如何配置和部署。

第七步,J2EE編程

以上的學習過程如果是比較順利的話,進行到這一步,難度又陡然提高。因為上面的知識內容 都是隻涉及一個方面,而像EJB,JMS,JTA等核心的J2EE規範往往是幾種Java技術的綜合運用的結晶,所以掌握起來難度比較大。

首先一定要學習好JNDI,JNDI是App Server定位服務器資源(EJB組件,Datasouce,JMS)查找方法,如果對JNDI不熟悉的話,EJB,JMS這些東西幾乎學不下去。 JNDI其實就是javax.naming.*這個包,運用起來很簡單。難點在於服務器資源文件的配置。對於服務器資源文件的配置,就需要看看專門的文檔規範了,比如web.xml的寫法,ejb-jar.xml的寫法等等。針對每種不同的App Server,還有自己的服務資源配置文件,也是需要熟悉的。

然後可以學習JTA,主要是要理解JTA對於事務的控制的方法,以及該在什麼場合使用JTA。這裡可以簡單的舉個例子,我們知道一般情況可以對於一個數據庫連接進行事務控制(conn.setAutoCommit (false),....,conn.commit()),做為一個原子操作,但是假設我的業務需求是要把對兩個不同數據庫的操作做為一個原子操作,你能做的到嗎?這時候只能用JTA了。假設操作過程是先往A數據庫插一條記錄,然後刪除B數據庫另一個記錄,我們自己寫代碼是控制不了把整個操作做為一個原子操作的。用JTA的話,由App Server來完成控制。

在學習EJB之前要學習對象序列化和RMI,RMI是EJB的基礎。接著學習JMS和EJB,對於EJB來說,最關鍵是要理解EJB是如何通過RMI來實現對遠端對象的調用的,以及在什麼情況下要用到EJB。

在學習完EJB,JMS這些東西之後,你可能會意識到要急不可待學習兩個領域的知識,一個是UML,另一個是Design Pattern。Java企業軟件的設計非常重視框架(Framework)的設計,一個好的軟件框架是軟件開發成功的必要條件。在這個時候,應該開始把學習的重點放在設計模式和框架的學習上,通過學習和實際的編程經驗來掌握EJB的設計模式和J2EE的核心模式。

J2EE規範裡面,除了EJB,JMS,JTA,Servlet/JSP,JDBC之外還有很多很多的企業技術,這裡不一一進行介紹了。

另外還有一個最新領域Web Services。Web Services也完全沒有任何新東西,它像是一種黏合劑,可以把不同的服務統一起來提供一個統一的調用接口,作為使用者來說,我只要獲得服務提供者給我的WSDL(對服務的描述),就夠了,我完全不知道服務器提供者提供的服務究竟是EJB組件,還是.Net組件,還是什麼CORBA組件,還是其他的什麼實現,我也不需要知道。Web Services最偉大的地方就在於通過統一的服務提供方式和調用方式,實現了整個Internet服務的共享,是一個非常令人激動的技術領域。Web Services好像目前還沒有什麼很好的書籍,但是可以通過在網絡上面查資料的方式來學習。


小鹿同學


自學當然好啦,可以省不少的錢, 可是自學會碰到很多問題呢。 個人花了一年半時間(當前時間是20170815),做了個Java自學的網站,試圖解決一些自學中會碰到的問題。

1. 思路、框架、原理 一下子湧進來太多,接受不過來

無論是剛開始接觸Java這門語言,還是像現在需要去學習一些新的技術的時候,都會選擇去百度資料進行學習。 然而百度來的資料很多都有個不好的做法,就是一開篇就以一種高屋建瓴的方式講很多思路,原理和框架。 事實上,對於剛開始接觸,還沒有多少動手實踐的新手而言,是很難領會這些高屋建瓴的思路、原理和框架的,不僅不利於上手,而且還給初學者形成了一種暗示和心裡壓力:這個東西學習梯度是蠻陡峭的哦,無形中加大了學習的難度。

我偏愛的學習方式是,不要一來給我講太多的東西,直接給我代碼,讓我跑起來。 只要跑出結果了,我自然而然就會得到一定的領悟,然後再自己去瀏覽每行代碼,並琢磨其含義,那麼就能逐漸理解和消化了。

推己及人,所以我在做Java教程的時候,也是採用這種方式,在每個知識點的講解,都是一來就給出了可以運行的代碼,並且提供便捷的複製手段,這樣大家一上手就是跑一個可以看到效果的代碼:

2. 自己寫不知道錯誤在哪裡

經過上一步跑起來了,真的可以看到效果呢,可是代碼是複製粘貼來的,那可不行,得自己敲出來才行。 這個想法當然是好的,所以就開始一個個關鍵字,一行行的敲代碼起來。

可是因為初學者不熟練,也許是某一個字母出錯,或者少寫了一個分號,程序就跑不起來,而且這種細微的差別,很有可能找上大半天去了。 為了提高這部分的學習效率,在教程每個代碼右邊都提供了代碼比較功能

3. 運行某個代碼,需要第三方jar包,手裡卻沒有,怎麼辦

Java代碼運行有個特點,常常需要用到第三方類,而這些類都放在.jar這種格式的文件裡。如果這些jar包,讓初學者自己去找, 一個是不知道在哪裡下載,再一個同樣的jar包會有各種不同的版本,有些版本與當前代碼是不兼容的,所以這裡也是容易掉進坑裡,花很多很多時間才會找到對的那個jar包。

所以在需要用到jar包的地方,都直接在教程相關下載區域提供了當前代碼正在使用的jar包,點擊即可下載使用,方便快捷~

4. 這個知識點涉及的部分真多,有個思路圖,原理圖捋一下就好多了

現在好了,照著教程自己做了一邊,做出來了,效果也看到了,那麼就有了感性的認識。 不僅做出來了,心中還產生了更多問題,這個時候,就處於一個飢渴的狀態了。 那麼此時此刻,開始講原理圖,思路圖,就能夠聽得懂了,並且通過思路圖也能把剛才所學整理,總結,更好的消化吸收。

5. 光是圖文我還是看不懂,想看看視頻怎麼講的

有部分的知識點還是挺複雜的,比如算法,hashcode 原理什麼的。 光是看圖文和代碼,還是有些稀裡糊塗的。

雖然有些稀裡糊塗,但是經過自己敲過一遍,是帶著針對性問題的稀裡糊塗。 那麼這個時候,帶著問題來看視頻講解,效果就會非常好了。

6. 雖然也寫出來了,但是個別細節還是有疑問,該問誰呢

在每個知識點下面,都有一個提問區域,裡面有和你學習同樣知識點的同學的疑問,或許你可以在別人提問的答案裡找到自己需要的,也可以通過看別人的提問,啟發自己做擴展性的思考。




分享到:


相關文章: