高薪直通車丨 JavaEE面試經驗分享(中**運軟件)

筆試題: 無

面試總結:

1: 談談你對 ajax 的認識?

Ajax 是一種創建交互式網頁應用的的網頁開發技術; Asynchronous JavaScript and XML”的縮寫。

Ajax 的優勢:通過異步模式,提升了用戶體驗。優化了瀏覽器和服務器之間的傳輸,減少不必要的數據往返,減少了帶寬佔用。Ajax 引擎在客戶端運行,承擔了一部分本來由服務器承擔的工作,從而減少了大用戶量下的服務器負載。

Ajax 的最大特點:可以實現局部刷新,在不更新整個頁面的前提下維護數據,提升用戶體驗度。

2: 說一下常用的 Linux 命令 ?

列出文件列表: ls 【參數 -a -l】

創建目錄和移除目錄: mkdir rmdir

用於顯示文件後幾行內容: tail

打包: tar -xvf

打包並壓縮: tar -zcvf

查找字符串: grep

顯示當前所在目錄: pwd

創建空文件: touch

編輯器: vim vi

列出文件列表: ls 【參數 -a -l】

創建目錄和移除目錄: mkdir rmdir

用於顯示文件後幾行內容: tail

打包: tar -xvf

打包並壓縮: tar -zcvf

查找字符串: grep

顯示當前所在目錄: pwd

創建空文件: touch

編輯器: vim vi

3: 線程局部變量 ThreadLocal ?

l ThreadLocal 的作用和目的:用於實現線程內的數據共享,即對於相同的程序代碼,多個模塊在同一個線程中運行時要共享一份數據,而在另外線程中運行時又共享另外一份數據。

l 每個線程調用全局 ThreadLocal 對象的 set 方法,在 set 方法中,首先根據當前線程獲取當前線程的ThreadLocalMap 對象,然後往這個 map 中插入一條記錄, key 其實是 ThreadLocal 對象, value 是各自的 set方法傳進去的值。也就是每個線程其實都有一份自己獨享的 ThreadLocalMap 對象,該對象的 Key 是 ThreadLocal對象,值是用戶設置的具體值。在線程結束時可以調用 ThreadLocal.remove()方法,這樣會更快釋放內存,不調用也可以,因爲線程結束後也可以自動釋放相關的 ThreadLocal 變量。ThreadLocal 的應用場景:

➢ 訂單處理包含一系列操作:減少庫存量、增加一條流水臺賬、修改總賬,這幾個操作要在同一個事務中完成,通常也即同一個線程中進行處理,如果累加公司應收款的操作失敗了,則應該把前面的操作回滾,否則,提交所有操作,這要求這些操作使用相同的數據庫連接對象,而這些操作的代碼分別位於不同的模塊類中。

➢ 銀行轉賬包含一系列操作: 把轉出帳戶的餘額減少,把轉入帳戶的餘額增加,這兩個操作要在同一個事務中完成,它們必須使用相同的數據庫連接對象,轉入和轉出操作的代碼分別是兩個不同的帳戶對象的方法。

➢ 例如 Strut2 的 ActionContext,同一段代碼被不同的線程調用運行時,該代碼操作的數據是每個線程各自的狀態和數據,對於不同的線程來說, getContext 方法拿到的對象都不相同,對同一個線程來說,不管調用 getContext 方法多少次和在哪個模塊中getContext 方法,拿到的都是同一個.

4: 動靜態代理的區別,什麼場景使用?

靜態代理通常只代理一個類,動態代理是代理一個接口下的多個實現類。

靜態代理事先知道要代理的是什麼,而動態代理不知道要代理什麼東西,只有在運行時才知道。

動態代理是實現 JDK 裏的 InvocationHandler 接口的 invoke 方法,但注意的是代理的是接口,也就是你的業務類必須要實現接口,通過 Proxy 裏的 newProxyInstance 得到代理對象。

還有一種動態代理 CGLIB,代理的是類,不需要業務類繼承接口,通過派生的子類來實現代理。通過在運行時,動態修改字節碼達到修改類的目的。

AOP 編程就是基於動態代理實現的,比如著名的 Spring 框架、 Hibernate 框架等等都是動態代理的使用例子。

5: 你所知道的設計模式有哪些 ?

1. Java 中一般認爲有 23 種設計模式,我們不需要所有的都會,但是其中常用的幾種設計模式應該去掌握。下面列出了所有的設計模式。需要掌握的設計模式我單獨列出來了,當然能掌握的越多越好。總體來說設計模式分爲三大類:

創建型模式,共五種: 工廠方法模式、 抽象工廠模式、 單例模式、 建造者模式、原型模式。

結構型模式,共七種: 適配器模式、裝飾器模式、 代理模式、外觀模式、橋接模式、組合模式、 享元模式 。

行爲型模式,共十一種: 策略模式、模板方法模式、 觀察者模式、迭代子模式、責任鏈模式、命令模式、備忘錄模式、狀態模式、訪問者模式、中介者模式、解釋器模式。

6: 類什麼時候被初始化?

1)創建類的實例,也就是 new 一個對象

2)訪問某個類或接口的靜態變量,或者對該靜態變量賦值

3)調用類的靜態方法

4)反射(Class.forName("com.lyj.load"))

5)初始化一個類的子類(會首先初始化子類的父類)

6) JVM 啓動時標明的啓動類,即文件名和類名相同的那個類

只有這 6 中情況纔會導致類的類的初始化。

類的初始化步驟:

1)如果這個類還沒有被加載和鏈接,那先進行加載和鏈接

2)假如這個類存在直接父類,並且這個類還沒有被初始化(注意:在一個類加載器中,類只能初始化一次),那就初始化直接的父類(不適用於接口)

3)加入類中存在初始化語句(如 static 變量和 static 塊),那就依次執行這些初始化語句 .

7: 談談你對 Spring 的理解 ?

Spring 是一個開源框架,爲簡化企業級應用開發而生。 Spring 可以是使簡單的 JavaBean 實現以前只有 EJB 才能實現的功能。 Spring 是一個 IOC 和 AOP 容器框架。

Spring 容器的主要核心是:

控制反轉(IOC),傳統的 java 開發模式中,當需要一個對象時,我們會自己使用 new 或者 getInstance 等直接或者間接調用構造方法創建一個對象。而在 spring 開發模式中, spring 容器使用了工廠模式爲我們創建了所需要的對象,不需要我們自己創建了,直接調用 spring 提供的對象就可以了,這是控制反轉的思想。

依賴注入(DI), spring 使用 javaBean 對象的 set 方法或者帶參數的構造方法爲我們在創建所需對象時將其屬性自動設置所需要的值的過程,就是依賴注入的思想。

面向切面編程(AOP),在面向對象編程(oop)思想中,我們將事物縱向抽成一個個的對象。而在面向切面編程中,我們將一個個的對象某些類似的方面橫向抽成一個切面,對這個切面進行一些如權限控制、事物管理,記錄日誌等公用操作處理的過程就是面向切面編程的思想。 AOP 底層是動態代理,如果是接口採用 JDK 動態代理,如果是類採用CGLIB 方式實現動態代理。

相關文章