什么才是Java的基礎(chǔ)知識(shí)昨登?

近日里蹬挤,很多人邀請(qǐng)我回答各種j2ee開(kāi)發(fā)的初級(jí)問(wèn)題,我無(wú)一都強(qiáng)調(diào)java初學(xué)者要先扎實(shí)自己的基礎(chǔ)知識(shí),那什么才是java的基礎(chǔ)知識(shí)囚似?又怎么樣才算掌握了java的基礎(chǔ)知識(shí)呢?這個(gè)問(wèn)題還真值得仔細(xì)思考线得。

我做j2ee開(kāi)發(fā)已經(jīng)超過(guò)十載饶唤,作為過(guò)來(lái)人,心路歷程估計(jì)和大家差不多贯钩。編碼的前幾年募狂,很長(zhǎng)一段時(shí)間覺(jué)得java簡(jiǎn)單,開(kāi)發(fā)實(shí)現(xiàn)各種功能都很輕松角雷,代碼寫起來(lái)根本不費(fèi)勁(主要是因?yàn)閷懙拇a都是一些功能業(yè)務(wù)邏輯)祸穷。但同時(shí)自己心里明白,自己其實(shí)沒(méi)有什么水平勺三,自己這3,4年以來(lái)學(xué)懂的東西就那么多雷滚,其他人幾個(gè)月就可以學(xué)會(huì),自己的競(jìng)爭(zhēng)力在哪里吗坚?這種矛盾的心理祈远,困擾了我非常長(zhǎng)的時(shí)間,非常的苦惱商源!總有一種報(bào)國(guó)無(wú)門無(wú)處發(fā)力的感覺(jué)车份。


這個(gè)時(shí)期,熱衷了使用各種框架牡彻,各種api扫沼,常以今天學(xué)習(xí)了某個(gè)api,組件庄吼,框架的使用就覺(jué)得自己學(xué)到了東西缎除,設(shè)計(jì)模式也看過(guò)不止一次,但都沒(méi)有啥感覺(jué)总寻。一方面很努力學(xué)習(xí)伴找,一方面又覺(jué)得不踏實(shí),因?yàn)槔邕@個(gè)api我知道而你不知道废菱,但我告訴你之后你就知道了技矮,那我比你的優(yōu)勢(shì)在哪里呢?苦惱*2

過(guò)了很長(zhǎng)一段這種惶惶不可終日的日子殊轴,決定自己要改變衰倦,改變的方向就是閱讀自己用到的java相關(guān)的源代碼,看看jdk是如何實(shí)現(xiàn)的旁理。就從基本的數(shù)據(jù)結(jié)構(gòu)看樊零,然后看多線程相關(guān),在學(xué)習(xí)前臺(tái)等等。寫的代碼還是那些代碼驻襟,代碼還是那么簡(jiǎn)單夺艰,但我力求做到知道代碼背后的真相,這就是我最開(kāi)始努力的方向沉衣。于是不再把時(shí)間都花在追求各種新框架郁副、新API的使用上,每天都花時(shí)間在看實(shí)現(xiàn)原理上豌习。就這樣過(guò)了大半年左右存谎,終于不再迷茫,不會(huì)在覺(jué)得自己只懂a(chǎn)pi的使用肥隆,覺(jué)得自己沒(méi)有那么膚淺了既荚,說(shuō)脫胎換骨也不為過(guò)。那段時(shí)間栋艳,是我成長(zhǎng)最快的時(shí)期恰聘,也是最充實(shí)的一段時(shí)光。

Talk is cheap吸占,show me the code憨琳。舉例說(shuō)明大家會(huì)比較有感覺(jué)。

如學(xué)習(xí)了hashmap的源代碼知道了工作原理之后旬昭,使用hashmap

Map map =?new?HashMap<>();

代碼還是那個(gè)代碼篙螟,但我已經(jīng)知道了hashmap背后的東西

數(shù)據(jù)結(jié)構(gòu)是鏈表的數(shù)組(注:后面的版本為了提升性能,已經(jīng)是改成鏈表或者樹(shù)(節(jié)點(diǎn)較多)了)

