1. 中國的程序員數量是否已經飽和
中國的程序員數量沒有飽和,程序員屬於技術人才,並且程序員需要掌握多種語言去編寫,這種人才是很少的,高端智能行業的崛起,對程序員的需求也會增加,所以程序員的數量是沒有飽和的。
2. 程序員的困境
近日筆者采訪了幾十位求職內核程序員這個崗位的候選人。這些候選人均來自大的優秀公司——公司多以晶元或嵌入式OS
/系統而聞名。他們中的許多人都聲稱自己擁有至少10年的內核在職經驗。他們的簡歷非常耀眼——各種相關的項目,流行語和獎項
但大多數人卻無法回答一個很基本的問題:當我們調用標准malloc函數時,內核會發生什麼?
不要驚訝。當我要求其中一位候選人基於glib哈希函數編寫一個簡單的LRU緩存框架時,他一開始表示他從未使用過glib——這也在我意料之中——我給他展示了glib的哈希API頁面,並詳細解釋了API,然後在將近一個小時之後,他只寫出了幾行亂七八糟的程式碼。
我不知道其他國家的情況是否類似,但在中國,或者更具體地說,是在北京,這是現實。那些曾為大型著名外企工作多年的「高級」程序員往往在簡單、基本的問題上束手無策。
為什麼會出現這種情況?
我越是思考這個問題,就越是覺得問題的原因不僅僅在於他們本身,也在於他們工作的公司。這些公司通常會提供穩定的代碼堆棧,而且多年以來一直沒有產生顯著的變化。圍繞代碼的技術封閉了程序員的技能,使得他們只需要遵循現有路徑,而不必積極創新。如果你在這種代碼上工作了很長一段時間,同時沒有很好地與時俱進,那麼總有一天你會發現自己進退兩難——在團隊或公司內部,他們叫你「專家」,但卻無法在市場上找到同樣棒的工作。
這就是所謂的「專家陷阱」。日復一日,程序員夢想著成為團隊/公司內部的專家——然而,當這一天真正來臨的時候,卻是我們困住自己的時候。我們對現有代碼挖掘得越深,我們陷入的泥潭就越深。我們漸漸失去了從頭開始編寫完整項目的能力,因為現有的代碼是如此之穩定(如此之大,如此之有利可圖)。更糟糕的是,如果我們的主要工作就是維護現有代碼,那麼一段時間之後,無論我們閱讀和學習了多少代碼,都會發現,自己不會寫代碼了——即使問題簡單到如研究生院的作業。這就是程序員的困境:我們靠編碼為生,大陸但培養了我們的大公司往往會破壞我們謀生的能力。
如何擺脫這種困境?
對於個人——
首先,要做自己的個人項目。你需要不斷地「滾頌頃提升自己」。如果工作本身不能幫助你提升自我,那麼找一些你想在個人時間解決的問題。這樣做有助於你學到新的東西。如果你發布個人項目,比如說在github上,那麼你就有機會認識那些能在你換工作時拉你一把的人。
不要停留在同一個團隊超過兩年。強迫自己換崗位,即使是在同一組織,同一公司中,這樣你就可以面對新的挑戰和新的技術。每隔18個月去參加工作面試。這不是為了跳槽,而是為了讓自己知道現在市場需求什麼,以及你該如何適應。
對於團隊/公司——
給予員工壓力和挑戰。輪換崗位,讓所謂的「專家」有機會擴充他們的技能。開啟新項目,用實戰來磨練大家。
定期舉辦黑客馬拉松。這將有櫻搭助於建立一種擁抱創新和創造的文化。大家會因彼此而受到激勵——
「哎呀,那個傢伙能用24小時寫出這樣一個美麗的框架,我得加油了」。
3. 全世界一共有多少程序員
現在談到中國軟體業時,總是與印度軟體業相互比較,是基於這兩個國家有很多相似性。在80年代中期,中印兩國軟體業並無太大差別。中國軟體業並未將印度軟體業放在眼裡,此拜中國高速發展之賜,我們戲言曰印度阿三(是就經濟而言,亞洲國家,日本第一,中國居二)。但到了現在印度軟體業成了全球老二,叫一向自大的美國人也不敢小瞧,蓋茨稱其為繼美國之後的下一個超級軟體大國。中國軟體業卻看起來是王小二過年了,增長率比起國內其他行業尚可自慰,比起其他軟體大國則相形見絀。國內67%的市場份額被外國巨頭拿走(的確就是拿,沒有被狙擊)而且是高端市場。企業在技術競爭力上與外國巨頭的差距是越來越大了。大部分軟體公司都是在進行一般應用開發,為事企業單位開發管理系統。開發工具是別人的,後端資料庫是別人的,絕大多數服務支撐軟體也是別人的(修路的利潤哪能跟提供大型工具的利潤比)。要不是中國盜版猖獗,很多小公司光買開發工具就夠嗆了。不僅僅是技術差距加大,連從業人員的士氣都大受影響。以前,開發出了產品雖然盜版猖獗,但大多贊譽有加,現在,有時連盜都不盜國產軟體。過去的程序員們也沒多富有,但常被不少愛好者追捧,聲望甚著,現在,大概只有出校門沒幾年的「青光「才為自己的程序員身份得意了。幹了幾年後,再不願說自己是光干編碼的程序員。中國的程序員們盡管並不認為自己的水平比印度同行差,但大都承認了軟體業與印度的差距。也沒什麼人認為中國軟體業形勢大好,高歌猛進。至於中國軟體業為什麼會落敗於印度,已有不少總結,在此不表。來看一看業界人士們開出的在網上引發大爭議的救業良方。
印度軟體業這幾年的迅猛發展吸引了全球目光。中國軟體業業界人士紛紛以玄奘西行的架勢前往取經,這是無可非之。業界人士們取經的結論比較具共性的是:中國軟體業需要進行職能化分、大量培養軟體藍領、開拓海外市場等。進行職能化分、實施軟體工程、加強管理這些沒多大的爭議。爭議集中在軟體藍領這個新玩意上。
在目前關於美國、日本、西歐等其他軟體發達地區的報道中鮮見著軟體藍領這一劃分和論述(大師和普通程序員當然有別,哪裡都一樣)。這是個我們從印度帶回來的特產。原因是印度人用高中生在編程,再加上那幫傢伙軟體工程、項目管理搞的很好,居然能按時上下班,幾乎跟哪裡都不一樣。於是就得出一個軟體藍領的概念(是印度人首創,還是我們的新發明,待考)。可是我要提醒的是印度信息技術部部長2000年5月在華盛頓放言印度每年能向世界輸送20萬信息專業技術人員,美國現有IT人才簽證配額的一半被印度人占據,看來輸送的可不是一抓一把的高中生。老美還沒那麼笨。以印度現在的培訓體系現狀和實力,那幫高中生經過培訓是必然的了。他們可是在中學就接受扎實的計算機教育。我們的所謂的科班出身,不也是從高中拉了一撥人進行再教育嗎?我們的大學技術教育是不是比他們的培訓體系強,這我沒法量化比較。我倒知道譚浩強教授在一次計算機教育會議上說他對中國現在的計算機高手大部份是非計算機科班出身感到迷惑不解。非計算機科班出身的高手得大部分自學吧,還有不少超過天天接受計算機教育的。我也還知道印度IIT被稱為亞洲的MIT。我也還知道印度的培訓系統來中國幫我們培訓技術工程師。盡管業界人士對軟體藍領語帶不屑,但要真是我們的教育培訓比他們好,那倒是我們應以幫助第三世界兄弟的名義去幫他們。怎麼掉過來了。那種因為印度很多編程人員沒有大學學歷,就把人當作是一抓一把的高中生的人是否也太過皮相之見了。盡管他們不會告你行業污衊,但我建議有關人員在爆炒軟體藍領時先仔細斟酌一下,去考察一下別人受到的計算機教育再說不晚,程序員里沒幾個人跟你們搶「軟體藍領」這個詞的話語權。也許吧,他們的培訓系統比我們差,我們的認證培訓系統可以讓一個文秘專業的MM在一個月內拿MCSE,真是天才輩出!
軟體的開發畢竟還是創造性的活動,你得把要處理的事務進行邏輯轉換,再變為程序邏輯,編出代碼。即便引入軟體工程,把事務進行細分,分成更小的功能模塊。你也得進行邏輯轉換,離不了思考。要是不想讓整個程序慢如老牛,還得仔細考慮對全局的影響。軟體工程搞得再好也不能讓前一個程序員寫if,後一個程序員寫else,再後一個打個大括弧。要真是不需動腦就能寫,用能代碼自動生成的開發工具就行了,哪用得著一個人。就是不給薪水也得用一台計算機呀,還浪費能源。你要是在業務流程、核心邏輯不變的情況下改來改去,那是叫維護還是叫開發?開發就是這個樣子?如果開發真是做個界面,拉兩個控制項,改改屬性就行,那你還是找一個會Photoshop的人吧,效果肯定好。
繼續說這個軟體藍領,我們既然學習印度的管理經驗,又帶回軟體藍領這個詞,還要大力走向世界,看來我們的確是「師印長技以制印」了。前文曾有對世界軟體業產業類型的描述。美國的模式,我們現在又缺資金、又缺技術積累,也沒合理的產業群落,一時還學不了,以後吧。愛爾蘭也沒法學,搞20多個版本賣給誰?菲律賓軟體產業的增長速度都叫我們吃驚。我們就來看一看印度軟體產業,印度產業大部份是外包。我們倒還多了一個國內市場作後院,很占優勢吧。仔細來看一看!大家認同的說法是,印度人能拿到外包業務的原因是:官方語言為英語,有語種優勢,勞動力成本低廉。當然,還有常提的一句話:中國人和印度人都適合編程,無它,從小重視數學爾。怎樣超趕呢?語種優勢?印度比我們強。品牌優勢?也沒法比。我們跟他們比聰明?還是等這方面專家來解釋吧,先別那麼想。那就拼價格吧!我們就打一場價格戰吧!家電業都能打,我們怎麼就不行。拼價格那得先降成本,軟體的成本主要就是程序員的工資。讓一個人均GDP847美元、現有程序員16萬人、現在每年培養科班技術人員5萬多人的國家跟一個人均GDP300多美元的國家、現有程序員40萬、現在每年培養近20萬技術人員的國家打人才價格戰!當然,我們的認證培訓機構能用一個月時間將一文秘專業的MM培養成MCSE技術專家,看來勝利在望!再來看一看我們的後院。我們現在有16萬名程序員,分布在近6000家軟體公司。這么多的軟體公司都能活,那恐怕得感謝這幾年的信息化熱潮。盡管大部分的軟體公司都是做行業應用、管理軟體的。但一些大型的行業應用軟體並不是由本土企業來完成的。Satyam和Multitech拿下了華為、中興和聯通的幾個重要訂單,而中國航空系統的管理軟體也落入印度軟體公司的囊中。一通訊公司的網路核心軟體也是其印度研究所完成,這也可算中國軟體公司。但卻不代表中國軟體業的真實水平。有人已在冷思信息化的熱潮:雖然各個企業之間千差萬別,但同一行業的業務流程卻有著驚人的相似,行業應用的標准化這恐怕是這類軟體的方向。被譏為「做系統缺少資產; 做應用缺少溝通;做信息缺少分類;做工程缺少規范;做管理缺少制度; 做團隊缺少組織「的大多數軟體公司如不圖變,恐怕無力擔當這一責任。在印度幾頭軟體大象已經開始涉足中國市場的時候,我們先不要全都忙著打出去吧!我們有什麼優勢:管理?資金(軟體企業的積累)?技術積累?人力成本?
4. 中國有多少個程序員
中國有185萬程序員。
程序員是從事程序開發、程序維護的基層工作人員。一般將程序員分為程序設計人員和程序編碼人員,但兩者的界限並不非常清楚。
2007年火熱的SOA和動態語言各佔13%和12%。其實這幾大塊技術分布他們之間都是有一定的聯系的,互聯網的發展近兩年呈爆炸式的增長態勢,中國的網民總數已經超過了1.4億這樣一個巨大的數字。
薪資待遇:
從經濟學的層面上來看,軟體人才也是勞動力商品中的一種,是由價值規律決定的,有需求才會有市場,才會有人願意為他們支付工資。當前,包括中國在內,全球都在爭奪IT人才,當IT人才的社會總需求大於總供給時,不可避免就會出現人才升值的現象。
5. 全國有多少程序員
中正輿情機構研究出品
點贊分享是一種
積極的
生活態度
6. 全球范圍之內程序員的數量大概有多少
埃文斯數據公司(Evans Data Corporation) 2019最新的統計數據(原文)顯示,2018年全球共有2300萬軟體開發人員,預計到2019年底這個數字將達到2640萬,到2023年達到2770萬。
而來自IDC的統計數據顯示,2018年全球軟體開發人員數量增長到2230萬,而2014年只有1850萬程序員。
7. 做程序員要學什麼專業
當程序員是什麼專業?
計算機科學與技術或軟體工程, 不喜歡硬體選軟體工程。
打算當程序員,上大學學什麼專業 40分
樓上就是在扯蛋,自己不行,還勸別人
我現在在深圳當程序員,工作4年了,目前程序員沒以前那麼吃香,學得人多了嘛
程序員這個職業在不同學校的專業名稱也有所不同,但是差不多了多少,計算機科學及應用,或者計算機軟體,到學校問一下就知道了,主流高級匯編語言就是一樓老兄說的C++ .NET JAVA這三門了,C++在游戲方面應用的多一些,網站項目基本都是後面2種語言用得多,JAVA的工資要高點,代碼量比較大。
做程序員上大學要念什麼專業
軟體技術專業
數學學的好壞不能直接說明你能不能學好程序員,寫程序還是一個邏輯(if語句,循環語句,對變數的操作,等等...)
最好是本科,院校在計算機專業方面有很好的基礎設施和條件
不過專科肯定也是有好的 師資方面都差不多的
以我的感覺是如果哪個院校的軟體技術專業的學費高,哪個學校就好 ,呵呵
也在網上找找吧
選學校一定要選好,尤其是大學
我再發表一下自己的觀點:大學可以上,有條件當然可以上的;不上大學未必就沒出路,未必就沒好的工作好的事業;現在培訓班多了,去培訓班學學也不一定比上過牛比大學的差;技術這方面最後還是要靠自己的能力,自己的自學領悟能力,高手就是在自學中發展起來的,呵呵.
說多了,有句話很有意思,是這么說的:是我上了大學,還是大學上了我.
回答完畢,晚安
做程序員要什麼學歷什麼專業才可以?
很多程序員,很多種情況,有大專、大本,有一個是念得法律後來轉行做程序員,有一個是技術院校出身,但是有一群朋友,很喜歡電子類的東西,創辦過工作室做網站,也在大公司做信息系統開發,後來做項目經理。如果本身專業和電子相關,就直接去找程序員的工作,如果無關,就需要自己找地方學,或者培訓機構,或者學校。
想當一名程序員那在大學時候究竟應該學習什麼?
最終我決定把想到的東西寫下來,希望能對在校的人有點幫助。首先我們得知道這問題的答案是個變數,他依賴於你的目標和天資能力,絕不唯一。當然大學的課程設置往往是唯一的,所以會有點矛盾。這里最關鍵的東西是目標,大學學習只是達成最終目標高度的一個環節,他應該為最終目標服務。當然大學生很難清楚的知道自己的目標究竟在那裡,但要總歸要大致知道自己的方向。這個之所以關鍵是因為,這直接決定你應不應該學習某個東西。我是在做了很多年軟體後,才發現軟體和軟體的差別其實比馬和牛的差別還要大。用流行的分類方法比如:前端開發、後端開發、開發,Java開發等會讓人迷失焦點,所以我一直覺得Barry W Boehm在《軟體成本估算:COOII模型方法》里的分類方法對學習更有幫助。在這個分類方法里軟體被分了三層:最底層是基礎結構型(平台)軟體的開發;中間層次是開發工具、系統集成、中間件;最上層是終端用戶編程,也可以理解為一般應用的開發。同時作者還補充了份數據說:在2005年95%的美國程序員是在做終端用戶編程。這似乎把話題扯開了,但其實不是,關鍵要大致定位下自己的方向。因為對於目標是基礎結構的程序員和目標是一般應用的程序員,他們要學習的東西差別很大。Donald Knuth的《計算機程序設計藝術》不是沒用,但如果你花了2年把他啃了一遍回頭專門做應用開發,那它真的用處不大。至少和一個精通具體語言、框架、設計模式、面向對象、UML的人比只是鑽研了《計算機程序設計藝術》的人反倒是在劣勢,雖然可能後者更花時間。反過來講則是在演算法密集型的工作里,那優劣情形就會掉過來。無疑的什麼都精通最好,但人的時間是有限的,而軟體相關的知識是無限的,所以把學習聚焦在自己的目標上非常關鍵。而目標是什麼則要根據自己的實際情形來定。假設說你真的感覺自己的能力挺好,就想做基礎結構型的東西,去做MapRece,去做操作系統等等,那首先要認識到的是干這個的人很少,競爭很激烈。如果說在2005年美國只有5%的程序員是干這個的,那我估計今天在中國也頂多是這么個比例。個人感覺,大學的計算機課程還真都是往這個方向培養人的,一旦真的走這個方向,那麼大學的計算機課程還真用的上。需要好好學習,天天向上。當然只上課也不行,把課上學的東西實踐起來也很關鍵(比如開源項目)。這里麻煩的事情是,干這個的可能只有5%,很多人即使很努力也不一定擠的上去。那麼假設說一個人很現實,說:國內排名靠前的幾所學校湊湊也就5%了,競爭太激烈,我不選這個目標方向,我還是95%里做做吧,那這個時候我應該學什麼?我個人認為主要要學好一些比較硬的,需要大塊時間學習的東西,而不要在花里胡哨的東西上多費時間。硬的東西是指:數據結構和基本演算法。不管是不是做基礎結構性軟體,基本的數據結構和演算法知識還是要有的。很可能不太會有自己從頭寫數據結構和演算法的機會,但如果復雜度不知道怎麼算,鏈表、紅黑樹、哈希表的差別都不知道,那就怎麼都玄。精通一門編程語言具體是那個可以根據實際情形來選。但這里強調的是語言,不是IDE和框架。可以通俗理解為每個關鍵字背後的含義要整清楚。這里的陷阱是學一堆語言,但那個都不精。精讀一個有點規模的開源項目(至少要超過2萬行)要找那種規模不太大,又比較有名的項目,一定要精讀,爭取每行都懂。累積一定的代碼量不算IDE幫助生成的,爭取也在2萬行之上。面向對象和設計模式這點最好配合著下一點一起做。從頭考察一下某個框架考察某個框架的內存機制、線程機制等。整個學習過程中最常見的陷阱是學會操作一堆IDE和框架的使用,但實際上這事兒價值不大......
做程序員難不?要學什麼專業
計算機類的
程序員需要學些什麼?
要看你喜好了,做什麼都是有興趣才能學好
想學程序 先確定要學什麼 c c++ c# java pb vb等等
現在流行就是c#和java c++也可以 不過比較有深度
先學語法 再學程序實例 最後做項目程序員 工資中上等吧 但是很辛苦
如果你認真學習 不到半年你就會學的很好
作為一個程序員需要學多少技能
介紹下我的想法:
大學里學的是計算機專業,所以順道學了不少計算機系的基礎課程,總體來講學得很不好,直到大四畢業,我才勉強下定決心要以寫代碼為生(現在想想,可能是當時實在想不出其他出路)。大學4年,很遺憾的事情就是我沒有弄清楚該去真正學些什麼東西。
畢業後第一份工作,在一家小公司寫servlet/jsp,說實話,我寫的很爛,當時帶我的人對我的工作很不滿意,直到有一次,項目經理跟我談說,你的工作表現你也看到了,差點就被開掉了,不過我覺得還是要在給你機會。。。當時,我真的是自信心崩潰到極致,覺得自己這段時間其實很努力,但為什麼還不入門路。。這次經歷給了我非常大的影響,之後的不久,我終於明白了怎麼去寫那些servlet/jsp,於是我努力的寫那些代碼,不久,我就成了公司新員工裡面,做東西最快的人。當時還發了個公司的什麼最快進步獎給我。我想第一份工作給我最大的感受是,想要做為一個程序員,你得先明白,程序是個什麼東西。
一年多以後,servlet/Jsp實在不想寫了,於是換到另外一家公司,做聊天軟體的J2ME客戶端。其實我當時不懂J2ME,在剛入職的一個月里,啃完CLDC和一些會用到的JSR的英文文檔,然後每天去看項目的代碼,有任何問題就去問周邊的同事。不久,我也慢慢能寫一些J2ME的代碼了。接著,我加入了新版客戶端的項目組,開始做一些UI組建。最開始,我寫一個Text組件,就是把文字顯示到屏幕上,還要根據屏幕可顯示區域的寬度、高度對文字做調整。沒幾天,我就信心滿滿的寫完了這些代碼,原來寫客戶端代碼也不難啊。不過不久,當同事要用我的組件時,問題百出,以至於同事跟經理抱怨說,這么基礎的組件應該給有經驗的人去寫啊。。 這次,雖然我的工作做的很爛,可自信心倒沒受多少打擊,因為已經工作一年多了嘛,臉皮厚了不少。但是我心裡知道,我的工作肯定哪裡出了問題,否則我的組件應該能經受住使用者的考驗的啊。這份工作中,我學到了不少東西,首先呢,臉皮要厚一點,不會就追著去問,其次,沒有想清楚的話,寫出來的東西經不住考驗的。再次,英文資料好像更准確啊。當然還有一些具體的編程技術。
大概又過了一年多,大家都說J2ME快完蛋了,android已經開始大興其道,公司裡面也有人在做android客戶端,可我還在寫沒有前途的J2ME.恰好,qq群里有人發消息說招人,我腦子一熱,扔了份簡歷過去。於是,一個多月後,我就到了新的公司上班,這家公司是一個做手機的廠商,而我也可以參與android的開發。在這個公司的前3個月,基本啥活沒干,除了學習android之外,就是各種培訓和等待。大概待到5個月的時候,我實在坐不住了,我去跟經理說,有沒有活可以給 *** 。經理說我考慮下,不久便安排給我一個項目,讓我去把它維護好了,然後集成到產品裡面。可當我拿到代碼時,傻眼了,2w多行代碼,而且很多地方寫的很復雜,看了好幾天也沒看懂。好吧,不管了,這件事既然是我負責,那怎麼都應該挺住。在接下來的快2個月里,我每天都撲在這兩萬多行代碼里,解決裡面的bug,理解裡面的設計思路、代碼風格、編程技巧,使用公司的工具鏈,從發布、審核到持續集成等等。我了解到了很多我平時不知道的東西,我解決了發現了的所有的bug。可是最終,我並沒有把這個項目維護到可以發布的程度,最後一關的AT&T的穩定性測試宣判了我的這個項目的死刑,隨後這兩萬多行代碼慢慢的從我的提交列表裡面消失掉了。我第一次明白了,竟然還有如此嚴格的質量測試,也明白了什麼叫風險與代價,雖然這些代碼,我已經用monkey模擬跑過了5個鍾頭,但是依然被ATT測試蹂躪2個鍾頭之後掛掉。......
以後想當個程序員 大學要學什麼專業
好多大學畢業生轉行學習it程序開發的。如果你現在就有工作目標,以後想從事軟體開發,當個程序員的話,那麼建議你大學選擇專業的時候就選擇計算機相關的專業。
當java程序員應該學什麼,並且學的順序是什麼
ja范a有三個方向:1 桌面應用程序開發 不過個人認為這個很少
2 j2me也就是手機里一些小程序的開發
3 j2ee 企業級開發 也是最有前途的
下面是本人j2ee學習的路徑 是當時老師跟我講的
第一步:入門 隨便找一本簡單的詳細的書看完
第二部:看thinking in Java這本書講解深入 有難度 看完的話受益匪淺 如果 覺得thinking in java 太難的話 就看java核心技術 簡單一些 一共兩卷 買盜版的吧 很便宜 哈哈
下面就是另外的一層境界了
第三步:html css javascript 這些不是java的內容 但一定要了解
第四步:jsp、servlet JavaBean這個沒什麼可說的 張孝祥的書不錯 很全面 這時可以做個小網站什麼的 用mvc設計模式 也就是JSP 負責顯示界面 相當於MVC中的 V
Servlet 負責歷程式控制制 相當於MVC中的 C
JavaBean 負責功能 相當於MVC中的 M
第五步:學習struts spring hibernate框架 這時也可以做一些小項目了 實踐一 下 當然你會發現實際練習中會有很多問題出現 這是提搞的好機會
第六部:ejb 這是一個重量級的東西 慢慢學吧
8. 哈稀表是什麼東西,HashCode是什麼
哈希表是一些鍵值對的組合,如
Hashtable hs = new Hashtable();
hs.Add('1',200);
hs.Add('2',300);
hs.Add('3'悄判汪,400);
他的鍵是不能重沖備復的。
我們通過它的鍵就可以得到他的值,如啟仔像,我們要得到300.
只需hs['2']就可以得到300
9. 2022年中國一共有多少程序員
超過1000萬。根據數據統計可知,2022年中國一共有超過1000萬的程序員。程序員是從早蠢事程序開發、維護的專枯啟業人員。大多將程序員分為程序設沒睜如計人員和程序編碼人員,但兩者的界限並不非常清楚,特別是在中國。
10. 面試中如何回答HashMap的工作原理
用過哪些Map類,都有什麼區別,HashMap是線程安全的嗎,並發下使用的Map是什麼羨閉,他們
內部原理分別是什麼,比如存儲方式,hashcode,擴容,默認容量等。
JAVA8的ConcurrentHashMap為什麼放棄了分段鎖,有什麼問題嗎,如果你來設計,你如何
設計。
有沒有有順序的Map實現類,如果有,他們是怎麼保證有序的。
hashmap的實現原理,https://blog.csdn.net/mbshqqb/article/details/79799009
下面是自己的總結:
存儲結構:
裡面存儲的是一個entry數組,每個數組元素中的結構是一個entry鏈表
Entry是map中的一個靜態內部類,其中的變數有:key,value,hashcocd,下一個Entry
什麼是hash?
又稱散列,將任意長度的輸入通過散列演算法轉換成固定長度的輸出,該輸出就是散列值。這是一種壓縮映射,散列值的空間通常遠小於輸出的空間。不同的輸入有可能會散列出相同的輸出,因此不能從散列值來確定唯一的輸入值。這也是為什麼比較兩個對象不能僅僅使用hashcode方法比較的原因。
hash碰撞:
對不同的值進行hash運算生成了相同的散列值。這個是不可避免的,但是我們需要盡量的減少其帶來的損失。
(1)設計好的hash演算法讓其盡可能的分布均勻
hashmap中的hash演算法解析
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
讓key的hashcode本身與它右移16位異或,是為了讓它的高位與低位混合,增加低位的隨機性,同時也變相保持了高位的特徵
計算元素位置的演算法:
int index = hash & (arrays.length-1);
那麼這也就明白了為什麼HashMap的數組長度是2的整數冪。比如以初始長度為16為例,16-1 = 15,15的二進制數位00000000 00000000 00001111。可以看出一個基數二進制最後一位必然位1,當與一個hash值進行與運算時,最後一位可能是0也可能是1。但偶數與一個hash值進行與運算最後一位必然為0,造成有些位置永遠映射不上值。
對於null值的處理
hashmap是接受兄團裂null值的,null值被放在數組的第一個元素當中,取出來的時候怎麼處理呢?
hashmap的工作原理?
它的裡面有一個Entry數組,在put時我們先根據key值計算出hashcode,進而計算出該元素在數組中的位置,將健值對封裝在Map.Entry對象中,然後存儲在數組中
若產生hash沖突怎麼辦?
每個數組元素的位置都是一個鏈表結構,若計算出來的hashcode相同則將元素追加到該鏈表當中,這是hashmap的處理方式
在取元素的時候,先計算key值對應的hashcode ,找到元素所在的位置,然後調用key的equals方法去遍歷鏈表,最後找到元素
還有哪些解決hash沖突的方法?
開放定址法
這種方法也稱再散列法,其基本思想是:當關鍵字key的哈希地址p=H(key)出現沖突時,以p為基礎,產生另一個哈希地址p1,如果p1仍然沖突,再以p為基礎,產生另一個哈希地址p2,…,直到找出一個不沖突的哈希地址pi ,將相應元素存入其中。
再哈希法
這種方法是同時構造多個不同的哈希函數:
Hi=RH1(key) i=1,2,…,k
當哈希地址Hi=RH1(key)發生沖突時,再計算Hi=RH2(key)……,直到沖突不再產生。這種方法不易產生聚集,但增加了計算時間。
鏈地址法
這種方法的基本思想是將所有哈希地址為i的元素構成一個稱為同義詞鏈的單鏈表,並將單鏈表的頭指針存在哈希表的第i個單元中,因而查找、插入和刪除主要在同義詞鏈中進行。鏈地址法適用於經常進行插入和刪除的情況。
建立公共溢出區
這種或答方法的基本思想是:將哈希表分為基本表和溢出表兩部分,凡是和基本表發生沖突的元素,一律填入溢出表。
默認的負載因子0.75
當map的大小超過當前容量的百分之75時會進行自動擴容,會將原來的對象重新放到新的數組中
rehash 的過程是什麼樣子的?
說白了就是先resize,生成一個新的Entry數組,再transfer將原數組中的值重新計算index放入新的數組中,然後改變閾值為新的長度x負載因子
如果key為null,這始終會被散列到table[0]的桶中,即使是rehash的過程也是一樣。非null的key也有可能會被散列到table[0]的位置,例如上圖中key=「f」,而且相同的key在在不同的時間可能會被散列到不同的位置,這與rehash有關。
這個過程中容易發生什麼問題呢?
容易產生條件競爭,如果在擴容的過程中put數據,會造成意想不到的結果。或者如果兩個線程都觸發了擴容,也會存在問題
這塊有沒有遇到過什麼比較好的例子?
jdk1.8以後改成了紅黑樹,為什麼?說一下紅黑樹的原理?
hashmap與hashtable的區別?
HashTable和HashMap的實現原理幾乎一樣,差別無非是
HashTable不允許key和value為null
HashTable是線程安全的
但是HashTable線程安全的策略實現代價卻太大了,簡單粗暴,get/put所有相關操作都是synchronized的,這相當於給整個哈希表加了一把大鎖。
多線程訪問時候,只要有一個線程訪問或操作該對象,那其他線程只能阻塞,相當於將所有的操作串列化,在競爭激烈的並發場景中性能就會非常差。
篇幅有限,未完待續