A. 做圖像類演算法面試的時候會不會面試數學
我在《再談逗我是怎麼招程序員地》中比較保守地說過,逗問難的演算法題並沒有錯,錯的很多面試官只是在膚淺甚至錯誤地理解著面試演算法題的目的。地,今天,我想加強一下這個觀點——我反對純演算法題面試!(注意,我說的是純演算法題)圖片源Wikipedia(點擊圖片查看詞條)我再次引用我以前的一個觀點——能解演算法題並不意味著這個人就有能力就能在工作中解決問題,你可以想想,小學奧數題可能比這些題更難,但並不意味著那些奧數能手就能解決實際問題。好了,讓我們來看一個示例(這個示例是昨天在微博上的一個討論),這個題是——逗找出無序數組中第2大的數地,幾乎所有的人都用了O(n)的演算法,我相信對於我們這些應試教育出來的人來說,不用排序用O(n)演算法是很正常的事,連我都不由自主地認為O(n)演算法是這個題的標准答案。我們太習慣於標准答案了,這是我國教育最悲哀的地方。(廣義的洗腦就是讓你的意識依賴於某個標准答案,然後通過給你標准答案讓你不會思考而控制你)功能性需求分析試想,如果我們在實際工作中得到這樣一個題 我們會怎麼做看我一定會分析這個需求,因為我害怕需求未來會改變,今天你叫我找一個第2大的數,明天你找我找一個第4大的數,後天叫我找一個第100大的數,我不搞死了。需求變化是很正常的事。分析完這個需求後,我會很自然地去寫找第K大數的演算法——難度一下子就增大了。很多人會以為找第K大的需求是一種逗過早擴展地的思路,不是這樣的,我相信我們在實際編碼中寫過太多這樣的程序了,你一定不會設計出這樣的函數介面 —— Find2ndMaxNum(int* array, int len),就好像你不會設計出 DestroyBaghdad(); 這樣的介面,而是設計一個DestoryCity( City& ); 的介面,而把Baghdad當成參數傳進去!所以,你應該是聲明一個叫FindKthMaxNum(int* array, int len, int kth),把2當成參數傳進去。這是最基本的編程方法,用數學的話來說,叫代數!最簡單的需求分析方法就是把需求翻譯成函數名,然後看看是這個介面不是很二看!(註:不要糾結於FindMaxNum()或FindMinNum(),因為這兩個函數名的業務意義很清楚了,不像Find2ndMaxNum()那麼二)非功能性需求分析性能之類的東西從來都是非功能性需求,對於演算法題,我們太喜歡研究演算法題的空間和時間復雜度了。我們希望做到空間和時間雙豐收,這是演算法學術界的風格。所以,習慣於標准答案的我們已經失去思考的能力,只會機械地思考演算法之內的性能,而忽略了演算法之外的性能。如果題目是——逗從無序數組中找到第K個最大的數地,那麼,我們一定會去思考用O(n)的線性演算法找出第K個數。事實上,也有線性演算法——STL中可以用nth_element求得類似的第n大的數,其利用快速排序的思想,從數組S中隨機找出一個元素X,把數組分為兩部分Sa和Sb。Sa中的元素大於等於X,Sb中元素小於X。這時有兩種情況:1)Sa中元素的個數小於k,則Sb中的第 k-|Sa|個元素即為第k大數;2) Sa中元素的個數大於等於k,則返回Sa中的第k大數。時間復雜度近似為O(n)。搞學術的nuts們到了這一步一定會歡呼勝利!但是他們哪裡能想得到性能的需求分析也是來源自業務的!我們一說性能,基本上是個人都會問,請求量有多大看如果我們的FindKthMaxNum()的請求量是m次,那麼你的這個每次都要O(n)復雜度的演算法得到的效果就是O(n*m),這一點,是書獃子式的學院派人永遠想不到的。因為應試教育讓我們不會從實際思考了。工程式的解法根據上面的需求分析,有軟體工程經驗的人的解法通常會這樣:1)把數組排序,從大到小。2)於是你要第k大的數,就直接訪問 array[k]。排序只需要一次,O(n*log(n)),然後,接下來的m次對FindKthMaxNum()的調用全是O(1)的,整體復雜度反而成了線性的。其實,上述的還不是工程式的最好的解法,因為,在業務中,那數組中的數據可能會是會變化的,所以,如果是用數組排序的話,有數據的改動會讓我重新排序,這個太耗性能了,如果實際情況中會有很多的插入或刪除操作,那麼可以考慮使用B+樹。工程式的解法有以下特點:1)很方便擴展,因為數據排好序了,你還可以方便地支持各種需求,如從第k1大到k2大的數據(那些學院派寫出來的代碼在拿到這個需求時又開始撓頭苦想了)2)規整的數據會簡化整體的演算法復雜度,從而整體性能會更好。(公欲善其事,必先利其器)3)代碼變得清晰,易懂,易維護!(學院派的和STL一樣的近似O(n)復雜度的演算法沒人敢動)爭論你可能會和我有以下爭論,如果程序員做這個演算法題用排序的方式,他一定不會像你想那麼多。是的,你說得對。但是我想說,很多時候,我們直覺地思考,恰恰是正確的路。因為逗排序地這個思路符合人類大腦處理問題的方式,而使用學院派的方式是反大腦直覺的。反大腦直覺的,通常意味著晦澀難懂,維護成本上升。就是一道面試題,我就是想測試一下你的演算法技能,這也扯太多了。沒問題,不過,我們要清楚我們是在招什麼人看是一個只會寫演算法的人,還是一個會做軟體的人看這個只有你自己最清楚。這個演算法題太容易誘導到學院派的思路了。是的這道逗找出第K大的數地,其實可以變換為更為業務一點的題目——逗我要和別的商戶競價,我想排在所有競爭對手報價的第K名,請寫一個程序,我輸入K,和一個商品名,系統告訴我應該訂多少價看(商家的所有商品的報價在一數組中)地——業務分析,整體性能,演算法,數據結構,增加需求讓應聘者重構,這一個問題就全考了。你是不是在說演算法不重要,不用學看千萬別這樣理解我,搞得好像如果面試不面,我就可以不學。演算法很重要,演算法題能鍛煉我們的思維,而且也有很多實際用處。我這篇文章不是讓大家不要去學演算法,這是完全錯誤的,我是讓大家帶著業務問題去使用演算法。問你業務問題,一樣會問到演算法題上來。小結看過這上面的分析,我相信你明白我為什麼反對純演算法面試題了。原因就是純演算法的面試題根本不能反應一個程序的綜合素質!那麼,在面試中,我們應該要考量程序員的那些綜合素質呢看我以為有下面這些東西:會不會做需求分析看怎麼理解問題的看解決問題的思路是什麼看想法如何看會不會對基礎的演算法和數據結構靈活運用看另外,我們知道,對於軟體開發來說,在工程上,難是的下面是這些挑戰:軟體的維護成本遠遠大於軟體的開發成本。軟體的質量變得越來越重要,所以,測試工作也變得越來越重要。軟體的需求總是在變的,軟體的需求總是一點一點往上加的。程序中大量的代碼都是在處理一些錯誤的或是不正常的流程。所以,對於編程能力上,我們應該主要考量程序員的如下能力:設計是否滿足對需求的理解,並可以應對可能出現的需求變化。
B. hr面試程序員問什麼問題,程序員在面試的時候的注意事項
01 和優秀開發者溝通
如果你本身沒有編程背景,那就盡量找到一些優秀的開發人員給你指點迷津。
02 問專業的問題
1. 簡要介紹一下你自己以及你最近在做的項目嗎?
作用:這個問題可以讓你更好地了解你的候選人,而談論近期工作能了解他對工作的熱情和奉獻。
2. 其他時間有別的項目要做嗎
作用:鑒於你的項目的時間長短和工作復雜程度,你可能只想找一個能完全投入到這個項目的人。但是很多程序員都會同時兼顧好幾個項目,你要確保彼此雙方的需求是什麼。
3. 你是怎麼看待自己的身份的?開發?產品經理?還是二者都是?
作用:理想的回答一般是『二者都是』, 但是你要認真評估每個候選人可能給你團隊帶來的有利和不利影響。產品經理可以幫助設計新的功能和交互,但是你也需要足夠的開發才能跟上方向從而建構你想要的內容。
4. 你會如何管理一個程序員團隊?
作用:這個問題可以幫你了解候選人的領導能力和風格。
5. 告訴他們公司想要的人是怎樣的。
作用:直截了當地告訴對方你的期望。像工作時間,項目長短,目標等等,這些都是對方很想知道的。就像你評價他是否適合公司一樣,對方也會評價你的公司是否適合他。
03 去合適的地方招聘
你不能指望天上會掉下個好程序員給你,微軟和谷歌的優秀程序員也不會自己蹦到你跟前。你的機會在於,很多這樣的程序員都擁有或追求商業想法。
你可以多去一些網站、活動大賽等地方探索發掘,這比你在社交網站上找到他們的運氣要大得多。
· 編程大賽
編程大賽就是程序員高手們雲集在一起,合作共同完成一個軟體的開發。
猿圈會定期舉辦此類招聘編程大賽,幫助企業挑選優質人才,提高企業品牌僱主形象。
· 開放性源代碼貢獻者
一些網站比如GitHub,提供在線代碼存儲庫, 程序員可以自由對開源項目貢獻自己的代碼。
所以,在招聘之前,你可以先去這種網站上找一找有潛力的候選人。
· 大學
· 軟體開發大會
盡可能多的去參加一些和你的產品相關的軟體開發大會。
· 技術博客
你能根據他們的博客判斷他們的技術技能、解決問題的能力以及寫作和溝通能力。
04 沒通過編程測試,堅決不錄用
你只能記住一條原則,那必須是,沒有讓候選人參加編程測試之前,千萬不能決定錄用與否。
通常情況下,出於項目的緊迫,我們會傾向於選擇看起來靠譜的第一個程序員,但是不拿到他的編程測試結果,不要沖動地下offer。
我也是個不懂代碼的HR,但是我善於利用各種各樣的工具,前段時間發現了一個猿圈測評的工具,我用它測試程序員候選人,通過測試結果判斷是否值得邀約來面試,這個我覺得很贊,你可以試試看
C. 下面的問題怎麼解決這是面試C# 程序員的時候面試題,求大神解答~~
問題1:
SELECT姓名,
CASEWHEN語文>=60THEN'及格'
ELSE'不及格'
ENDAS'語文',
CASEWHEN數學>=60THEN'及格'
ELSE'不及格'
ENDAS'數學',
CASEWHEN英語>=60THEN'及格'
ELSE'不及格'
ENDAS'英語'
FROM表
ORDERBY姓名
問題2:
//需要引入命名空間usingSystem.IO;
publicstringGetJson(stringfilePath)
{
//獲取文件擴展名
stringfileExt=Path.GetExtension(filePath);
//獲取文件名
stringfileName=Path.GetFileName(filePath);
//返回json字元串
return"{"filename":""+fileName+"","filenameex":""+fileExt.TrimStart('.')+""}";
}
D. 做一個程序員數學不好怎麼辦
一般做演算法方面的事情,對程序員數學方面的要求就會高一些;但如果是做一名的普通程序員其實對數學的要求沒那麼高,很多初、高中生的學歷,0基礎也可以學開發,將來一樣能做程序員。而且,像變數這種知識點比較簡單也比較基礎,都涉及不到太深的數學方面的東西。所以,我覺得也許是你對變數這個知識點可能掌握得不是那麼好。學習開發,學習方法也很重要,這塊兒咱們可以私信交流。另外,學習上總會遇到各種各樣的問題,不管你學開發還是學其它的什麼,要放平心態,心態不能崩;放棄是件很容易的事情,但只有堅持下來,你才有可能成為一名優秀的程序員。加油!
E. 當面試官問自己腦筋急轉彎問題時,怎樣回答會比較萬能
大多數的正規單位,在招錄人員的面試環節,面試官主要是希望通過面試,進一步近距離要了解應聘人員的具體情況,包括從業經歷、履職能力和專業深度。
很顯然,這些方面的信息,不可能通過一種臨場發揮的抖機靈方式得到展現,故而大多數的正規單位,都不會在面試環節去玩這種耍寶一般的面試考核。
F. 程序員面試問題及答案
程序員面試問題及答案
程序員是從事程序開發、維護的專業人員。我整理的程序員面試問題及答案,希望大家喜歡!
1、兩柱香問題
題目:有兩柱不均勻的香,每柱香燃燒完需要1個小時,問:怎樣用兩柱香切出一個15分鍾的時間段?這個題的重點就是怎麼切。
解答:將甲香的一頭點著,將乙香的兩頭點著,當乙香燃燒完時,說明已經過了半個小時,同時也說明甲香也正好燃燒了一半,此時,將甲香的另一頭點著,從此時起到甲香完全燒完,正好15分鍾。
2、燈管問題
在房裡有三盞燈,房外有三個開關,在房外看不見房內的情況,你只能進門一次,你用什麼方法來區分那個開關控制那一盞燈?
解答:打開一盞燈10分鍾,關掉,打開第二盞,進去看看哪盞亮,摸摸哪盞熱,熱的是第一個打開的開關開的,亮的是第二個開關開的',另一個就是第三個。
3、兩位盲人問題
他們都各自買了兩對黑襪和兩對白襪,八對襪了的布質、大小完全相同,而每對襪了都有一張商標紙連著。兩位盲人不小心將八對襪了混在一起。 他們每人怎樣才能取回黑襪和白襪各兩對呢?
答案:每一對分開,一人拿一隻,因為襪子不分左右腳的;
4、果凍問題
你有一桶果凍,其中有黃色,綠色,紅色三種,閉上眼睛,同時抓取兩個果凍。抓取多少個就可以確定你肯定有兩個同一顏色的果凍?
答案:2次4個!
5、喝啤酒問題
假如每3個空啤酒瓶可以換一瓶啤酒,某人買了10瓶啤酒,那麼他最多可以喝到多少瓶啤酒?
答案:喝完10瓶後用9個空瓶換來3瓶啤酒(喝完後有4個空瓶)喝完這三瓶又可以換到1瓶啤酒(喝完後有2個空瓶),這時他有2個空酒瓶,如果他能向老闆先借一個空酒瓶,就湊夠了3個空瓶可以換到一瓶啤酒,把這瓶喝完後將空瓶還給老闆就可以了。
所以他最多可以喝10+3+1+1=15瓶
6、三人住旅館
有三個人去住旅館,住三間房,每一間房$10元,於是他們一共付給老闆$30,第二天,老闆覺得三間房只需要$25元就夠了於是叫小弟退回$5給三位客人,誰知小弟貪心,只退回每人$1,自己偷偷拿了$2,這樣一來便等於那三位客人每人各花了九元,於是三個人一共花了$27,再加上小弟獨吞了不$2,總共是$29。可是當初他們三個人一共付出$30那麼還有$1呢?
答案:他們所消費的27元里已經包括小弟的2元了,再加退還的3元=30元。這種題一定不要亂了陣腳,根據一條思路做:這30元現在的分布是:老闆拿25元,伙計拿2元,三人各拿1元,正好!
7、三筐蘋果問題
有三筐水果,一筐裝的全是蘋果,第二筐裝的全是橘子,第三筐是橘子與蘋果混在一起。筐上的標簽都是騙人的,(就是說筐上的標簽都是錯的)你的任務是拿出其中一筐,從裡面只拿一隻水果,然後正確寫出三筐水果的標簽。
答案:從標著「混合」標簽的筐里拿一隻水果,就可以知道另外兩筐裝的是什麼水果了。
分析:從混合的拿出一個來,如果是蘋果,而貼蘋果的筐里有可能是橘子和混合,如果是混合,說明貼橘子的筐里是橘子,不成立(因為前提說了,每個標簽都是錯的)。所以貼蘋果的筐里是橘子,則貼橘子的筐里是混合。
8、汽車加油問題
一輛載油500升的汽車從A開往1000公里外的B,已知汽車每公里耗油量為1升,A處有無窮多的油,其他任何地點都沒有油,但該車可以在任何地點存放油以備中轉,問從A到B最少需要多少油
解答:嚴格證明該模型最優比較麻煩,但確實可證,大膽猜想是解題關鍵。題目可歸結為求數列an=500/(2n 1) n=0,1,2,3......的和Sn什麼時候大於等於1000,解得n>6當n=6時,S6=977.57,所以第一個中轉點離起始位置距離為1000-977.57=22.43公里.所以第一次中轉之前共耗油22.43*(2*7 1)=336.50升此後每次中轉耗油500升,所以總耗油量為7*500 336.50=3836.50升。
9、兩個人猜數問題
教授選出兩個從2到9的數,把它們的和告訴學生甲,把它們的積告訴學生乙,讓他們輪流猜這兩個數, 甲說:「我猜不出」, 乙說:「我猜不出」, 甲說:「我猜到了」, 乙說:「我也猜到了」, 問這兩個數是多少?
解答:3和4。設兩個數為n1,n2,n1> =n2,甲聽到的數為n=n1 n2,乙聽到的數為m=n1*n2,證明n1=3,n2=4是唯一解。證明:要證以上命題為真,不妨先證n=7
1)必要性:
i) n> 5 是顯然的,因為n <4不可能,n=4或者n=5甲都不可能回答不知道
ii) n> 6 因為如果n=6的話,那麼甲雖然不知道(不確定2 4還是3 3)但是無論是2,4還是3,3乙都不可能說不知道(m=8或者m=9的話乙說不知道是沒有道理的)
iii) n <8 因為如果n> =8的話,就可以將n分解成 n=4 x 和 n=6 (x-2),那麼m可以是4x也可以是6(x-2)而4x=6(x-2)的必要條件是x=6即n=10,那樣n又可以分解成8 2,所以總之當n> =8時,n至少可以分解成兩種不同的合數之和,這樣乙說不知道的時候,甲就沒有理由馬上說知道。以上證明了必要性。
2)充分性
當n=7時,n可以分解成2 5或3 4
顯然2 5不符合題意,捨去,容易判斷出3 4符合題意,m=12,證畢
於是得到n=7 m=12 n1=3 n2=4是唯一解。
10、猴子吃香蕉問題
一個小猴子邊上有100 根香蕉,它要走過50 米才能到家,每次它最多搬50 根香蕉,每走1 米就要吃掉一根,請問它最多能把多少根香蕉搬到家裡。
解答:設 小猴從0 走到50, 到A 點時候他可以直接抱香蕉回家了, 可是到A 點時候他至少消耗了3A 的香蕉( 到A, 回0, 到A), 一個限制就是小猴只能抱50 只香蕉, 那麼在A 點小猴最多49 只香蕉.100-3A=49, 所以A=17. 這樣折騰完到家的時候香蕉剩100-3A-(50-A)=50-2A=16.
G. 程序員技術面試中,當面試官問「你還有什麼問題」,應該怎麼回答
應聘程序員,在技術面試的時候,結束時面試官通常會問一個問題:你還有什麼問題嗎?眾所周知,面對這個問題不能直接說沒問題了,因為這是你掰回一句或者加深認可的好機會。但是下面這4個問題在技術面試時最好不要問:
1、「我能拿多少工資?」
注意你參加的是技術面試,盡量不要問跟技術不相關的東西,這在技術面試的過程中是一個減分項。一般面試官如果對你有興趣會主動地詢問你的理想薪資。
2、「五險一金有沒有?交通補助有沒有?」
這個問題一般不建議去問,這些問題在技術面試後人事會主動告訴你或者自己主動去詢問人事都可以的,但是在技術面試官面前,問這些跟他本職工作沒有關系的問題會讓面試官覺得不耐煩。
3、「公司經常加班嗎?」
作為開發人員加班的情況肯定是會有的,只是經不經常可能得看公司的實際情況。在面試時問這個問題你可能只是想了解一下公司的加班情況,但卻會讓面試官質疑你的抗壓能力,給面試留下不好的印象。
4、「您覺得我今天能面上嗎?」
有些小夥伴可能急於求職,所以會有些迫切地問這個問題。如果面試官覺得你有希望肯定會給你一些信號,如果面試官不看好你,問這個問題可能讓雙方都比較尷尬。
上面說了4個不該問的問題, 那在面試官問「你還有什麼問題嗎?」時應該問一些什麼問題?
再次點題,在技術面試最好提跟技術相關或跟本職工作相關的的問題。第一,可以問一下關於產品的問題,比如一下產品用的什麼技術,想回去了解一下,或者關於一些新的技術比如大數據、spring boot公司是怎麼用的。這些問題既能讓面試官有興趣回答,又能展現你的知識面。
H. 程序員面試經常被提到的問題
java 程序員常用面試題- -
Java程序員面試三十二問
Java程序員面試三十二問
作者:佚名 來自:未知
第一,談談final, finally, finalize的區別。
第二,Anonymous Inner Class (匿名內部類) 是否可以extends(繼承)其它類,是否可以
implements(實現)interface(介面)?
第三,Static Nested Class 和 Inner Class的不同,說得越多越好(面試題有的很籠統)。
第四,&和&&的區別。
第五,HashMap和Hashtable的區別。
第六,Collection 和 Collections的區別。
第七,什麼時候用assert.
第八,GC是什麼? 為什麼要有GC?
第九,String s = new String("xyz");創建了幾個String Object?
第十,Math.round(11.5)等於多少? Math.round(-11.5)等於多少?
第十一,short s1 = 1; s1 = s1 + 1;有什麼錯? short s1 = 1; s1 += 1;有什麼錯?
第十二,sleep() 和 wait() 有什麼區別?
第十三,Java有沒有goto?
第十四,數組有沒有length()這個方法? String有沒有length()這個方法?
第十五,Overload和Override的區別。Overloaded的方法是否可以改變返回值的類型?
第十六,Set里的元素是不能重復的,那麼用什麼方法來區分重復與否呢? 是用==還是equals()?
它們有何區別?
第十七,給我一個你最常見到的runtime exception.
第十八,error和exception有什麼區別?
第十九,List, Set, Map是否繼承自Collection介面?
第二十,abstract class和interface有什麼區別?
第二十一,abstract的method是否可同時是static,是否可同時是native,是否可同時是
synchronized?
第二十二,介面是否可繼承介面? 抽象類是否可實現(implements)介面? 抽象類是否可繼承實體
類(concrete class)?
第二十三,啟動一個線程是用run()還是start()?
第二十四,構造器Constructor是否可被override?
第二十五,是否可以繼承String類?
第二十六,當一個線程進入一個對象的一個synchronized方法後,其它線程是否可進入此對象的其它
方法?
第二十七,try {}里有一個return語句,那麼緊跟在這個try後的finally {}里的code會不會被執行
,什麼時候被執行,在return前還是後?
第二十八,編程題: 用最有效率的方法算出2乘以8等於幾?
第二十九,兩個對象值相同(x.equals(y) == true),但卻可有不同的hash code,這句話對不對
?
第三十,當一個對象被當作參數傳遞到一個方法後,此方法可改變這個對象的屬性,並可返回變化後
的結果,那麼這里到底是值傳遞還是引用傳遞?
第三十一,swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?
第三十二,編程題: 寫一個Singleton出來。
以下是答案
第一,談談final, finally, finalize的區別。
final?修飾符(關鍵字)如果一個類被聲明為final,意味著它不能再派生出新的子類,不能作為父
類被繼承。因此一個類不能既被聲明為 abstract的,又被聲明為final的。將變數或方法聲明為final,
可以保證它們在使用中不被改變。被聲明為final的變數必須在聲明時給定初值,而在以後的引用中只能
讀取,不可修改。被聲明為final的方法也同樣只能使用,不能重載finally?再異常處理時提供 finally
塊來執行任何清除操作。如果拋出一個異常,那麼相匹配的 catch 子句就會執行,然後控制就會進入
finally 塊(如果有的話)。
finalize?方法名。Java 技術允許使用 finalize() 方法在垃圾收集器將對象從內存中清除出去
之前做必要的清理工作。這個方法是由垃圾收集器在確定這個對象沒有被引用時對這個對象調用的。它是
在 Object 類中定義的,因此所有的類都繼承了它。子類覆蓋 finalize() 方法以整理系統資源或者執
行其他清理工作。finalize() 方法是在垃圾收集器刪除對象之前對這個對象調用的。
第二,Anonymous Inner Class (匿名內部類) 是否可以extends(繼承)其它類,是否可以
implements(實現)interface(介面)?
匿名的內部類是沒有名字的內部類。不能extends(繼承) 其它類,但一個內部類可以作為一個介面
,由另一個內部類實現。
第三,Static Nested Class 和 Inner Class的不同,說得越多越好(面試題有的很籠統)。
Nested Class (一般是C++的說法),Inner Class (一般是JAVA的說法)。Java內部類與C++嵌套
類最大的不同就在於是否有指向外部的引用上。具體可見http:
//www.frontfree.net/articles/services/view.asp?id=704&page=1
註: 靜態內部類(Inner Class)意味著1創建一個static內部類的對象,不需要一個外部類對象,2
不能從一個static內部類的一個對象訪問一個外部類對象
第四,&和&&的區別。
&是位運算符。&&是布爾邏輯運算符。
第五,HashMap和Hashtable的區別。
都屬於Map介面的類,實現了將惟一鍵映射到特定的值上。
HashMap 類沒有分類或者排序。它允許一個 null 鍵和多個 null 值。
Hashtable 類似於 HashMap,但是不允許 null 鍵和 null 值。它也比 HashMap 慢,因為它是同步
的。
第六,Collection 和 Collections的區別。
Collections是個java.util下的類,它包含有各種有關集合操作的靜態方法。
Collection是個java.util下的介面,它是各種集合結構的父介面。
第七,什麼時候用assert。
斷言是一個包含布爾表達式的語句,在執行這個語句時假定該表達式為 true。如果表達式計算為
false,那麼系統會報告一個 AssertionError。它用於調試目的:
assert(a > 0); // throws an AssertionError if a <= 0
斷言可以有兩種形式:
assert Expression1 ;
assert Expression1 : Expression2 ;
Expression1 應該總是產生一個布爾值。
Expression2 可以是得出一個值的任意表達式。這個值用於生成顯示更多調試信息的 String 消息。
斷言在默認情況下是禁用的。要在編譯時啟用斷言,需要使用 source 1.4 標記:
javac -source 1.4 Test.java
要在運行時啟用斷言,可使用 -enableassertions 或者 -ea 標記。
要在運行時選擇禁用斷言,可使用 -da 或者 -disableassertions 標記。
要系統類中啟用斷言,可使用 -esa 或者 -dsa 標記。還可以在包的基礎上啟用或者禁用斷言。
可以在預計正常情況下不會到達的任何位置上放置斷言。斷言可以用於驗證傳遞給私有方法的參數。
不過,斷言不應該用於驗證傳遞給公有方法的參數,因為不管是否啟用了斷言,公有方法都必須檢查其參
數。不過,既可以在公有方法中,也可以在非公有方法中利用斷言測試後置條件。另外,斷言不應該以任
何方式改變程序的狀態。
第八,GC是什麼? 為什麼要有GC? (基礎)。
GC是垃圾收集器。Java 程序員不用擔心內存管理,因為垃圾收集器會自動進行管理。要請求垃圾收
集,可以調用下面的方法之一:
System.gc()
Runtime.getRuntime().gc()
第九,String s = new String("xyz");創建了幾個String Object?
兩個對象,一個是"xyx",一個是指向"xyx"的引用對象s。
第十,Math.round(11.5)等於多少? Math.round(-11.5)等於多少?
Math.round(11.5)返回(long)12,Math.round(-11.5)返回(long)-11;
第十一,short s1 = 1; s1 = s1 + 1;有什麼錯? short s1 = 1; s1 += 1;有什麼錯?
short s1 = 1; s1 = s1 + 1;有錯,s1是short型,s1+1是int型,不能顯式轉化為short型。可修改為
s1 =(short)(s1 + 1) 。short s1 = 1; s1 += 1正確。
第十二,sleep() 和 wait() 有什麼區別? 搞線程的最愛
sleep()方法是使線程停止一段時間的方法。在sleep 時間間隔期滿後,線程不一定立即恢復執行。
這是因為在那個時刻,其它線程可能正在運行而且沒有被調度為放棄執行,除非(a)"醒來"的線程具有更
高的優先順序,(b)正在運行的線程因為其它原因而阻塞。
wait()是線程交互時,如果線程對一個同步對象x 發出一個wait()調用,該線程會暫停執行,被調對
象進入等待狀態,直到被喚醒或等待時間到。
第十三,Java有沒有goto?
Goto?java中的保留字,現在沒有在java中使用。
第十四,數組有沒有length()這個方法? String有沒有length()這個方法?
數組沒有length()這個方法,有length的屬性。
String有有length()這個方法。
第十五,Overload和Override的區別。Overloaded的方法是否可以改變返回值的類型?
方法的重寫Overriding和重載Overloading是Java多態性的不同表現。重寫Overriding是父類與子類
之間多態性的一種表現,重載Overloading是一個類中多態性的一種表現。如果在子類中定義某方法與其
父類有相同的名稱和參數,我們說該方法被重寫 (Overriding)。子類的對象使用這個方法時,將調用子
類中的定義,對它而言,父類中的定義如同被"屏蔽"了。如果在一個類中定義了多個同名的方法,它們或
有不同的參數個數或有不同的參數類型,則稱為方法的重載(Overloading)。Overloaded的方法是可以改
變返回值的類型。
第十六,Set里的元素是不能重復的,那麼用什麼方法來區分重復與否呢? 是用==還是equals()? 它
們有何區別?
Set里的元素是不能重復的,那麼用iterator()方法來區分重復與否。equals()是判讀兩個Set是否相
等。
equals()和==方法決定引用值是否指向同一對象equals()在類中被覆蓋,為的是當兩個分離的對象的
內容和類型相配的話,返回真值。
第十七,給我一個你最常見到的runtime exception。
ArithmeticException, ArrayStoreException, BufferOverflowException,
BufferUnderflowException, CannotRedoException, CannotUndoException, ClassCastException,
CMMException, , DOMException, EmptyStackException,
IllegalArgumentException, IllegalMonitorStateException, IllegalPathStateException,
IllegalStateException, ImagingOpException, IndexOutOfBoundsException,
MissingResourceException, NegativeArraySizeException, NoSuchElementException,
NullPointerException, ProfileDataException, ProviderException, RasterFormatException,
SecurityException, SystemException, UndeclaredThrowableException, UnmodifiableSetException,
UnsupportedOperationException
第十八,error和exception有什麼區別?
error 表示恢復不是不可能但很困難的情況下的一種嚴重問題。比如說內存溢出。不可能指望程序能
處理這樣的情況。
exception 表示一種設計或實現問題。也就是說,它表示如果程序運行正常,從不會發生的情況。
第十九,List, Set, Map是否繼承自Collection介面?
List,Set是
Map不是
第二十,abstract class和interface有什麼區別?
聲明方法的存在而不去實現它的類被叫做抽象類(abstract class),它用於要創建一個體現某些基
本行為的類,並為該類聲明方法,但不能在該類中實現該類的情況。不能創建abstract 類的實例。然而
可以創建一個變數,其類型是一個抽象類,並讓它指向具體子類的一個實例。不能有抽象構造函數或抽象
靜態方法。Abstract 類的子類為它們父類中的所有抽象方法提供實現,否則它們也是抽象類為。取而代
之,在子類中實現該方法。知道其行為的其它類可以在類中實現這些方法。
介面(interface)是抽象類的變體。在介面中,所有方法都是抽象的。多繼承性可通過實現這樣的
介面而獲得。介面中的所有方法都是抽象的,沒有一個有程序體。介面只可以定義static final成員變數
。介面的實現與子類相似,除了該實現類不能從介面定義中繼承行為。當類實現特殊介面時,它定義(即
將程序體給予)所有這種介面的方法。然後,它可以在實現了該介面的類的任何對象上調用介面的方法。
由於有抽象類,它允許使用介面名作為引用變數的類型。通常的動態聯編將生效。引用可以轉換到介面類
型或從介面類型轉換,instanceof 運算符可以用來決定某對象的類是否實現了介面。
第二十一,abstract的method是否可同時是static,是否可同時是native,是否可同時是
synchronized?
都不能
第二十二,介面是否可繼承介面? 抽象類是否可實現(implements)介面? 抽象類是否可繼承實體類
(concrete class)?
介面可以繼承介面。抽象類可以實現(implements)介面,抽象類是否可繼承實體類,但前提是實體類
必須有明確的構造函數。
第二十三,啟動一個線程是用run()還是start()?
啟動一個線程是調用start()方法,使線程所代表的虛擬處理機處於可運行狀態,這意味著它可以由
JVM調度並執行。這並不意味著線程就會立即運行。run()方法可以產生必須退出的標志來停止一個線程。
第二十四,構造器Constructor是否可被override?
構造器Constructor不能被繼承,因此不能重寫Overriding,但可以被重載Overloading。
第二十五,是否可以繼承String類?
String類是final類故不可以繼承。
第二十六,當一個線程進入一個對象的一個synchronized方法後,其它線程是否可進入此對象的其它
方法?
不能,一個對象的一個synchronized方法只能由一個線程訪問。
第二十七,try {}里有一個return語句,那麼緊跟在這個try後的finally {}里的code會不會被執行
,什麼時候被執行,在return前還是後?
會執行,在return前執行。
第二十八,編程題: 用最有效率的方法算出2乘以8等於幾?
有C背景的程序員特別喜歡問這種問題。
2 << 3
第二十九,兩個對象值相同(x.equals(y) == true),但卻可有不同的hash code,這句話對不對?
不對,有相同的hash code。
第三十,當一個對象被當作參數傳遞到一個方法後,此方法可改變這個對象的屬性,並可返回變化後
的結果,那麼這里到底是值傳遞還是引用傳遞?
是值傳遞。Java 編程語言只由值傳遞參數。當一個對象實例作為一個參數被傳遞到方法中時,參數
的值就是對該對象的引用。對象的內容可以在被調用的方法中改變,但對象的引用是永遠不會改變的。
第三十一,swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?
switch(expr1)中,expr1是一個整數表達式。因此傳遞給 switch 和 case 語句的參數應該是 int
、 short、 char 或者 byte。long,string 都不能作用於swtich。
第三十二,編程題: 寫一個Singleton出來。
Singleton模式主要作用是保證在Java應用程序中,一個類Class只有一個實例存在。
一般Singleton模式通常有幾種種形式:
第一種形式: 定義一個類,它的構造函數為private的,它有一個static的private的該類變數,
在類初始化時實例話,通過一個public的getInstance方法獲取對它的引用,繼而調用其中的方法。
public class Singleton {
private Singleton(){}
//在自己內部定義自己一個實例,是不是很奇怪?
//注意這是private 只供內部調用
private static Singleton instance = new Singleton();
//這里提供了一個供外部訪問本class的靜態方法,可以直接訪問
public static Singleton getInstance() {
return instance;
}
}
第二種形式:
public class Singleton {
private static Singleton instance = null;
public static synchronized Singleton getInstance() {
//這個方法比上面有所改進,不用每次都進行生成對象,只是第一次
//使用時生成實例,提高了效率!
if (instance==null)
instance=new Singleton();
return instance; }
}
其他形式:
定義一個類,它的構造函數為private的,所有方法為static的。
一般認為第一種形式要更加安全些
第三十三 Hashtable和HashMap
Hashtable繼承自Dictionary類,而HashMap是Java1.2引進的Map interface的一個實現
HashMap允許將null作為一個entry的key或者value,而Hashtable不允許
還有就是,HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因為
contains方法容易讓人引起誤解。
最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多個線程訪問Hashtable時,
不需要自己為它的方法實現同步,而HashMap就必須為之提供外同步。
Hashtable和HashMap採用的hash/rehash演算法都大概一樣,所以性能不會有很大的差異。
I. 面試官問:「1+1是什麼」,老實人說是數學題,聰明人會怎樣回答
在面試的時候,面試官總是會提出各種各樣的刁鑽的問題,有時候這些問題看似很簡單,甚至簡單到你都不屑於說出答案,但是等到你說出答案的時候,面試官卻會露出失望的神情,因為你沒有學會透過問題的表面現象而看清它的本質,這時候他們問你的這個問題只是一個借喻,你要發揮你的思維展開充分的聯想。
如果你即將面對的崗位是一個壓力很大的崗位,那麼你就要把話題扯到工作壓力方面,向面試官表示你能夠承受這種壓力,讓他們充分的了解你,這樣也不失為一種好的回答。總之我們要對症下葯,依照自己所面臨的情景,給出最完美、最合理答案。