1. 程式人生 > >最近找java實習面試被問到的東西總結(Java方向)

最近找java實習面試被問到的東西總結(Java方向)

      時間,就是這麼很悄悄的溜走了將近兩個年華,不知不覺的,研二了,作為一個一般學校的研究生,不知道該說自己是不學無術,還是說有過努力,反正,這兩年裡,有過堅持,有過墮落,這不,突然間,有種開竅的急迫感,尋思著找些實習,充實下生活,也是為了將來而備戰,目標定位在杭州,然而,杭州的Java實習並不多,大大小小投了十來個企業單位,面來面去,回答的基本上也算差強人意,今日得一閒暇,就最近被問到的一些問題一一羅列,繼續努力吧!:

1、說出Object類的常用方法? 

答:這個問題,對於Java開發有經驗的人來說,應該不難,至少也得說出5/6個方法的樣子,然而,很顯然,大部分在校生,並不知情,這個問題是上個學期年底面試百度的時候被問到的,當時有點懵逼,只說出了equals()方法、toString()方法,後來被面試官果真狠狠的指教了一番,於是很自然的印象深刻,估計著,以後的面試裡是肯定不會忘記咯,其實要回答這個問題,只要我們能想到執行緒通訊的方法,那就基本上沒問題了,要知道執行緒之間進行通訊那裡可是有著三個方法呢,加上這裡兩個不就5個了嘛,完完全全的可以搞定面試官了,這三個方法就是:wait()、notify()、notifyAll()!哈哈,好了,廢話不多說,總結答案如下:

protected Object clone()//建立並返回此物件的一個副本。   
boolean equals(Object obj)//指示其他某個物件是否與此物件“相等”。   
String toString()//返回該物件的字串表示。
void wait()//在其他執行緒呼叫此物件的 notify() 方法或 notifyAll() //方法前,導致當前執行緒等待。 
void notify()//喚醒在此物件監視器上等待的單個執行緒。   
void notifyAll()//喚醒在此物件監視器上等待的所有執行緒。
int hashCode()//返回該物件的雜湊碼值。
Class<> getClass()//
返回此 Object 的執行時類。 protected void finalize()//當垃圾回收器確定不存在對該物件的更多引用時,由物件的垃圾回收器呼叫此方法。

這裡每個方法用來做什麼的,務必要搞清楚,比如說如果面試官讓你對一個非基本資料型別的物件進行復制,但不能影響到原物件,這裡我們要學會使用clone()方法,如此等等。。。

2、說出一些常用的類,包,介面,常見的runtime exception,請各舉5個。 

答:此問題依舊是被百度面試官所提出,當時覺著就是小菜一碟,然而回答的時候,腦子確實突然短路了,平時寫程式碼匯入了那麼多包,用過那麼多類,媽蛋,一要說出口的時候才發現,真正是胸有溝壑萬千,卻不知道從何說起!於是稀裡糊塗的道出常用的類有String類、StringBuffer類、Integer類,嗯當時是就說了這幾個腦子就短路了,甚至還傻傻的怯怯的反問了面試官一句,這些算常用的類嗎?記得,當時面試官沒說啥,很自然的一笑了之,現在想想覺得也是逗了!接下來,我接著發揮,常用的包的話,java.lang、java.util、java.io、java.awt、java.sql,正待我說的興致正濃時,面試官打斷,說說常用的介面,瞬間懵逼,介面,幸虧瞬間想到集合框架,於是立馬答道Map,List,本來想說Set的,後來想想打住了,但無奈想不起別的了,於是如實說,暫時就想起這些了,常見的異常,我直接說,陣列越界、除0異常,資料庫異常,面試官打斷,用java,於是老老實實的冥思苦想,卻發現啥都想不起來了,憋了半天總算憋出了一個NullPointException異常,緊張啊!回來後,立馬總結語句:

常用的類:BufferedReader、BufferedWriter、FileReader、FileWirter、String、Integer 、StringBuffer、Stack
常用的包:java.lang、java.awt、java.io、java.util、java.sql、javax.xml、java.NET
常用的介面: List、Map、Document、NodeList、Remote 
常見的異常:ArithmeticException (a=5/0即數學運算中除0異常)ClassCastException (強制轉換異常)NullPointerException(空指標異常,使用Null時)ArrayIndexOutofBoundsException(陣列越界)StringIndexOutBoundsException(指示索引或者為負或者超出字串大小)IndexOutOfBoundsException(下標越界)NegativeArraySizeException(建立大小為負的陣列)IllegalArgumentException(傳遞非法引數)SecurityException(安全異常)NumberFormatException(資料格式異常,字串->數字)FileNotFoundException(檔案未找到異常)SQLException(操作資料庫異常)IOException(I/O輸入輸出異常)