思想上是空間換時(shí)間的算法

構(gòu)造函數(shù)上有容量和負(fù)載因子2個(gè)參數(shù)以及作用

決定性能的是key的hashcode是否夠快问拘、結(jié)果夠分散(不分散就會(huì)變成鏈表的性能了)遍略,和擴(kuò)容的開(kāi)銷(什么時(shí)候擴(kuò)容,和負(fù)載因子有關(guān))

然后寫代碼的時(shí)候骤坐,如果知道了最終的容量(尤其是數(shù)據(jù)量大的時(shí)候)绪杏,我都會(huì)指定初始化容量,類似如下

List?list?= doSomeThing();?

Map?map?=?new?HashMap<>((int)(list.size()/0.75));//0.75為默認(rèn)負(fù)載因子

如果工作中某個(gè)map使用特別多纽绍,性能還需要繼續(xù)優(yōu)化蕾久,我就會(huì)考慮從以下方面優(yōu)化

如果key是自己定義的對(duì)象,那么hashcode方法是否夠快(最少應(yīng)該緩存保證只計(jì)算一次拌夏,而且放入之后不能改變僧著,決定hashcode的字段不能改變)? hash的結(jié)果是否夠分散障簿?

可以考慮調(diào)小負(fù)載因子盹愚,花更多的空間來(lái)?yè)Q時(shí)間

學(xué)習(xí)源代碼的時(shí)候,特別有意思站故,你會(huì)強(qiáng)烈感覺(jué)到一個(gè)詞:舉一反三皆怕!觸類旁通!學(xué)習(xí)api使用的時(shí)候,如果你只知道使用不知道原理愈腾,很難舉一反三憋活,感覺(jué)的是死記硬背。但學(xué)習(xí)了原理之后虱黄,知識(shí)成體系后悦即,很容易舉一反三,學(xué)的越多就容易礁鲁,還是以hashmap為例,我舉一個(gè)hashmap反三個(gè)點(diǎn)赁豆。


1. 你會(huì)知道但凡有數(shù)組的數(shù)據(jù)結(jié)構(gòu)仅醇,構(gòu)造函數(shù)都有一個(gè)容量的初始化參數(shù)(或者說(shuō)構(gòu)造函數(shù)有初始化容量的可能都是數(shù)組的數(shù)據(jù)結(jié)構(gòu))。構(gòu)造函數(shù)如下

public?ArrayList(int?initialCapacity)?//LinkedList不是數(shù)組就沒(méi)有

public?HashMap(int?initialCapacity)?

public?StringBuffer(int?capacity)

你就會(huì)知道魔种,數(shù)組擴(kuò)容很耗性能(數(shù)據(jù)量大容易o(hù)om)析二,盡量指定容量。

2. 算法是空間換時(shí)間节预,還有沒(méi)有其他算法是這種思想的叶摄?你最少能找到一個(gè)桶排序。

3. 數(shù)據(jù)庫(kù)的分庫(kù)分表安拟,思路和hashmap大同小異

4. 各種分布式的hash一致性算法蛤吓,第一步都是創(chuàng)建一個(gè)最大的數(shù)組(Integer.MAX_VALUE),就是避免了hashmap最耗性能的擴(kuò)容運(yùn)算。

學(xué)習(xí)了hashmap之后糠赦,你很自然就會(huì)去了解其他的map会傲,如TreeMap,LinkedHashmap(超級(jí)有用)拙泽,HashTable淌山,ConcurrentSkipListMap(算法思路很有意思),ConcurrentHashMap等顾瞻,你會(huì)知道set就是用map做的泼疑,都不需要學(xué)。到了這步荷荤,map相關(guān)就可以暫告一段落退渗。

在學(xué)習(xí)中,我發(fā)現(xiàn)思想上的東西是最重要的蕴纳,你理解了思想氓辣,一下子就豁然開(kāi)朗了,在也不需要死記硬背了袱蚓。如學(xué)習(xí)CAS的時(shí)候钞啸,大家都知道這是一種指令級(jí)的免鎖實(shí)現(xiàn)。看代碼的時(shí)候体斩,我一度疑惑為什么會(huì)有個(gè)while死循環(huán)(原諒我天資駑鈍)

