面試題記錄

----classloader工作原理,class加載層次。

JVM---------------Java Virtual Machine,Java虛擬機,是運行Java程序的平臺,不同的操作系統有不同的實現。

classloader---類加載器,完成將編譯後的class文件加載到JVM中,是JVM的一個重要組件。

Class — Java類型定義文件,定義的數據與相應操作方法,可被classloader加載到JVM上根據它產生相應的運行實例,並可以調用相應的方法。

首先大家要知道爲什麼要有classloader,它是做什麼的?

而在Java這個平臺要運行什麼本身是動態未知的,我們寫的Java程序都是在需要的時候被動態的加載上去的。Java本身提供了一套類加載機器。總的來說,所有裝在Java虛擬機上運行的類都是由classloader這個東西來完成的。

子類加載器需要加載某個類時,並不是直接加載,而是首先查看cache(cache可以理解爲對已經在此加載過的類的記錄),如果沒有,則向parent提出請求,查看是否存在於parent的cache中。如此往上,直到根部的bootstrap classloader.  如果bootstrapclass loader的cache沒有這個類,那麼他開始嘗試加載它,若成功加載,則傳遞這個成功加載的類到最底層的user-defined class loader(表現形式爲一個對應的Class類的instance實例),若無法加載這個類,那麼它又會委派他的child加載器去嘗試加載。

Java使用classloader原因,除了可以達到動態性之外,其實最重要的原因還有安全性,體現在下面兩點:

    1.核心的類不可能被仿照(這主要是因爲先parent委託機制的作用),比如我們不可能加載一個自己寫的放在classpath下的java.lang.String類,因爲Java總是parent優先,在系統目錄下面的String類總是被優先加載。

    2.我們可以指定,控制到特定的載入點,不會誤用,比如我只要加載目錄的ABC下面的類。----map安全實現:
synchronized修飾。
concurrent.locks.Lock:lock.lock();lock.unlock();
concurrentHashMap。

----ejb的entityBean爲什麼可以實現與數據庫的映射,交付?

----spring3.0的新特性:例如 註解;

-----數據庫存儲過程和存儲方法的不同?

區別是寫法和調用上。

寫法上:存儲過程的參數列表可以有輸入參數、輸出參數、可輸入輸出的參數;

            函數的參數列表只有輸入參數,並且有return <返回值類型,無長度說明>。

返回值上:

    存儲過程的返回值,可以有多個值,

           函數的返回值,只有一個值。

調用方式上:

    存儲過程的調用方式有:

1)、exec <過程名>;

2)、execute <過程名>;

3)、在PL/SQL語句塊中直接調用。

            函數的調用方式有:

      在PL/SQL語句塊中直接調用。

                          sql調用表示法

----apache:


----get和post方法,爲什麼get的參數比post的少。


----localThread的使用場景。

ThreadLocal爲解決多線程程序的併發問題提供了一種新的思路。使用這個工具類可以很簡潔地編寫出優美的多線程程序。ThreadLocal並不是一個Thread,而是Thread的局部變量.

ThreadLocal是如何做到爲每一個線程維護變量的副本的呢?其實實現的思路很簡單:在ThreadLocal類中定義了一個ThreadLocalMap

(Thread t = Thread.currentThread();        ThreadLocalMap map = getMap(t);)

,每一個線程都可以獲取相應的ThreadLocalMap,通過該Map,可以設置或者獲取響應ThreadLocal的值。這樣可以保證每個線程都有自己的Map存放變量避免共享。

ThreadLocal是解決線程安全問題一個很好的思路,它通過爲每個線程提供一個獨立的變量副本解決了變量併發訪問的衝突問題。在很多情況下,ThreadLocal比直接使用synchronized同步機制解決線程安全問題更簡單,更方便,且結果程序擁有更高的併發性。

同步機制採用了“以時間換空間”的方式,而ThreadLocal採用了“以空間換時間”的方式。前者僅提供一份變量,讓不同的線程排隊訪問,而後者爲每一個線程都提供了一份變量,因此可以同時訪問而互不影響。

----utp和tcp的不同。


----get方法裏,處理一個請求10s,在這10s內另一個請求到達,get方法會怎樣處理?


----SSH基本原理,springMVC的實現。


----瞭解nosql。


----實現線程同步的方法

同步有兩種方法實現,一種是利用synchronized標示,另外一種是加鎖。生成鎖的對象的方法是:privatestatic Lock lock = newReentrantLock();Lock是一個接口,而Reentrantlock是一個實現的類。構造方法有:ReentrantLock()和ReentrantLock(fair:boolean)兩種。其中第二種傳遞的是一個boolean值的參數,當設置爲true時系統會按照等待的先後時間讓線程活得鎖,但是效率和性能不如默認值的好,但是同時也可以避免資源匱乏。synchronized可以聲明方法,也可以用來標記某段代碼。用來標記某段代碼時的用法是:synchronized(){}。

----用什麼關鍵字修飾同步方法 ? synchronized關鍵字修飾同步方法

----同步有幾種實現方法,都是什麼?分別是synchronized,waitnotify

----同步的實現方式有兩種,同步方法和同步塊,這兩種方式都要用到synchronized關鍵字。

----Servlet生命週期

Servlet生命週期分爲三個階段:

  1,初始化階段  調用init()方法

  2,響應客戶請求階段  調用service()方法

  3,終止階段  調用destroy()方法

Servlet初始化階段:

  在下列時刻Servlet容器裝載Servlet:

    1,Servlet容器啓動時自動裝載某些Servlet,實現它只需要在web.XML文件中的<Servlet></Servlet>之間添加如下代碼:

<loadon-startup>1</loadon-startup>

    2,在Servlet容器啓動後,客戶首次向Servlet發送請求

    3,Servlet類文件被更新後,重新裝載Servlet

  Servlet被裝載後,Servlet容器創建一個Servlet實例並且調用Servlet的init()方法進行初始化。在Servlet的整個生命週期內,init()方法只被調用一次。

----基本類型及其包裝類(Integer之類)和String作爲參數都是屬於值傳遞,不會改變其值。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章