3、說說你常用的資料結構?

答:何為資料結構?是說演算法嘛,心裡在想,在想,想說又不敢說(第一次面試,沒有準備的面試,面的還是百度,別提有多緊張了),面試官見我是半天沒坑出一句話,於是提醒了下,你平時用過集合框架沒,額,瞬間醒悟,原來問的這個,於是滔滔不絕,將自己從某寶典中的記憶全部吸納而出,總體上回答的還算不差(自我感覺,面試官也沒刁難在這裡),第二次在EMC再次被問到這個問題的時候,還算照著某寶典行雲流水,然而,想象總是那麼美好,期間,面試官,巧問了一句,你說HashMap和Hashtable之間一個是安全一個是不安全也就是執行緒同步和不同步,那麼這個執行緒安全問題指的是什麼?你能不能舉個例子出來,其實這個問題並不難,難就難在我當時正沉浸在某寶典之中,根本想不到會有這麼一問,所以稀裡糊塗的回答了些,很顯然,雖然回答的八九不離十,但面試官能從我臉上讀出我說話的沒底氣!接下來總結下集合框架面試的大體如下:

首先我們要說的應該是對集合框架的理解,也可以當著面試官寫下自己認為的集合框架結構圖或者簡圖之類的,這裡的具體的話,自己發揮!
1、其次說說Collection和Collections,Collection是集合類的上級介面,即是java.util下所有集合類的父介面,繼承於他的介面主要有List和Set;Collections是針對集合類的一個工具類,提供了一系列靜態方法實現對各種集合的搜尋、排序、執行緒安全化等操作。 
2、List和Set是繼承自Collection介面,而Map並不是繼承自Collection介面;Set裡的元素是不能重複的,可以用iterator()方法來區分重複與否!equals()是判讀兩個set是否相等, equals()和==方法決定引用值是否指向同一物件equals()在類中被覆蓋,為的是當兩個分離的物件的內容和型別相配的話,返回真值。 
3、Collection框架中實現比較要實現comparable/comparator介面。 
4、ArrayList和Vector的區別: 
共同點:這兩個類都實現了List介面(List介面繼承了Collection介面),他們都是有序集合,即儲存在這兩個集合中的元素的位置都是有順序的,相當於一種動態的陣列,我們以後可以按位置索引號取出某個元素,並且其中的資料是允許重複的,這是與HashSet之類的集合的最大不同處,HashSet之類的集合不可以按索引號去檢索其中的元素,也不允許有重複的元素。 
接著說ArrayList與Vector的區別,這主要包括兩個方面:. 
同步性:Vector是執行緒安全的,也就是說是它的方法之間是執行緒同步的,而ArrayList是執行緒序不安全的,它的方法之間是執行緒不同步的。如果只有一個執行緒會訪問到集合,那最好是使用ArrayList,因為它不考慮執行緒安全,效率會高些;如果有多個執行緒會訪問到集合,那最好是使用Vector,因為不需要我們自己再去考慮和編寫執行緒安全的程式碼。 
注意:這裡談到執行緒安全,同步問題,面試官少不了會多嘴說一句,讓你講講執行緒安全是咋回事,如果不考慮,你聽到這個問題估計會是一臉懵逼,我當初就是這樣子的!所以這裡我補充下執行緒安全的問題: java中的執行緒安全就是執行緒同步的意思,就是當一個程式對一個執行緒安全的方法或者變數進行訪問的時候,其他的程式不能再對他進行操作了,必須等到這次訪問結束以後才能對這個執行緒安全的方法進行訪問,否則將會造成錯誤發生;執行緒安全就是說,如果你的程式碼所在的程序中有多個執行緒在同時執行,而這些執行緒可能會同時執行這段程式碼。如果每次執行結果和單執行緒執行的結果是一樣的,而且其他的變數的值也和預期的是一樣的,就是執行緒安全的。 執行緒安全問題都是由全域性變數及靜態變數引起的,定義在方法內部的區域性私有變數是沒有執行緒安全與否一說的。 
備註:對於Vector&ArrayList、Hashtable&HashMap,要記住執行緒安全的問題,記住Vector與Hashtable是舊的,是java一誕生就提供了的,它們是執行緒安全的,ArrayList與HashMap是java2時才提供的,它們是執行緒不安全的。所以,我們講課時先講老的。 
資料增長:ArrayList與Vector都有一個初始的容量大小,當儲存進它們裡面的元素的個數超過了容量時,就需要增加ArrayList與Vector的儲存空間,每次要增加儲存空間時,不是隻增加一個儲存單元,而是增加多個儲存單元,每次增加的儲存單元的個數在記憶體空間利用與程式效率之間要取得一定的平衡。Vector預設增長為原來兩倍,而ArrayList的增長策略在文件中沒有明確規定(從原始碼看到的是增長為原來的1.5倍)。ArrayList與Vector都可以設定初始的空間大小,Vector還可以設定增長的空間大小,而ArrayList沒有提供設定增長空間的方法。 
總結:即Vector增長原來的一倍,ArrayList增加原來的0.5倍。 
5、ArrayList,Vector, LinkedList的儲存效能和特性: 
ArrayList和Vector都是使用陣列方式儲存資料,此陣列元素數大於實際儲存的資料以便增加和插入元素,它們都允許直接按序號索引元素,但是插入元素要涉及陣列元素移動等記憶體操作,所以索引資料快而插入資料慢,Vector由於使用了synchronized方法(執行緒安全),通常效能上較ArrayList差,而LinkedList使用雙向連結串列實現儲存,按序號索引資料需要進行前向或後向遍歷,但是插入資料時只需要記錄本項的前後項即可,所以插入速度較快。LinkedList也是執行緒不安全的,LinkedList提供了一些方法,使得LinkedList可以被當作堆疊和佇列來使用。 
6、List和Map的區別: 
一個是儲存單列資料的集合,另一個是儲存鍵和值這樣的雙列資料的集合,List中儲存的資料是有順序,並且允許重複;Map中儲存的資料是沒有順序的,其鍵(key)是不能重複的,它的值(value)是可以有重複的,存值採用 put(key,value)。Map中取值:value=m.get(key)(這個面試官常問,雖然不難,但也得注意) 
7、HashMap和Hashtable的區別: 
HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因為contains方法容易讓人引起誤解。 
一.歷史原因:Hashtable是基於陳舊的Dictionary類的,HashMap是Java 1.2引進的Map介面的一個實現 
二.同步性:Hashtable是執行緒安全的,也就是說是同步的,而HashMap是執行緒序不安全的,不是同步的 
三.值:只有HashMap可以讓你將空值作為一個表的條目的key或value,即HashMap允許將null作為一個entry的key或者value,而Hashtable不允許。