public?final?int?getAndUpdate(IntUnaryOperator updateFunction)?{

int?prev, next;

do?{

prev =?get();

next = updateFunction.applyAsInt(prev);

}?while?(!compareAndSet(prev, next));

return?prev;

}

后來(lái)從思想上理解梭稚,才知道樂(lè)觀鎖的概念,就是很樂(lè)觀絮吵,假設(shè)你不會(huì)出錯(cuò)弧烤,但你要是出錯(cuò)了我就重試有辦法給你修復(fù),對(duì)應(yīng)的就是悲觀鎖蹬敲,就是很悲觀暇昂,覺(jué)得不鎖就會(huì)出錯(cuò),如synchronize關(guān)鍵字和reentrantlock伴嗡。這體現(xiàn)了2種不同截然不同的管理思想急波。這種思想經(jīng)常體現(xiàn)在多個(gè)系統(tǒng)集成的設(shè)計(jì),有些時(shí)候如果你用悲觀的思想設(shè)計(jì)瘪校,實(shí)現(xiàn)起來(lái)很麻煩或者無(wú)法實(shí)現(xiàn)澄暮,但如果你用樂(lè)觀的思想,減少出錯(cuò)條件阱扬,然后出錯(cuò)了能解決泣懊,代價(jià)就會(huì)小很多。

說(shuō)了這么多麻惶,我想說(shuō)的就是馍刮,j2ee的基礎(chǔ)知識(shí)就是你做項(xiàng)目中代碼背后的東西。提高自己水平的方法很簡(jiǎn)單窃蹋,就是把大部分時(shí)間去了解實(shí)現(xiàn)原理渠退,了解思想,讓自己的知識(shí)串起來(lái)脐彩,形成體系碎乃。j2ee的知識(shí)特別多,學(xué)得人想哭惠奸,千萬(wàn)不要一開(kāi)始把時(shí)間花在各種框架梅誓、組件的使用上,在我看來(lái)那是本末倒置佛南。簡(jiǎn)單來(lái)說(shuō):先修內(nèi)功再練招式梗掰。

我覺(jué)得重要的、工作會(huì)用得到的知識(shí)就是一個(gè)請(qǐng)求從前臺(tái)到后臺(tái)處理的過(guò)程需要用到的東西嗅回,最少包括以下點(diǎn):js及穗,html,css绵载,ajax埂陆,ajax跨域苛白,跨站腳本,web緩存焚虱,web優(yōu)化购裙,nginx,apache作用鹃栽,鑒權(quán)方式躏率,cookie,session民鼓,servlet薇芝,filter,基本數(shù)據(jù)結(jié)構(gòu)丰嘉,線程池夯到,線程并發(fā),緩存供嚎,io等等黄娘,知識(shí)點(diǎn)非常多峭状。如你前臺(tái)用jq克滴,你應(yīng)該了解他的選擇器和ajax是如何實(shí)現(xiàn)的(其實(shí)去了解就會(huì)發(fā)現(xiàn)不復(fù)雜)?而不是只是會(huì)用优床。后臺(tái)你用springmvc劝赔,你要了解他是如何工作,每一個(gè)配置是做什么胆敞,為什么着帽?

j2ee知識(shí)點(diǎn)特別多,每一個(gè)都能寫很多移层,我也在不斷學(xué)習(xí)中仍翰。具體要寫我還真不知道如何下手,我就列舉一下我覺(jué)得基礎(chǔ)的東西(面試的時(shí)候問(wèn)的問(wèn)題)观话,有簡(jiǎn)單有難予借,你覺(jué)得偏可能是你沒(méi)有做過(guò)這塊的開(kāi)發(fā)或者做得比較淺:

map有哪些,特點(diǎn)和使用場(chǎng)景频蛔?(只知道hashmap灵迫,hashtable是不夠的。晦溪。瀑粥。)

哪些方面會(huì)影響hashmap的性能?

