天天看點

Java經典面試題整理及答案詳解(一)

了解更多: Java經典面試題整理及答案詳解(二) Java經典面試題整理及答案詳解(三) Java在程式設計語言中,占據着重要的地位,随着技術的更新與發展,越來越多的人進入網際網路行業、踏上Java程式設計之旅。本系列内容來源于阿裡雲大學Java面試技巧,面試真題+理論解析,主要針對Java程式設計應用領域就業的人群,找工作前看一看,希望該系列面試真題能助您一臂之力~

1.說一下java類集

  • 類集是java實作的資料結構應用,如果隻是使用,那麼類集的操作非常簡單,因為類集的核心接口有List,Set、Map、Iterator、Enumeration;
  • List子接口:是可以根據索引号取得内容,而在list集合裡最容易問到的問題:ArrayList(包裝了數組的集合,比較常用,數組是可變的)、LinkedList(連結清單的實作,搜尋資料的時間複雜度為:n) 差別;
  • Set子接口:排序子類、HashSet與hashCode()和equals的關系;

    — Hashset:重複的判斷依靠的是hashcode()和equals(),但是它是無序的

— TreeSet:是有序的,依靠的是Comparable排序

— LinkedHashSet:繼承了HashSet的特點,但是屬于有序(增加順序為儲存順序)

  • Map接口:Map.Entry、Iterator輸出、HashMap、WeakHashMap(弱引用)。

    如果隻回答這一個問題,按以上幾點說,這道題基本上就可以拿下,但也有可能追問其他的問題,例如:可能要求你現場編寫一個連結清單,或者編寫一個二叉樹。這時候就要熟悉連結清單與二叉樹的資料結構。

2、字元串哈西相等,equals相等嗎?反過來呢?

凡是這類問相不相等的,寫個程式測試是比較友善的辦法。

範例:首先觀察直接指派

*提到字元串,首先就要想到共享資料詞,共享常量詞

Java經典面試題整理及答案詳解(一)
Java經典面試題整理及答案詳解(一)

範例:采用構造法

Java經典面試題整理及答案詳解(一)
Java經典面試題整理及答案詳解(一)

範例:字元串

Java經典面試題整理及答案詳解(一)
Java經典面試題整理及答案詳解(一)

總結:從正常道理來講,如果hashCode()相等,equals不一定相等。反過來equals相等,那麼hashCode()一定相等。

3、Spring的工作原理,控制反轉是怎麼實作的?自己寫過濾器過濾編碼怎麼實作?

  • Spring的核心組成:IOC&DI(工廠設計)、AOP(代理設計、動态代理設計);

    -Spring之中針對于XML的解析處理采用的是DOM4J的實作;

-Anntation的時候必須要求有一個容器;

  • 對于編碼過濾需要考慮兩種情況:

    -Struts1.x、SpringMVC、JSP+Servlet:都可以以直接通過過濾器完成;

-Struts2.x:必須通過攔截器完成;

-實作:考慮到可擴充性的配置,是以在配置檔案裡面設定編碼,在程式運作的時候動态取得設定的編碼進行操作。但是需要設定兩個操作:請求編碼、回應編碼。

4、架構的源碼有沒有看過?

  • 不要回答沒有,即使你真的沒有,你也别回答沒有看過;
  • 架構的核心思想:反射+XML(Annotation)

    -Struts2.X的設計:請求交由過濾器執行,而後過濾器交給控制器完成,後面由于将跳轉路徑等資訊都寫在了配置檔案或知識Annoration裡面,是以還需要進行這部分内容的加載;

-SpringMVC:它是基于方法的請求處理,所有的參數都送出到方法上,本質上還是一個DispatcherServlet;

-Hibernate:就是反射和DOM4J解析處理流程。

5、動态代理是怎麼實作的?

  • 直接使用Invocation Handler接口進行實作,同時利用Proxy類設定動态請求對象;
  • 使用CGLIB來避免對于“代理設計模式需要使用接口實作”的限制。

6、action是單執行個體還是多執行個體?

  • Struts 2.x和Spring MVC中的Action都是多執行個體;
  • Struts 1.x的Action是單執行個體;
  • Struts 2.x和Spring MVC是否單執行個體可以控制,隻要交由Spring管理的Action類,都可以通過“@scope=“prototype””來進行控制。

7、怎麼配置bean?

這樣的配置主要是在Spring裡面,重點隻有xml和annotation的掃描負責:

  • xml中直接使用"bean",這樣在Spring容器啟動的時候就可以通過容器進行初始化;
  • annotation必須設定context命名空間,而後進行掃描包的配置。

8、修改單執行個體多執行個體.

“@scope=“prototype””來進行控制。

9.Java的設計模式

工廠設計模式、代理設計模式、單例設計模式、合成設計模式、門面設計模式(JDBC)、裝飾設計模式、模版設計模式。

