1. 程式人生 > >Java後端面試總結

Java後端面試總結

前序

今天去面了幾家公司,主要是Java後端的,有個公司問的東西真的是蠻多的,這裡記錄一下印象深一點的問題吧。

Java基礎

  1. int、byte、char各佔幾個位?
    注意這裡說的不是位元組,問的是bit位。
    我當時就說int 4個位元組,byte 1個位元組,char 2個位元組。
    每個位元組又是8位,各再乘以8就好了。結果那面試官居然還說1個位元組是4位,當時我都懵了。回來查查資料發現,我才是對的。1個位元組就是8位。。。

  2. 一個Map集合是否有方法可以直接取出所有的value,也就是說不通過keySet()entrySet()等間接的方式?
    我當時說沒有,他就給我舉出一個方法了,values()

    。。。事實證明確實是有這個方法的,只不過我們一般用的很少。

  3. 設計模式,單例手寫就不多說了,太簡單。

  4. 一個List集合如何不再新增重複的元素進去?
    在新增的時候,通過if(!lsit.contains())進行判斷就行了,結果引出新的問題,是如何判斷兩個物件是相同的?我接著說重寫類的equals()hashCode()方法即可,因為其底層就是通過equals()進行比較的。
    然後接著問,重寫equals()方法,為什麼還要重寫hashCode()方法呢?我就直接說Java官方規定的。。其實這個也是一個約定的事情,可以檢視Object類中的javadoc文件說明。

    Note that it is generally necessary to override the hashCode method whenever this method is overridden, so as to maintain the general contract for the hashCode method, which states that equal objects must have equal hash codes.

在重寫equals()時也必須要重寫hashCode()方法,以保證相同物件的hash值也是一樣的,否則會出現意想不到的問題的。不明白他為啥要一直追問這個,哎。最後網上在搜了一下資料,說是:
如果我們對一個物件重寫了euqals,意思是隻要物件的成員變數值都相等那麼euqals就等於true,但不重寫hashcode,那麼我們再new一個新的物件,
當原物件.equals(新物件)等於true時,兩者的hashcode卻是不一樣的,由此將產生了理解的不一致,如在儲存雜湊集合時(如Set類),將會儲存了兩個值一樣的物件,
導致混淆,因此,就也需要重寫hashcode()

Java基礎就到這裡吧,當然還問其他很多基礎問題,不過在這裡就不一一說明了。

Java後端框架

因為我說自己用SpringMVC比較多,所以他們問的問題也大都跟這個相關,當然也會結合簡歷問一些其他方面的問題,下面再說一說。

  1. SpringMVC有哪些常用註解?
    比較常用的有:@Controller、@Service、@Repository、@Bean、@RequestMapping,@Autowired、@Resouce、@ResponseBody、@RequestBody等等還有很多,這裡就不一一列舉了。

  2. 如何獲取在@RequestMapping註解中定義的變數?
    這個在RESTFul風格中比較常見,在方法的引數中再加@PathVariable(“var”)引數即可。

  3. 如何在Controller中獲取request請求的變數,非RESTFul那種拼接的引數?
    可以直接在方法引數中,新增HttpServletRequest引數變數就行,然後根據req的getParameter(“var”)獲取相應的引數。

  4. 在SpringMVC中如何通過工廠方法來建立一個bean?
    這個用的好像比較少,不過我當時還真想起來了。直接在sprign配置檔案中的bean中就有一個屬性叫:factory-method

  5. 在使用Hibernate框架時,除了HQL還有什麼方式可以查詢資料?
    這個我當時說的是Criteria,這個單詞不太好讀,我當時也沒讀正確讀全,不過大家都知道是啥意思就好啦。它是採用面向物件的方式封裝了查詢條件。其實還可以直接用Hibernate的session的,當時緊張所以忘了。為啥緊張是因為我瞎說了一個JPA。。通過jpa去操作查詢,結果就是被教訓一頓了,JPA是Java的持久化規範沒錯,不過跟人家Hibernate真沒太大關係,雖然Hibernate也實現了JPA的規範。。。

  6. struts2與struts1有什麼區別?
    額,struts框架我在專案中還真沒用過,也就自己學了點,結果就大搖大擺的也加在簡歷上,結果一問就露餡了吧。後悔,以後不太熟的東西最好不要加在簡歷上吧,不然就等著減分吧。至於到底有哪些區別,在網上查一查一大堆,這裡就不多說了。

好了,後面的框架知識問得我也是淚流滿面,就不多說了。

資料庫

資料庫可以說在後端中是重之又重了,可惜我還沒有達到熟練精通的地步,也就初學者一個吧,結果幾個問題下來直接就over了。。
1. 資料庫一般有哪些優化?
我當時說的是給表字段加索引、拆分表、避免少用子查詢多用連線查詢等等常見的操作吧。
2. 如何優化一條SQL語句,有什麼關鍵字可以用?
當時我就想到explain這個,應該算是正確的吧。
3. 常用的日期欄位有哪些?
一般常用的就datetimetimestamp這兩種吧。
4. 如何給查詢出來的日期進行加一天操作?
額,這個我忘記了,記得有一個函式的,當時沒想起來。查了查就是叫date_add(),把查詢出來的日期結果放到函式的引數中就行了。
date_add(my_date, INTERVAL 1 day)

資料庫相關的還有待加強啊,繼續努力。

Linux

作為Java後端開發,Linux可以說是必須要掌握的吧,畢竟開發的軟體都是要執行在伺服器上的,現在伺服器差不多80-90%都是Linux作業系統了,所以簡歷上肯定也是要寫這方面的東西的。

  1. 如何在重啟開機的時候自動將應用容器如:tomcat啟動?
    直接編輯/etc/rc.local檔案,在最後一行exit 0前面加一句${TOMCAT_HOME}/bin/startup.sh就行了,TOMCAT_HOME變數可替換為安裝的路徑,當然了,如果是直接通過apt-get安裝的話,它會自動新增到systemd中的,這樣的話通過# systemctl enable tomcat7也可以做到開機自動啟動的。

差不多就到這裡吧,太多就不想看了。
最後一個問題就是:最近有沒有研究什麼比較新的技術?
我當時說的是Docker,其實這個也不算新吧,2013年的時候就非常火了,不過那時候連大廠都還只是停留在研究狀態,別說直接在生產環境使用了,技術也還沒穩定下來。隨著這兩年過來,逐漸的用的公司才多一點的。我也是在去年就開始學習那個。今年一直也沒怎麼搞,看樣子需要再撿起來了。

總結

這次面試,可以說是我經歷過所有面試中,問的最多,最全面的了。對人員的綜合要求挺高的,面試官總的來說也很nice。通過這次面試我也發現了自己嚴重的不足。許多的知識都還停留在非常表面的層次,沒有一點稍微深入的地方。這也是沒辦法的事情啊,誰讓咱本來就是半路出家,而且還是搞Android出身。。積累啊積累,萬里長征路漫漫。