線程安全的map有哪些三圆,concurrenthashmap是如何實(shí)現(xiàn)線程安全的(jdk1.8大不同)狞换?

鎖有哪幾種避咆?

公平鎖,讀寫鎖等如何實(shí)現(xiàn)哀澈?

synchronize能加在哪些地方牌借?什么區(qū)別?

死鎖的形成條件割按?現(xiàn)在很少死鎖了膨报,很少問(wèn)

原子數(shù)據(jù)對(duì)象的原理?

reentrantlock相關(guān)知識(shí)适荣,condition如何使用现柠?(很重要的知識(shí)點(diǎn),強(qiáng)烈推薦閱讀ArrayBlockingQueue源碼弛矛,教科書般)

volatile的相關(guān)知識(shí)(內(nèi)存屏障够吩,重排)

ThreadLocal原理和使用?(超級(jí)有用的知識(shí)點(diǎn)丈氓,工作中使用很多周循,讓代碼漂亮很多,后面專門開(kāi)貼寫)

多個(gè)線程同步等待万俗?(CountDownLatch湾笛,CyclicBarrier,Semaphore信號(hào)量很多語(yǔ)言都有闰歪,實(shí)際上使用不是很多嚎研,線程池就可以實(shí)現(xiàn)大部分等待功能)

線程池?(種類库倘,重要的方法临扮,這個(gè)一般是使用層面,簡(jiǎn)單)

動(dòng)態(tài)代理教翩?反射杆勇??jī)?nèi)省饱亿?(考察知識(shí)面)

session相關(guān)知識(shí)蚜退?和cookie關(guān)系?分布式session實(shí)現(xiàn)原理路捧?

cookie相關(guān)知識(shí)关霸?有哪些屬性?(有些屬性很有用杰扫,只是我們很少留意而已6涌堋)

nginx,apache 實(shí)際項(xiàng)目能做哪些章姓?(鑒權(quán)佳遣,轉(zhuǎn)發(fā)识埋,緩存,反向代理等)和tomcat什么關(guān)系零渐?最少了解

ajax跨域原因窒舟?解決方式?(重點(diǎn)知識(shí)诵盼,做SE避免不了的問(wèn)題惠豺。這里很多知識(shí)點(diǎn)。)

jsonp原理风宁?后臺(tái)需要改動(dòng)嗎洁墙?(jsonp雖然現(xiàn)在落伍了,但還是會(huì)問(wèn)問(wèn))

web優(yōu)化知識(shí)點(diǎn)戒财?(常規(guī)知識(shí)點(diǎn))

前臺(tái)緩存相關(guān)热监?(200cache,304,ajax緩存饮寞,如何實(shí)現(xiàn)緩存)


一列舉就根本停不下來(lái)了孝扛。。幽崩。其他的spring框架的東西也很多苦始,還有jvm的東西,系統(tǒng)集成相關(guān)歉铝,數(shù)據(jù)庫(kù)相關(guān)盈简,io做得很少也不懂問(wèn)凑耻,后面再慢慢把我的學(xué)習(xí)過(guò)程和偶得寫下來(lái)太示。很多東西我也是了解個(gè)大概,就是看看你有沒(méi)有學(xué)習(xí)過(guò)香浩,不斷學(xué)習(xí)是程序員最重要的特征类缤。

我不算高手,只能算一個(gè)合格的老程序員邻吭。這里只是說(shuō)了一下自己之前學(xué)習(xí)的方向和列舉了幾個(gè)學(xué)習(xí)中的例子餐弱,大家見(jiàn)仁見(jiàn)智。帖子也是針對(duì)迷茫的初學(xué)者有感而發(fā)囱晴,希望能幫助到大家膏蚓。