10.事務的控制

  • MySQL資料庫如果想要使用事務,必須使用“type=innodb”這個資料引擎;
  • 事務的核心控制:commit、rollback;
  • 在Spring裡面,利用AspectJ可以設定AOP的切面,而後進行聲明式事務控制。

11. 髒讀、幻讀、不可重複讀

  • 髒讀:髒讀就是指當一個事務正在通路資料,并且對資料進行了修改,而這種修改還沒有送出到資料庫中,這時,另外一個事務也通路這個資料,然後使用了這個資料。
  • 幻讀:是指當事務不是獨立執行時發生的一種現象,例如第一個事務對一個表中的資料進行了修改,這種修改涉及到表中的全部資料行。同時,第二個事務也修改這個表中的資料,這種修改是向表中插入一行新的資料。那麼,以後就會發生操作第一個事務的使用者發現表中還有沒有修改的資料行,就好像發生了幻覺一樣。
  • 不可重複讀:是指在一個事務内,多次讀同一資料。在這個事務還沒有結束時,另外一個事務也通路該同一資料。那麼,在第一個事務中的兩次讀資料之間,由于第二個事務的修改,第一個事務兩次讀到的資料可能是不一樣的,這樣就發生了在一個事務内兩次讀到的事務是不一樣的,是以成為不可重複讀。

12 .事務的傳播屬性

在Transaction Definition接口中定義了七個事務傳播行為:

  • PROPAGATION REQUIRED:如果存在一個事務,則支援目前事務,如果沒有事務則開啟一個新的事務;
  • PROPAGATION SUPPORTS:如果存在一個事務,支援目前事務,如果沒有事務則非事務的執行,但是對于事務同步的事務管理器,PROPAGATION SUPPORTS與不使用事務有少許不同;
  • PROPAGATION MANDATORY:如果已經存在一個事務,支援目前事務,如果沒有一個活動的事務,則抛出異常;
  • PROPAGATION REQUIRES NEW:總是開啟一個新的事務,如果一個事務已經存在,則将這個存在的事務挂起;
  • PROPAGATION_NOT_SUPPORTED:總是非事務地執行,并挂起任何存在的事務;
  • PROPAGATION_NEVER:總是非事務地執行,如果存在一個活動事務,則抛出異常;
  • PROPAGATION NESTED:如果一個活動的事務存在,則運作在一個嵌套的事務中,如果沒有活動事務,則按Transaction Definition.PROPAGATION_REQUIRED屬性執行。

13.購物車是怎麼實作的?

購物車的實作基于:

  • Session:浏覽器關閉後消失;
  • Cookie:資料儲存在本地,如果切換到手機上無效;
  • 資料庫:可以在不同的終端上持續操作。

    你的實作:Ajax處理操作,處理購物車的應用,考慮到使用者如果多的情況,并且通路量頻繁,要單獨設計一個購物車的子系統子產品。

14.統計一天的訂單量

  • 如果一天的訂單預估才1W條,随便你折騰;
  • 絕對不可能使用COUNT()和WHERE;

    分時統計,如果系統統計到位,可以單獨配置一個檔案進行計數(需要考慮同步,一同步就慢),不應該出現在搶購環節中。

15.IN HAVING exsit

IN是判斷具體的幾項資料:

HAVING是針對于分組後的資料的篩選,依然要使用統計函數處理;

EXISTS:隻是需要判斷子查詢裡面是否有資料。

16.有沒有用過定時任務?

Java本身提供有定時任務:Time Task、Timer;但是此類操作對于定時很難完成,它隻能夠做頻率,但是這個頻率不準,是以在定時開發之中會使用quartz元件,而且spring裡面也提供有自己的定時實作,這個實作的好處是可以在準确的時間上進行觸發。

17.JVM的記憶體管理

記憶體分為:棧(java虛拟機棧)、堆、程式計數器(類似于寄存器)、方法區、本地方法棧。

垃圾處理操作指的是堆記憶體:年輕代、老年代、永生代(JDK1.8移除)。會直接牽扯到JVM的記憶體調優問題。

推薦《深入java虛拟機》

18.堆記憶體、棧記憶體溢出

棧溢出:棧幀,所有的方法調用都是通過棧幀的形式控制的。棧如果儲存的資料過多,那麼就會産生記憶體溢出,如果堆記憶體中産生的資料量過大,那麼就有可能出現“OutOfMemoryError”錯誤。

19.說一下緩存

緩存的主要目的是提高查詢的效率,常見的兩種緩存元件:EhCache(用于資料庫)、OSCache(用于頁面),除了這樣的操作之外,還有緩存的資料庫:redis、memcached,其中redis可以将資料儲存到磁盤上,并且支援的資料類型要多于memcached。這種redis的資料庫每秒并發的通路量可以達到15W次。

20.統計所有重名使用者

還是需要考慮資料量問題,如果資料量大,考慮使用位圖索引,如果資料量小就直接分組統計即可。

更多專業知識,面試技巧就在阿裡雲開發者社群,持續更新中……

感謝浏覽~

本内容來源于

阿裡雲大學-Java面試技巧