4、String 和StringBuffer的區別? 

答:這個問題相對來說很容易,某寶典上有詳細的解說,問到的時候,只要按照某寶典上來發揮就行了!這個問題是杭州某家網路公司問到的。。

String和StringBuffer類,它們可以儲存和操作字串,即包含多個字元的字元資料。這個String類提供了數值不可改變的字串,而這個StringBuffer類提供的字串可以進行修改,所以當你知道字元資料要改變的時候你就可以使用StringBuffer。典型地,你可以使用StringBuffers來動態構造字元資料。

另外,String類實現了equals方法,new String(“abc”).equals(new String(“abc”)的結果為true,而StringBuffer沒有實現equals方法,所以,new StringBuffer(“abc”).equals(new StringBuffer(“abc”)的結果為false。(String覆蓋了equals方法和hashCode方法,而StringBuffer沒有覆蓋equals方法和hashCode方法,所以,將StringBuffer物件儲存進Java集合類中時會出現問題。)

5、關於執行緒的一些問題?

答:面試官一開始問我熟悉執行緒嗎?我能怎麼回答,總不能說不熟悉啊,多執行緒這玩意幾乎都是各大企業面試官屢問不爽的問題啊,好吧,一接通電話,面試官進行了簡單的自我介紹之後,無一例外的會問到關於執行緒的問題,所以多少準備些吧。

很典型的一個問題,你一般如何實現多執行緒,這個問題不用多說,很簡單,java提供了兩種方式,一個是繼承Thread類,另一個是實現Runnable介面,由於java不支援多繼承,所以在多繼承的時候,我們得優先選用 實現 Runnable介面,因為我們可以通過實現介面的辦法,間接的實現多繼承!

另外還有公司問到,執行緒之間是通過哪些方法進行通訊,這個其實在上面說到Object類的常用方法的時候已經提到過了,主要是三個方法,wait()、notify()、notifyAll()方法,解釋的話就自己組織下就行咯,在這之前,有些HR會問你你通常如何啟動執行緒,顯而易見,start()方法!好吧,問到這裡,其實執行緒問題也差不多了,不過有些面試官往往不知從何找話題,於是簡單的問道,執行緒的生命週期,嗯這個只要我們想到OS中的程序就行了,差不多的,建立、就緒、執行、阻塞、消亡!

OK,不,好像還有個問題被問到了,執行緒池,這個問題我完全不知道,查了百科,也就大致瞭解了下,所以大家自己看看,我就不組織語言了,最後自己覺得執行緒中還有一個比較重要的東西,一個就是 interrupt()方法,一個是currentThread()方法,具體情況大家自己檢視java API文件就好,我就不多解釋了!

6、說說你常用的資料庫?

答:每每問到這個問題,我總會一口氣說完,mysql、sql server、oracle,當然是按照使用熟練程度,所以面試官就往往會往這方面提問,之前由於一直沒接觸到資料庫儲存引擎的問題,所以在被問到你用MySQL時,一般用的是哪種儲存引擎(Engine)的時候,直接是一臉懵逼!我默默的問了句,什麼是儲存引擎?好吧,面試官也算是無解,就說現在一般都是用的InnoDB儲存引擎吧。我只好在面完後,給自己做了下補充:MySQL常用儲存引擎:InnoDB和MyISAM,其中InnoDB適用頻繁維護的。修改 插入等的資料表,MyISAM適合少改寫 少插入的讀取頻繁的表,那麼顯而易見,我們做開發的,肯定是InnoDB儲存引擎用的多了!

嗯,大家肯定在想,難道沒有面試官問你事務相關的嘛,No,幾乎每個面試官都會問,事務是什麼東西,那麼我們首先要了解到的是,事務是併發控制的單位,是使用者定義的一個操作序列,要麼全做,要麼不做,是一個不可分割的(通俗的理解,事務是一組原子操作單元,從資料庫角度說,就是一組SQL指令,要麼全部執行成功,若因為某個原因其中一條指令執行有錯誤,則撤銷先前執行過的所有指令),主要是為了保證資料的完整性!好了,那麼事務的特點呢,原子性、一致性、隔離性、永續性!(如果你想回答的更好那麼把各個解釋下吧:事務的原子性表示事務執行過程中的任何失敗都將導致事務所做的任何修改失效。一致性表示當事務執行失敗時,所有被該事務影響的資料都應該恢復到事務執行前的狀態。隔離性表示在事務執行過程中對資料的修改,在事務提交之前對其他事務不可見。永續性表示已提交的資料在事務執行失敗時,資料的狀態都應該正確)那麼說了那麼多,為什麼需要事務呢?之前就說過,為了保證資料的完整性,對的,事務就是為解決資料安全操作提出的,事務控制實際上就是控制資料的安全訪問。OK,那麼我們就要知道Java事務的型別有三種:JDBC事務、JTA(Java Transaction API)事務、容器事務。好了,那麼我們平時一般怎麼處理事務呢?spring的事務是通過“宣告式事務”的方式對事務進行管理,即在配置檔案中進行宣告,通過AOP將事務切面切入程式,最大的好處是大大減少了程式碼量,提高了工作效率。

7、sql之left join、right join、inner join

答:說句實在話,自從辭職讀研以來很久沒有用過sql語句了,關於這幾個連線光靠記憶的話,完全會是懵逼,幸虧自己還不算蠢,很自然的根據字面理解,我很好的回答了出來,left join就是返回包括左表中所有記錄和右表中聯結欄位相等的記錄,好了面試官會問你,那麼如果A表中,有甲丙丁3條記錄,B表中有甲乙丙丁4條記錄,那麼如果條件都滿足的情況,A left join B 丙記錄是否會被查出,答案是否定的!好了,right join就是和left join 相反的,inner join等值聯結 只返回2表中聯結欄位相等的行!

8、sql優化

答:關於這個問題,我一直屬於茫然狀態,我不知道什麼叫優化,不知道怎麼樣才算優化,記得第一次被問到的時候是在EMC的時候,當時我記得學資料庫那會老師總會說盡量少的用的select *,儘量少用 distinct、group之類的命令,於是我就把這些說了上來,很顯然,這不是面試官要的結果!哈哈,我就接著扯到寫java程式碼的時候,我依稀記得preparedStatement可以快取sql語句,下一次執行相同語句不需要再次解析,於是我就答了去,但可惜還是不是面試老大要的結果,之後經提醒,才撥亂反正,意識到索引這玩意,對啊,索引(DB中的索引是某個表中一列或多列值的集合和相應的指向表中物理標識這些值的資料頁的邏輯指標)啊,主鍵(聚集索引)啊:一方面,建立索引提高查詢速度;另一方面,把所有需提高查詢速度的欄位都加入聚集索引。最後啊,在sql中,儘量多的使用commit!

最後,這幾天問的大概要代表性的問題都在這裡吧,至於好多公司直接沒怎麼問java知識,直接給我問專案經驗,一坨坨的論調,繼續嘛,還有公司問到了OSI七層模型,讓我把每層模型說出來,還有問我OS記憶體管理如何管理來的,這些我就不一一列舉了,今天回憶起這些問題,一個方面,自己做個總結,另一個方面,大家一起共勉。。。

2017年2月20日21:28:09總結 by小仇哥