什麼才是Java的基礎知識?,linux學習路線

程序員莎莎 2021-09-20 01:56:29 阅读数:990

才是 java linux
  1. 數據結構是鏈錶的數組(注:後面的版本為了提昇性能,已經是改成鏈錶或者樹(節點較多)了)

  2. 思想上是空間換時間的算法

  3. 構造函數上有容量和負載因子2個參數以及作用

  4. 决定性能的是key的hashcode是否够快、結果够分散(不分散就會變成鏈錶的性能了),和擴容的開銷(什麼時候擴容,和負載因子有關)

然後寫代碼的時候,如果知道了最終的容量(尤其是數據量大的時候),我都會指定初始化容量,類似如下


List<SomeBean>?list?= doSomeThing();?
Map<Integer, String>?map?=?new?HashMap<>((int)(list.size()/0.75));//0.75為默認負載因子

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

如果工作中某個map使用特別多,性能還需要繼續優化,我就會考慮從以下方面優化

  1. 如果key是自己定義的對象,那麼hashcode方法是否够快(最少應該緩存保證只計算一次,而且放入之後不能改變,决定hashcode的字段不能改變)? hash的結果是否够分散?

  2. 可以考慮調小負載因子,花更多的空間來換時間

學習源代碼的時候,特別有意思,你會强烈感覺到一個詞:舉一反三!觸類旁通!學習api使用的時候,如果你只知道使用不知道原理,很難舉一反三,感覺的是死記硬背。但學習了原理之後,知識成體系後,很容易舉一反三,學的越多就容易,還是以hashmap為例,我舉一個hashmap反三個點。

1. 你會知道但凡有數組的數據結構,構造函數都有一個容量的初始化參數(或者說構造函數有初始化容量的可能都是數組的數據結構)。構造函數如下


public?ArrayList(int?initialCapacity)?//LinkedList不是數組就沒有
public?HashMap(int?initialCapacity)?
public?StringBuffer(int?capacity)

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

你就會知道,數組擴容很耗性能(數據量大容易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;
? ?}

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.

後來從思想上理解,才知道樂觀鎖的概念,就是很樂觀,假設你不會出錯,但你要是出錯了我就重試有辦法給你修複,對應的就是悲觀鎖,就是很悲觀,覺得不鎖就會出錯,如synchronize關鍵字和reentrantlock。這體現了2種不同截然不同的管理思想。這種思想經常體現在多個系統集成的設計,有些時候如果你用悲觀的思想設計,實現起來很麻煩或者無法實現,但如果你用樂觀的思想,减少出錯條件,然後出錯了能解决,代價就會小很多。

說了這麼多,我想說的就是,j2ee的基礎知識就是你做項目中代碼背後的東西。提高自己水平的方法很簡單,就是把大部分時間去了解實現原理,了解思想,讓自己的知識串起來,形成體系。j2ee的知識特別多,學得人想哭,千萬不要一開始把時間花在各種框架、組件的使用上,在我看來那是本末倒置。簡單來說:先修內功再練招式。

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

最後的內容

在開頭跟大家分享的時候我就說,面試我是沒有做好准備的,全靠平時的積累,確實有點臨時抱佛脚了,以至於我自己還是挺懊惱的。(准備好了或許可以拿個40k,沒做准備只有30k+,你們懂那種感覺嗎)

如何准備面試?

1、前期鋪墊(技術沉積)

程序員面試其實是對於技術的一次摸底考試,你的技術牛逼,那你就是大爺。大廠對於技術的要求主要體現在:基礎,原理,深入研究源碼,廣度,實戰五個方面,也只有將原理理論結合實戰才能把技術點吃透。

下面是我會看的一些資料筆記,希望能幫助大家由淺入深,由點到面的學習Java,應對大廠面試官的靈魂追問

 CodeChina開源項目:【一線大廠Java面試題解析+核心總結學習筆記+最新講解視頻】

這部分內容過多,小編只貼出部分內容展示給大家了,見諒見諒!

  • Java程序員必看《Java開發核心筆記(華山版)》

什麼才是Java的基礎知識?,linux學習路線_Java

  • Redis學習筆記

什麼才是Java的基礎知識?,linux學習路線_程序員_02

  • Java並發編程學習筆記

四部分,詳細拆分並發編程——並發編程+模式篇+應用篇+原理篇

什麼才是Java的基礎知識?,linux學習路線_後端_03

  • Java程序員必看書籍《深入理解 ava虛擬機第3版》(pdf版)

什麼才是Java的基礎知識?,linux學習路線_後端_04

  • 大廠面試必問——數據結構與算法匯集筆記

什麼才是Java的基礎知識?,linux學習路線_程序員_05

其他像Spring,SpringBoot,SpringCloud,SpringCloudAlibaba,Dubbo,Zookeeper,Kafka,RocketMQ,RabbitMQ,Netty,MySQL,Docker,K8s等等我都整理好,這裏就不一一展示了。

什麼才是Java的基礎知識?,linux學習路線_後端_06

2、狂刷面試題

技術主要是體現在平時的積累實用,面試前准備兩個月的時間再好好複習一遍,緊接著就可以刷面試題了,下面這些面試題都是小編精心整理的,貼給大家看看。

①大廠高頻45道筆試題(智商題)

什麼才是Java的基礎知識?,linux學習路線_後端_07

②BAT大廠面試總結(部分內容截圖)

什麼才是Java的基礎知識?,linux學習路線_後端_08

什麼才是Java的基礎知識?,linux學習路線_Java_09

③面試總結

什麼才是Java的基礎知識?,linux學習路線_程序員_10

什麼才是Java的基礎知識?,linux學習路線_後端_11

3、結合實際,修改簡曆

程序員的簡曆一定要多下一些功夫,尤其是對一些字眼要再三斟酌,如“精通、熟悉、了解”這三者的區別一定要區分清楚,否則就是在給自己挖坑了。當然不會包裝,我可以將我的簡曆給你參考參考,如果還不够,那下面這些簡曆模板任你挑選:

什麼才是Java的基礎知識?,linux學習路線_後端_12

以上分享,希望大家可以在金三銀四跳槽季找到一份好工作,但千萬也記住,技術一定是平時工作種累計或者自學(或報班跟著老師學)通過實戰累計的,千萬不要臨時抱佛脚。

另外,面試中遇到不會的問題不妨嘗試講講自己的思路,因為有些問題不是考察我們的編程能力,而是邏輯思維錶達能力;最後平時要進行自我分析與評價,做好職業規劃,不斷摸索,提高自己的編程能力和抽象思維能力。

版权声明:本文为[程序員莎莎]所创,转载请带上原文链接,感谢。 https://gsmany.com/2021/09/20210920015625319J.html