最后我總結(jié)一下:初學(xué)者先廣在精,關(guān)注代碼背后的實(shí)現(xiàn)畸写,關(guān)注內(nèi)功修煉驮瞧,了解實(shí)現(xiàn)原理和思想,形成自己完整的技術(shù)體系枯芬,知識(shí)成片之后就容易觸類旁通论笔,進(jìn)步的速度就會(huì)越來(lái)越快采郎。最后以我在每一個(gè)項(xiàng)目組和開(kāi)發(fā)人員聊天都會(huì)說(shuō)的幾個(gè)例子結(jié)尾:“少林功夫里面有功和拳之分,馬步功狂魔,石鎖功是功蒜埋,蛇拳猴拳是拳,你不可能練會(huì)了蛇拳猴拳就能打人最楷,你必須先重點(diǎn)練功整份。喬峰在聚賢莊用太祖長(zhǎng)拳把大家打得落花流水,我們用太祖長(zhǎng)拳就只是個(gè)廣播體操籽孙。同樣皂林,我們要分清編程里面那些是功那些是拳,代碼背后的實(shí)現(xiàn)和思想是功蚯撩,各個(gè)框架础倍、api使用是拳。初學(xué)者應(yīng)該大部分時(shí)間花在練功上胎挎,功到了拳自然就有了沟启,切勿本末倒置∮坦剑”謝謝大家閱讀德迹!

小編推薦一個(gè)學(xué)java的學(xué)習(xí)裙【五五七,八六五揭芍,零七八 】胳搞,【驗(yàn)證:煙火】無(wú)論你是大牛還是小白,是想轉(zhuǎn)行還是想入行都可以來(lái)了解一起進(jìn)步一起學(xué)習(xí)称杨!裙內(nèi)有開(kāi)發(fā)工具肌毅,很多干貨和技術(shù)資料分享!每天晚上8點(diǎn)還會(huì)直播講課,大家可以一起互動(dòng)學(xué)習(xí)姑原,一起進(jìn)步

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末悬而,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子锭汛,更是在濱河造成了極大的恐慌笨奠,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,029評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件唤殴,死亡現(xiàn)場(chǎng)離奇詭異般婆,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)朵逝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,395評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門蔚袍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人廉侧,你說(shuō)我怎么就攤上這事页响÷ㄗ悖” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 157,570評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵闰蚕,是天一觀的道長(zhǎng)栈拖。 經(jīng)常有香客問(wèn)我,道長(zhǎng)没陡,這世上最難降的妖魔是什么涩哟? 我笑而不...
    開(kāi)封第一講書人閱讀 56,535評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮盼玄,結(jié)果婚禮上贴彼,老公的妹妹穿的比我還像新娘。我一直安慰自己埃儿,他們只是感情好器仗,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,650評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著童番,像睡著了一般精钮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上剃斧,一...
    開(kāi)封第一講書人閱讀 49,850評(píng)論 1 290
  • 那天轨香,我揣著相機(jī)與錄音,去河邊找鬼幼东。 笑死臂容,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的根蟹。 我是一名探鬼主播脓杉,決...
    沈念sama閱讀 39,006評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼娜亿!你這毒婦竟也來(lái)了丽已?” 一聲冷哼從身側(cè)響起蚌堵,我...
    開(kāi)封第一講書人閱讀 37,747評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤买决,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后吼畏,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體督赤,經(jīng)...
    沈念sama閱讀 44,207評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,536評(píng)論 2 327
  • 正文 我和宋清朗相戀三年泻蚊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了躲舌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,683評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡性雄,死狀恐怖没卸,靈堂內(nèi)的尸體忽然破棺而出羹奉,到底是詐尸還是另有隱情,我是刑警寧澤约计,帶...
    沈念sama閱讀 34,342評(píng)論 4 330
  • 正文 年R本政府宣布诀拭,位于F島的核電站,受9級(jí)特大地震影響煤蚌,放射性物質(zhì)發(fā)生泄漏耕挨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,964評(píng)論 3 315
  • 文/蒙蒙 一尉桩、第九天 我趴在偏房一處隱蔽的房頂上張望筒占。 院中可真熱鬧,春花似錦蜘犁、人聲如沸翰苫。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,772評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)革骨。三九已至,卻和暖如春析恋,著一層夾襖步出監(jiān)牢的瞬間良哲,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,004評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工助隧, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留筑凫,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,401評(píng)論 2 360
  • 正文 我出身青樓并村,卻偏偏與公主長(zhǎng)得像巍实,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子哩牍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,566評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容