Java 面試題 本身寫的答案

基本概念javascript

 

  • 操做系統中 heap 和 stack 的區別
    棧(stack)與堆(heap)都是Java用來在內存中存放數據的地方。
    與C++不一樣,Java自動管理棧和堆,程序員不能直接地設置棧或堆。
    在函數中定義的一些基本類型的變量和對象的引用變量都在函數的棧內存中分配。
    當在一段代碼塊定義一個變量時,Java就在棧中爲這個變量分配內存空間,當超過變量的做用域後,Java會自動釋放掉爲該變量所分配的內存空間,該內存空間能夠當即被另做他用。
    堆內存用來存放由new建立的對象和數組,
    在堆中分配的內存,由Java虛擬機的自動垃圾回收器來管理。
    在堆中產生了一個數組或對象後,還能夠在棧中定義一個特殊的變量,讓棧中這個變量的取值等於數組或對象在堆內存中的首地址,棧中的這個變量就成了數組或對象的引用變量。
    引用變量就至關因而爲數組或對象起的一個名稱,之後就能夠在程序中使用棧中的引用變量來訪問堆中的數組或對象。
    Java中變量在內存中的分配: 
      一、類變量(static修飾的變量):在程序加載時系統就爲它在堆中開闢了內存,堆中的內存地址存放於棧以便於高速訪問。靜態變量的生命週期–一直持續到整個」系統」關閉。 
      二、實例變量:當你使用java關鍵字new的時候,系統在堆中開闢並不必定是連續的空間分配給變量(好比說類實例),而後根據零散的堆內存地址,經過哈希算法換算爲一長串數字以表徵這個變量在堆中的」物理位置」。
       實例變量的生命週期–當實例變量的引用丟失後,將被GC(垃圾回收器)列入可回收「名單」中,但並非立刻就釋放堆中內存。 
      三、局部變量:局部變量,由聲明在某方法,或某代碼段裏(好比for循環),執行到它的時候在棧中開闢內存,當局部變量一但脫離做用域,內存當即釋放。 
       詳細請看:http://www.javashuo.com/article/p-bvgdhxuz-eh.html

 

  • 什麼是基於註解的切面實現
    首先解釋下AOP :在程序運行時,動態的將代碼切入到類的指定方法、指定位置上的編程思想就是面向切面編程
    基於註解的切面實現目前有兩種方式 spring xml配置方式 spring boot集成方式
    面試時答:在spring.xml裏面開啓掃描bean component-scan跟開啓aop註解aspectj-autoproxy
    
    spring xml配置方式:
    在spring.xml文件中聲明
    <context:component-scan base-package="demo.spring"/>使用@Component自動發佈bean,須要配置這個元素
    <aop:aspectj-autoproxy /> 使用@AspectJ及其它AOP註解須要配置,不然沒法使用註解;@AspectJ註解,將@Component自動發佈出來的"interceptor" bean轉換爲一個aspectj切面,而@Pointcut、@Before、@After、@Around等註解,功能與在xml文件中配置是同樣的
    
      註解只能使用在能活的源碼的場景,若是不能獲取源碼,則只能經過xml配置的形式,將制定的對象配置成攔截器,對指定目標進行攔截;所以,經過xml文件配置,而不是註解,是更加通用的方式。
    
    詳細請看:http://www.javashuo.com/article/p-atxrazhm-er.html

     

  • 什麼是 對象/關係 映射集成模塊
    所謂對象關係映射(Object Relational Mapping,簡稱ORM)是經過使用描述對象和數據庫之間映射的元數據,將面嚮對象語言程序中的對象自動持久化到關係數據庫中。本質上就是將數據從一種形式轉換到另一種形式。
    詳細一點,是 面向對象編程中的 對象(Object)
    和關係數據庫的 關係(Relation)  
    的一個映射(Mapping)。
    面試的時候一句話:
    對象關係映射是 在關係型數據庫和業務實體對象之間作一個映射,這樣,在具體的操做業務對象的時候,就不須要再去和複雜的SQL語句打交道了,只要像平時操做對象同樣就能夠了
    詳細請看:http://www.javashuo.com/article/p-bdaktdwr-ey.html

     

  • 什麼是 Java 的反射機制
    Java 反射機制是在運行狀態中,對於任意一個類,都可以得到這個類的全部屬性和方法,對於任意一個對象都可以調用它的任意一個屬性和方法。這種在運行時動態的獲取信息以及動態調用對象的方法的功能稱爲Java 的反射機制。
    面試的時候一句話
    java反射機制在運行的時候能夠經過反射機制得到任意一個類的全部屬性跟方法,也能夠調用它的屬性跟方法.
    想再得到點分數 能夠接着說
    Spring 中的 IOC 的底層實現原理就是反射機制,Spring 的容器會幫咱們建立實例,該容器中使用的方法就是反射,經過解析xml文件,獲取到id屬性和class屬性裏面的內容,利用反射原理建立配置文件裏類的實例對象,存入到Spring的bean容器中。
    詳細請看:http://www.javashuo.com/article/p-nmtcgtev-ge.html

     

  • 什麼是 ACID
    事務(Transaction)是由一系列對系統中數據進行訪問與更新的操做所組成的一個程序 執行邏輯單元(Unit)。
    狹義上的事務特指數據庫事務。一方面,當多個應用程序併發訪問數據庫時,事務能夠在這些應用程序之間提供一個隔離方法,以防止彼此的操做互相干擾。
    另外一方面,事務爲數據庫操做序列提供了一個從失敗中恢復到正常狀態的方法, 同時提供了數據庫即便在異常狀態下仍能保持數據一致性的方法。
    事務具備四個特徵,分別足原子性(Atomicity )、一致性(Consistency )、隔離性(Isolation) 和持久性(Durability),簡稱爲事務的ACID特性。
    詳細請看:http://www.javashuo.com/article/p-vusgxext-et.html

     

  • BS與CS的聯繫與區別
    bs是瀏覽器(browser)和服務器(server) 
    cs是靜態客戶端程序(client)和服務器(server)
    區別在於,雖然一樣是經過一個程序鏈接到服務器進行網絡通信,可是bs結構的,客戶端運行在瀏覽器裏,好比你看百度,就是經過瀏覽器.還有一些bs結構的應用,好比中國電信,以及一些電子商務平臺.
    用bs結構的好處是,沒必要專門開發一個客戶端界面,可用asp,php,jsp等比較快速開發web應用的程序開發. cs結構的,要作一個客戶端.網絡遊戲基本上大可能是cs結構,好比你玩傳奇,要專門開個傳奇程序;玩冒險島,要專門開個冒險島...... cs結構的優勢是能夠定作不少外觀,能夠作不少安全措施,能夠補充瀏覽器沒有的功能.缺點是開發速度比較慢,一個功能比較完善的客戶端比較難作.
    詳細請看:http://www.cnblogs.com/songanwei/p/9387641.html
     

     

  • Cookie 和 Session的區別

    一、cookie數據存放在客戶的瀏覽器上,session數據放在服務器上。php

    二、cookie不是很安全,別人能夠分析存放在本地的cookie並進行cookie欺騙,考慮到安全應當使用session。html

    三、session會在必定時間內保存在服務器上。當訪問增多,會比較佔用你服務器的性能,考慮到減輕服務器性能方面,應當使用cookie。前端

    四、單個cookie保存的數據不能超過4K,不少瀏覽器都限制一個站點最多保存20個cookie。java

    五、能夠考慮將登錄信息等重要信息存放爲session,其餘信息若是須要保留,能夠放在cookie中。react

    詳細請看:http://www.javashuo.com/article/p-ekqmmpvp-en.html

     

  • fail-fast 與 fail-safe 機制有什麼區別
    快速失敗(fail—fast)在用迭代器遍歷一個集合對象時,若是遍歷過程當中對集合對象的內容進行了修改(增長、刪除、修改),則會拋出Concurrent Modification Exception。
    java.util包下的集合類都是快速失敗的,不能在多線程下發生併發修改(迭代過程當中被修改)。 安全失敗(fail—safe)採用安全失敗機制的集合容器,在遍歷時不是直接在集合內容上訪問的,而是先複製原有集合內容,在拷貝的集合上進行遍歷。 java.util.concurrent包下的容器都是安全失敗,能夠在多線程下併發使用,併發修改。
    詳細請看:http://www.javashuo.com/article/p-gmconpul-ed.html

     

  • get 和 post請求的區別
    面試回答:
    
    GET請求在URL中傳送的參數是有長度限制的,而POST沒有。
    
    GET比POST更不安全,由於參數直接暴露在URL上,因此不能用來傳遞敏感信息。
    
    GET參數經過URL傳遞,POST放在Request body中。
    
    GET請求參數會被完整保留在瀏覽器歷史記錄裏,而POST中的參數不會被保留。
    
    GET請求只能進行url編碼,而POST支持多種編碼方式。
    
    GET請求會被瀏覽器主動cache,而POST不會,除非手動設置。
    
    GET產生的URL地址能夠被Bookmark,而POST不能夠。
    
    GET在瀏覽器回退時是無害的,而POST會再次提交請求。
    
    答上幾條就好了。
    加分項:
    GET和POST還有一個重大區別,簡單的說:
    
    GET產生一個TCP數據包;POST產生兩個TCP數據包。
    
    長的說:
    
    對於GET方式的請求,瀏覽器會把http header和data一併發送出去,服務器響應200(返回數據);
    
    而對於POST,瀏覽器先發送header,服務器響應100 continue,瀏覽器再發送data,服務器響應200 ok(返回數據)。
    詳細請看:http://www.javashuo.com/article/p-mywlgliu-co.html

     

  • Interface 與 abstract 類的區別
    先從整體解釋抽象類和接口的基本概念,而後再比較二者的語法細節,最後再說二者的應用區別。
    
    比較二者語法細節區別的條理是:先從一個類中的構造方法、普通成員變量和方法(包括抽象方法),靜態變量和方法,繼承性等6個方面逐一去比較回答,接着從第三者繼承的角度的回答,特別是最後用了一個典型的例子來展示本身深厚的技術功底。

    抽象類(abstract)程序員

     
        

    含有abstract修飾符的class即爲抽象類,abstract 類不能建立的實例對象。web

     
        

    含有abstract方法的類必須定義爲abstract class,abstract class類中的方法沒必要是抽象的。面試

     
        

    abstract class類中定義抽象方法必須在具體(Concrete)子類中實現,因此,不能有抽象構造方法或抽象靜態方法。ajax

     
        

    若是的子類沒有實現抽象父類中的全部抽象方法,那麼子類也必須定義爲abstract類型。

     
        

    接口(interface)

     
        

    interface 能夠說成是抽象類的一種特例,接口中的全部方法都必須是抽象的。

     
        

    接口中的方法定義默認爲public abstract類型,接口中的成員變量類型默認爲public static final

     
        

    下面比較一下二者的語法區別:

     
        

    1.抽象類能夠有構造方法,接口中不能有構造方法。

     
        

    2.抽象類中能夠有普通成員變量,接口中沒有普通成員變量

     
        

    3.抽象類中能夠包含非抽象的普通方法,接口中的全部方法必須都是抽象的,不能有非抽象的普通方法。

     
        

    4. 抽象類中的抽象方法的訪問類型能夠是public,protected和(默認類型,雖然eclipse下不報錯,但應該也不行),但接口中的抽象方法只能是public類型的,而且默認即爲public abstract類型。

     
        

    5. 抽象類中能夠包含靜態方法,接口中不能包含靜態方法

     
        

    6. 抽象類和接口中均可以包含靜態成員變量,抽象類中的靜態成員變量的訪問類型能夠任意,但接口中定義的變量只能是public static final類型,而且默認即爲public static final類型。

     
        

    7. 一個類能夠實現多個接口,但只能繼承一個抽象類。

     

     
        
    詳細請看:http://www.javashuo.com/article/p-cjpaszxy-dw.html
     

     

  • IOC的優勢是什麼
    先把IOC的概念說出來
    
    依賴注入和控制反轉
    
    所謂的依賴注入是甲方開放接口,在它須要的時候,可以將乙方傳遞進來(注入);所謂的控制反轉,甲乙雙方不相互依賴,交易活動的進行不依賴於甲乙任何一方,整個活動的進行由第三方負責管理。這就是spring IoC的思想所在。
    
    而後說優缺點
    
    IOC的優勢:實現組件之間的解耦,提升程序的靈活性和可維護性。
    IOC的缺點:
    1、建立對象的步驟變複雜了,不直觀,固然這是對不習慣這種方式的人來講的。
    2、由於使用反射來建立對象,因此在效率上會有些損耗。但相對於程序的靈活性和可維護性來講,這點損耗是微不足道的。
    三、缺乏IDE重構的支持,若是修改了類名,還需到XML文件中手動修改,這彷佛是全部XML方式的缺憾所在。
    詳情查看:http://www.cnblogs.com/songanwei/p/9389109.html

     

  • IO 和 NIO的區別,NIO優勢
    IO是面向流的,NIO是面向緩衝區的
    Java IO面向流意味着每次從流中讀一個或多個字節,直至讀取全部字節,它們沒有被緩存在任何地方;
    NIO則能先後移動流中的數據,由於是面向緩衝區的
    IO流是阻塞的,NIO流是不阻塞的
    Java IO的各類流是阻塞的。這意味着,當一個線程調用read() 或 write()時,該線程被阻塞,直到有一些數據被讀取,或數據徹底寫入。該線程在此期間不能再幹任何事情了
    Java NIO的非阻塞模式,使一個線程從某通道發送請求讀取數據,可是它僅能獲得目前可用的數據,若是目前沒有數據可用時,就什麼都不會獲取。NIO可以讓您只使用一個(或幾個)單線程管理多個通道(網絡鏈接或文件),但付出的代價是解析數據可能會比從一個阻塞流中讀取數據更復雜。 
    非阻塞寫也是如此。一個線程請求寫入一些數據到某通道,但不須要等待它徹底寫入,這個線程同時能夠去作別的事情。
    選擇器
    Java NIO的選擇器容許一個單獨的線程來監視多個輸入通道,你能夠註冊多個通道使用一個選擇器,而後使用一個單獨的線程來「選擇」通道:這些通道里已經有能夠處理的輸入,或者選擇已準備寫入的通道。這種選擇機制,使得一個單獨的線程很容易來管理多個通道。
    NIO的優點:
    1.優點在於一個線程管理多個通道;可是數據的處理將會變得複雜;
    2.若是須要管理同時打開的成千上萬個鏈接,這些鏈接每次只是發送少許的數據,採用這種;
    傳統IO的優點:
    1.適用於一個線程管理一個通道的狀況;由於其中的流數據的讀取是阻塞的;
    2.若是須要管理同時打開不太多的鏈接,這些鏈接會發送大量的數據;
    詳細請看:http://www.javashuo.com/article/p-oncyysuj-dd.html

     

  • Java 8 / Java 7 爲咱們提供了什麼新功能
    Java 7 的7個新特性
    
    1.對集合類的語言支持;
    
    2.自動資源管理;
    
    3.改進的通用實例建立類型推斷;
    
    4.數字字面量下劃線支持;
    
    5.switch中使用string;
    
    6.二進制字面量;
    
    7.簡化可變參數方法調用。
    
     
    
    JAVA8 新特性
    
    Lambda 表達式 − Lambda容許把函數做爲一個方法的參數(函數做爲參數傳遞進方法中。
    
    方法引用 − 方法引用提供了很是有用的語法,能夠直接引用已有Java類或對象(實例)的方法或構造器。與lambda聯合使用,方法引用可使語言的構造更緊湊簡潔,減小冗餘代碼。
    
    默認方法 − 默認方法就是一個在接口裏面有了一個實現的方法。
    
    新工具 − 新的編譯工具,如:Nashorn引擎 jjs、 類依賴分析器jdeps。
    
    Stream API −新添加的Stream API(java.util.stream) 把真正的函數式編程風格引入到Java中。
    
    Date Time API − 增強對日期與時間的處理。
    
    Optional 類 − Optional 類已經成爲 Java 8 類庫的一部分,用來解決空指針異常。
    
    Nashorn, JavaScript 引擎 − Java 8提供了一個新的Nashorn javascript引擎,它容許咱們在JVM上運行特定的javascript應用。
    詳細請看:https://www.cnblogs.com/songanwei/p/9389663.html
     

     

  • 什麼是競態條件? 舉個例子說明。
    當兩個線程競爭同一資源時,若是對資源的訪問順序敏感,就稱存在競態條件。
    
    致使競態條件發生的代碼區稱做臨界區。
    
    在臨界區中使用適當的同步就能夠避免競態條件。
    
    臨界區實現方法有兩種,一種是用synchronized,一種是用Lock顯式鎖實現。
    class Counter {  
        protected long count = 0;  
        public void add(long value) {  
            this.count = this.count + value;  
        }  
    }  
     
        

    觀察線程A和B交錯執行會發生什麼,兩個線程分別加了2和3到count變量上,兩個線程執行結束後count變量的值應該等於5。然而因爲兩個線程是交叉執行的,兩個線程從內存中讀出的初始值都是0。而後各自加了2和3,並分別寫回內存。最終的值並非指望的5,而是最後寫回內存的那個線程的值,上面例子中最後寫回內存的是線程A,但實際中也多是線程B。若是沒有采用合適的同步機制,線程間的交叉執行狀況就沒法預料。
    add()方法就是一個臨界區,它會產生競態條件。

    引用:http://cuisuqiang.iteye.com/blog/2020152

     

  • JRE、JDK、JVM 及 JIT 之間有什麼不一樣
    java虛擬機(JVM)
        使用java編程語言的主要優點就是平臺的獨立性。
    你曾經想知道過java怎麼實現平臺的獨立性嗎?對,就是虛擬機,它抽象化了硬件設備,開發者和他們的程序的得以操做系統。
    虛擬機的職責就是處理和操做系統的交流。java不一樣的接口規範對任何平臺都有良好的支持,由於jvm很好的實現了每一個平臺的規範。
    jvm能夠理解僞代碼字節碼,在用戶和操做系統之間創建了一層樞紐。 java運行時環境(JRE) java運行時環境是JVM的一個超集。
    JVM對於一個平臺或者操做系統是明確的,而JRE確實一個通常的概念,他表明了完整的運行時環境。
    咱們在jre文件夾中看到的全部的jar文件和可執行文件都會變成運行時的一部分。
    事實上,運行時JRE變成了JVM。因此對於通常狀況時候使用JRE,對於明確的操做系統來講使用JVM。
    當你下載了JRE的時候,也就自動下載了JVM。 java開發工具箱(JDK) java開發工具箱指的是編寫一個java應用所須要的全部jar文件和可執行文件。
    事實上,JRE是JDK的一部分。
    若是你下載了JDK,你會看到一個名叫JRE的文件夾在裏面。JDK中要被牢記的jar文件就是tools.jar,它包含了用於執行java文檔的類還有用於類簽名的jar包。 即時編譯器(JIT) 即時編譯器是種特殊的編譯器,它經過有效的把字節碼變成機器碼來提升JVM的效率。
    JIT這種功效很特殊,由於他把檢測到的類似的字節碼編譯成單一運行的機器碼,從而節省了CPU的使用。
    這和其餘的字節碼編譯器不一樣,由於他是運行時(第一類執行的編譯?)the firs of its kind to perform the compilation(從字節碼到機器碼)而不是在程序運行以前。
    正是由於這些,動態編譯這個詞彙才和JIT有那麼緊密的關係。

     

  • MVC的各個部分都有那些技術來實現?如何實現?
    MVC是Model-View-Controller的簡寫。
    
    Model 表明的是應用的業務邏輯(經過JavaBean,EJB組件實現),
    View 是應用的表示面(由JSP頁面產生),
    Controller 是提供應用的處理過程控制(通常是一個Servlet),
    經過這種設計模型把應用邏輯,處理過程和顯示邏輯分紅不一樣的組件實現。這些組件能夠進行交互和重用。

     

  • RPC 通訊和 RMI 區別
    RPC:(Remote Procedure Call) 
      被設計爲在應用程序間通訊的平臺中立的方式,它不理會操做系統之間以及語言之間的差別。 支持多語言
    RMI:(Remote Method Invocation) 
    RPC 的Java版本,EJB的基礎技術 
    RMI 採用JRMP(Java Remote Method Protocol)通信協議,是構建在TCP/IP協議上的一種遠程調用方法。 
    RMI 採用stubs和skeletons來進行遠程對象的通信。 
      stub充當遠程對象的客戶端代理,有着和遠程對象相同的遠程接口。 
      遠程對象的調用實際是經過調用該對象的客戶端代理對象stub來完成的。
    RMI和RPC之間最主要的區別在於方法是如何別調用的。
    在RMI中,遠程接口使每一個遠程方法都具備方法簽名。若是一個方法在服務器上執行,可是沒有相匹配的簽名被添加到這個遠程接口上,那麼這個新方法就不能被RMI客戶方所調用。
    在RPC中,當一個請求到達RPC服務器時,這個請求就包含了一個參數集和一個文本值,一般造成「classname.methodname」的形式。
    這就向RPC服務器代表,被請求的方法在爲「classname」的類中,名叫「methodname」。
    而後RPC服務器就去搜索與之相匹配的類和方法,並把它做爲那種方法參數類型的輸入。
    這裏的參數類型是與RPC請求中的類型是匹配的。一旦匹配成功,這個方法就被調用了,其結果被編碼後返回客戶方。

     

  • 什麼是 Web Service(Web服務)
    從表面上看,Web Service就是一個應用程序,它向外界暴露出一個可以經過Web進行調用的API。
    這就是說,你可以用編程的方法透明的調用這個應用程序,不須要了解它的任何細節,跟你使用的編程語言也沒有關係。
    例如能夠建立一個提供天氣預報的Web Service,那麼不管你用哪一種編程語言開發的應用均可以經過調用它的API並傳入城市信息來得到該城市的天氣預報。
    之因此稱之爲Web Service,是由於它基於HTTP協議傳輸數據,這使得運行在不一樣機器上的不一樣應用無須藉助附加的、專門的第三方軟件或硬件,就可相互交換數據或集成。 補充:這裏必需要說起的一個概念是SOA(Service
    -Oriented Architecture,面向服務的架構),
    SOA是一種思想,它將應用程序的不一樣功能單元經過中立的契約聯繫起來,獨立於硬件平臺、操做系統和編程語言,使得各類形式的功能單元可以更好的集成。
    顯然,Web Service是SOA的一種較好的解決方案,它更多的是一種標準,而不是一種具體的技術。

     

  • JSWDL開發包的介紹。JAXP、JAXM的解釋。SOAP、UDDI,WSDL解釋。
    Web ServiceWeb Service是基於網絡的、分佈式的模塊化組件,它執行特定的任務,遵照具體的技術規範,這些規範使得Web Service能與其餘兼容的組件進行互操做。
    JAXP(Java API for XML Parsing) 定義了在Java中使用DOM, SAX, XSLT的通用的接口。這樣在你的程序中你只要使用這些通用的接口,當你須要改變具體的實現時候也不須要修改代碼。
    JAXM(Java API for XML Messaging) 是爲SOAP通訊提供訪問方法和傳輸機制的API。
    WSDL是一種 XML 格式,用於將網絡服務描述爲一組端點,這些端點對包含面向文檔信息或面向過程信息的消息進行操做。這種格式首先對操做和消息進行抽象描述,而後將其綁定到具體的網絡協議和消息格式上以定義端點。相關的具體端點即組合成爲抽象端點(服務)。
    SOAP即簡單對象訪問協議(Simple Object Access Protocol),它是用於交換XML編碼信息的輕量級協議。
    UDDI 的目的是爲電子商務創建標準;UDDI是一套基於Web的、分佈式的、爲Web Service提供的、信息註冊中心的實現標準規範,同時也包含一組使企業能將自身提供的Web Service註冊,以使別的企業可以發現的訪問協議的實現標準。

     

  • WEB容器主要有哪些功能? 並請列出一些常見的WEB容器名字。
    知足必定條件的web服務器就是web容器。是web服務器或應用與服務器的一部分,例如是tomcat,weblogic等,實現的是jsp,servlet;tomcat就是servlet和jsp運行的容器。
    WEB容器:給處於其中的應用程序組件(JSP,SERVLET)提供一個環境,JSP容器和SERVLET容器。使JSP,SERVLET直接跟容器中的環境變量接口交互,沒必要關注其它系統問題。主要由WEB服務器來實現。
    例如:TOMCAT,WEBLOGIC,WEBSPHERE等。該容器提供的接口嚴格遵照J2EE規範中的WEB APPLICATION 標準。咱們把遵照以上標準的WEB服務器就叫作J2EE中的WEB容器。 EJB容器:Enterprise java bean 容器。更具備行業領域特點。
    他提供給運行在其中的組件EJB各類管理功能。只要知足J2EE規範的EJB放入該容器,立刻就會被容器進行高效率的管理。而且能夠經過現成的接口來得到系統級別的服務。例如郵件服務、事務管理。 WEB容器和EJB容器在原理上是大致相同的,更多的區別是被隔離的外界環境。
    WEB容器更多的是跟基於HTTP的請求打交道。而EJB容器不是。它是更多的跟數據庫、其它服務打交道。
    但他們都是把與外界的交互實現從而減輕應用程序的負擔。例如SERVLET不用關心HTTP的細節,直接引用環境變量session,request,response就行、EJB不用關心數據庫鏈接速度、各類事務控制,直接由容器來完成。
    詳細請看:http://www.javashuo.com/article/p-ryavpqkz-cu.html

     

  • 一個".java"源文件中是否能夠包含多個類(不是內部類)?有什麼限制
    這個是能夠的,一個「.java」源文件裏面能夠包含多個類,可是隻容許有一個public類,而且類名必須和文件名一致。
    
    每一個編譯單元只能有一個public 類。這麼作的意思是,每一個編譯單元只能有一個公開的接口,而這個接口就由其public 類來表示。
    你能夠根據須要,往這個文件裏面添加任意多個提供輔助功能的package 權限的類。可是若是這個編譯單元裏面有兩個或兩個以上的public 類的話,程序就不知道從哪裏導入了,編譯器就會報錯。  

     

  • 簡單說說你瞭解的類加載器。是否實現過類加載器
    類加載器就是負責檢索並加載其餘Java類或者資源(如文件)的對象,它通常繼承於java.lang.ClassLoader這個抽象類(除了BootstrapClassLoader)。
    實際上,程序中全部的類都是經過類加載器進行加載的,而且它們都持有各自類加載器對象的引用,能夠經過java.lang.Class的getClassLoader方法獲得。

    一個程序中的各個類加載器構成了一棵樹,位於根部的被稱做BootstrapClassLoader,它做爲Java虛擬機的一部分,它使用C++語言實現,在程序剛啓動時就被加載進來,負責Java標準庫的加載,而且只有它能完成該任務。

      
    標準擴展(Extension)類加載器負責加載Java_Home /lib/ext或者由系統變量 java.ext.dir指定位置中的類庫

      
    應用程序(Application)類加載器負責加載系統類路徑(CLASSPATH)中指定的類庫。同時它常被稱爲系統(System)加載器,由於咱們能夠經過getSystemClassLoader()方法來獲取它。

      
    而由咱們程序員本身編寫的類加載器被稱爲自定義類加載器,若是生成自定義類加載器時沒有明確地指出父類加載器,會默認把應用程序(Application)類加載器做爲本身的父親。

      
    類加載器的父子關係至關重要,當你指定由一個類加載器加載某一個類時,它會不管如何先把它交給本身的父類加載器來執行,除非父類加載器檢索不到這個類,纔會開始嘗試本身檢索和加載。

    詳情:http://www.javashuo.com/article/p-sfixvzzw-ck.html

    http://www.cnblogs.com/songanwei/p/9417277.html

     

  • 解釋一下什麼叫AOP(面向切面編程)
    這種在運行時,動態地將代碼切入到類的指定方法、指定位置上的編程思想就是面向切面的編程。
    
    AOP是Spring提供的關鍵特性之一。AOP即面向切面編程,是OOP編程的有效補充。
    使用AOP技術,能夠將一些系統性相關的編程工做,獨立提取出來,獨立實現,而後經過切面切入進系統。
    從而避免了在業務邏輯的代碼中混入不少的系統相關的邏輯——好比權限管理,事物管理,日誌記錄等等。這些系統性的編程工做均可以獨立編碼實現,而後經過AOP技術切入進系統便可。
    從而達到了 將不一樣的關注點分離出來的效果。
    詳情請看:http://www.javashuo.com/article/p-cslhjjih-bx.html

     

  • 請簡述 Servlet 的生命週期及其相關的方法
    Servlet 生命週期:Servlet 加載--->實例化--->服務--->銷燬。
    init():在Servlet的生命週期中,僅執行一次init()方法。
    它是在服務器裝入Servlet時執行的,負責初始化Servlet對象。
    能夠配置服務器,以在啓動服務器或客戶機首次訪問Servlet時裝入Servlet。
    不管有多少客戶機訪問Servlet,都不會重複執行init()。
    service():它是Servlet的核心,負責響應客戶的請求。
    每當一個客戶請求一個HttpServlet對象,該對象的Service()方法就要調用,並且傳遞給這個方法一個「請求」(ServletRequest)對象和一個「響應」(ServletResponse)對象做爲參數。
    在HttpServlet中已存在Service()方法。
    默認的服務功能是調用與HTTP請求的方法相應的do功能。
    destroy(): 僅執行一次,在服務器端中止且卸載Servlet時執行該方法。
    當Servlet對象退出生命週期時,負責釋放佔用的資源。
    一個Servlet在運行service()方法時可能會產生其餘的線程,所以須要確認在調用destroy()方法時,這些線程已經終止或完成。
    詳情請看:http://www.javashuo.com/article/p-bomfpfqa-x.html

     

  • 請簡述一下 Ajax 的原理及實現步驟
     
        

     Ajax的原理簡單來講經過XmlHttpRequest對象來向服務器發異步請求,從服務器得到數據,而後用javascript來操做DOM而更新頁面。這其中最關鍵的一步就是從服務器得到請求數據。要清楚這個過程和原理,咱們必須對 XMLHttpRequest有所瞭解。

     
        

    XMLHttpRequest是ajax的核心機制,它是在IE5中首先引入的,是一種支持異步請求的技術。簡單的說,也就是javascript能夠及時向服務器提出請求和處理響應,而不阻塞用戶。達到無刷新的效果。

    get 請求
    1) 建立一個XMLHttpRequest對象
    2) 調用該對象的open方法
    3) 若是是get請求,設置回調函數onreadystatechange = callback
    4) Send
    
    若是是post 請求
    
    建立一個XMLHttpRequest對象
    6) 調用該對象的open方法
    7) 調用setRequestHeader(「Content-Type」, 「application/x-www-form-urlencoded」);
    8) 設置回調函數onreadystatechange = callback
    9) Send
    詳情:http://www.javashuo.com/article/p-gwjuyvqp-h.html

     

  • 簡單描述Struts的主要功能
  • 什麼是 N 層架構
  • 什麼是CORBA?用途是什麼
  • 什麼是Java虛擬機?爲何Java被稱做是"平臺無關的編程語言"
  • 什麼是正則表達式?用途是什麼?哪一個包使用正則表達式來實現模式匹配
  • 什麼是懶加載(Lazy Loading)
  • 什麼是尾遞歸,爲何須要尾遞歸
  • 什麼是控制反轉(Inversion of Control)與依賴注入(Dependency Injection)

    關鍵字

    finalize

  • 什麼是finalize()方法
  • finalize()方法何時被調用
  • 析構函數(finalization)的目的是什麼
  • final 和 finalize 的區別

    final

  • final關鍵字有哪些用法
  • final 與 static 關鍵字能夠用於哪裏?它們的做用是什麼
  • final, finally, finalize的區別
  • final、finalize 和 finally 的不一樣之處?

    可否在運行時向 static final 類型的賦值

  • 使用final關鍵字修飾一個變量時,是引用不能變,仍是引用的對象不能變
  • 一個類被聲明爲final類型,表示了什麼意思
  • throws, throw, try, catch, finally分別表明什麼意義

    Java 有幾種修飾符?分別用來修飾什麼

    volatile

  • volatile 修飾符的有過什麼實踐
  • volatile 變量是什麼?volatile 變量和 atomic 變量有什麼不一樣
  • volatile 類型變量提供什麼保證?能使得一個非原子操做變成原子操做嗎
  • 能建立 volatile 數組嗎?
  • transient變量有什麼特色
  • super何時使用
  • public static void 寫成 static public void會怎樣
  • 說明一下public static void main(String args[])這段聲明裏每一個關鍵字的做用
  • 請說出做用域public, private, protected, 以及不寫時的區別
  • sizeof 是Java 的關鍵字嗎

    static

  • static class 與 non static class的區別
  • static 關鍵字是什麼意思?Java中是否能夠覆蓋(override)一個private或者是static的方法
  • 靜態類型有什麼特色
  • main() 方法爲何必須是靜態的?能不能聲明 main() 方法爲非靜態
  • 是否能夠從一個靜態(static)方法內部發出對非靜態(non-static)方法的調用
  • 靜態變量在何時加載?編譯期仍是運行期?靜態代碼塊加載的時機呢
  • 成員方法是否能夠訪問靜態變量?爲何靜態方法不能訪問成員變量

    switch

  • switch 語句中的表達式能夠是什麼類型數據
  • switch 是否能做用在byte 上,是否能做用在long 上,是否能做用在String上
  • while 循環和 do 循環有什麼不一樣

    操做符

  • &操做符和&&操做符有什麼區別?
  • a = a + b 與 a += b 的區別?
  • 邏輯操做符 (&,|,^)與條件操做符(&&,||)的區別
  • 3*0.1 == 0.3 將會返回什麼?true 仍是 false?
  • float f=3.4; 是否正確?
  • short s1 = 1; s1 = s1 + 1;有什麼錯?

    數據結構

    基礎類型(Primitives)

  • 基礎類型(Primitives)與封裝類型(Wrappers)的區別在哪裏
  • 簡述九種基本數據類型的大小,以及他們的封裝類
  • int 和 Integer 哪一個會佔用更多的內存? int 和 Integer 有什麼區別?parseInt()函數在何時使用到
  • float和double的默認值是多少
  • 如何去小數四捨五入保留小數點後兩位
  • char 型變量中能不能存貯一箇中文漢字,爲何

    類型轉換

  • 怎樣將 bytes 轉換爲 long 類型
  • 怎麼將 byte 轉換爲 String
  • 如何將數值型字符轉換爲數字
  • 咱們能將 int 強制轉換爲 byte 類型的變量嗎?若是該值大於 byte 類型的範圍,將會出現什麼現象
  • 能在不進行強制轉換的狀況下將一個 double 值賦值給 long 類型的變量嗎
  • 類型向下轉換是什麼

    數組

  • 如何權衡是使用無序的數組仍是有序的數組
  • 怎麼判斷數組是 null 仍是爲空
  • 怎麼打印數組? 怎樣打印數組中的重複元素
  • Array 和 ArrayList有什麼區別?何時應該使用Array而不是ArrayList
  • 數組和鏈表數據結構描述,各自的時間複雜度
  • 數組有沒有length()這個方法? String有沒有length()這個方法

    隊列

  • 隊列和棧是什麼,列出它們的區別
  • BlockingQueue是什麼
  • 簡述 ConcurrentLinkedQueue LinkedBlockingQueue 的用處和不一樣之處。

    ArrayList、Vector、LinkedList的存儲性能和特性

    String

    StringBuffer

  • ByteBuffer 與 StringBuffer有什麼區別

    HashMap

  • HashMap的工做原理是什麼
  • 內部的數據結構是什麼
  • HashMap 的 table的容量如何肯定?loadFactor 是什麼? 該容量如何變化?這種變化會帶來什麼問題?
  • HashMap 實現的數據結構是什麼?如何實現
  • HashMap 和 HashTable、ConcurrentHashMap 的區別
  • HashMap的遍歷方式及效率
  • HashMap、LinkedMap、TreeMap的區別
  • 如何決定選用HashMap仍是TreeMap
  • 若是HashMap的大小超過了負載因子(load factor)定義的容量,怎麼辦
  • HashMap 是線程安全的嗎?併發下使用的 Map 是什麼,它們內部原理分別是什麼,好比存儲方式、 hashcode、擴容、 默認容量等

    HashSet

  • HashSet和TreeSet有什麼區別
  • HashSet 內部是如何工做的
  • WeakHashMap 是怎麼工做的?

    Set

  • Set 裏的元素是不能重複的,那麼用什麼方法來區分重複與否呢?是用 == 仍是 equals()? 它們有何區別?
  • TreeMap:TreeMap 是採用什麼樹實現的?TreeMap、HashMap、LindedHashMap的區別。TreeMap和TreeSet在排序時如何比較元素?Collections工具類中的sort()方法如何比較元素?
  • TreeSet:一個已經構建好的 TreeSet,怎麼完成倒排序。
  • EnumSet 是什麼

    Hash算法

  • Hashcode 的做用
  • 簡述一致性 Hash 算法
  • 有沒有可能 兩個不相等的對象有相同的 hashcode?當兩個對象 hashcode 相同怎麼辦?如何獲取值對象
  • 爲何在重寫 equals 方法的時候須要重寫 hashCode 方法?equals與 hashCode 的異同點在哪裏
  • a.hashCode() 有什麼用?與 a.equals(b) 有什麼關係
  • hashCode() 和 equals() 方法的重要性體如今什麼地方
  • Object:Object有哪些公用方法?Object類hashcode,equals 設計原則? sun爲何這麼設計?Object類的概述
  • 如何在父類中爲子類自動完成全部的 hashcode 和 equals 實現?這麼作有何優劣。
  • 能夠在 hashcode() 中使用隨機數字嗎?

    LinkedHashMap

  • LinkedHashMap 和 PriorityQueue 的區別是什麼

    List

  • List, Set, Map三個接口,存取元素時各有什麼特色
  • List, Set, Map 是否繼承自 Collection 接口
  • 遍歷一個 List 有哪些不一樣的方式
  • LinkedList
  1. LinkedList 是單向鏈表仍是雙向鏈表
  2. LinkedList 與 ArrayList 有什麼區別
  3. 描述下 Java 中集合(Collections),接口(Interfaces),實現(Implementations)的概念。LinkedList 與 ArrayList 的區別是什麼?
  4. 插入數據時,ArrayList, LinkedList, Vector誰速度較快?

     

  • ArrayList

     

  1. ArrayList 和 HashMap 的默認大小是多數
  2. ArrayList 和 LinkedList 的區別,何時用 ArrayList?
  3. ArrayList 和 Set 的區別?
  4. ArrayList, LinkedList, Vector的區別
  5. ArrayList是如何實現的,ArrayList 和 LinkedList 的區別
  6. ArrayList如何實現擴容
  7. Array 和 ArrayList 有何區別?何時更適合用Array
  8. 說出ArraList,Vector, LinkedList的存儲性能和特性

     

    Map

     

  • Map, Set, List, Queue, Stack
  • Map 接口提供了哪些不一樣的集合視圖
  • 爲何 Map 接口不繼承 Collection 接口

     

    Collections

     

  • 介紹Java中的Collection FrameWork。集合類框架的基本接口有哪些
  • Collections類是什麼?Collection 和 Collections的區別?Collection、Map的實現
  • 集合類框架的最佳實踐有哪些
  • 爲何 Collection 不從 Cloneable 和 Serializable 接口繼承
  • 說出幾點 Java 中使用 Collections 的最佳實踐?
  • Collections 中 遺留類 (HashTable、Vector) 和 現有類的區別

     

    什麼是 B+樹,B-樹,列出實際的使用場景。

     

    接口

     

  • Comparator 與 Comparable 接口是幹什麼的?列出它們的區別

     

    對象

     

    拷貝(clone)

     

  • 如何實現對象克隆
  • 深拷貝和淺拷貝區別
  • 深拷貝和淺拷貝如何實現激活機制
  • 寫clone()方法時,一般都有一行代碼,是什麼

     

    比較

     

  • 在比較對象時,"==" 運算符和 equals 運算有何區別
  • 若是要重寫一個對象的equals方法,還要考慮什麼
  • 兩個對象值相同(x.equals(y) == true),但卻可有不一樣的hash code,這句話對不對

     

    構造器

     

  • 構造器鏈是什麼
  • 建立對象時構造器的調用順序

     

    不可變對象

     

  • 什麼是不可變象(immutable object)
  • 爲何 Java 中的 String 是不可變的(Immutable)
  • 如何構建不可變的類結構?關鍵點在哪裏
  • 能建立一個包含可變對象的不可變對象嗎
  • 如何對一組對象進行排序

     

    方法

     

  • 構造器(constructor)是否可被重寫(override)
  • 方法能夠同時便是 static 又是 synchronized 的嗎
  • abstract 的 method是否可同時是 static,是否可同時是 native,是否可同時是synchronized
  • Java支持哪一種參數傳遞類型
  • 一個對象被看成參數傳遞到一個方法,是值傳遞仍是引用傳遞
  • 當一個對象被看成參數傳遞到一個方法後,此方法可改變這個對象的屬性,並可返回變化後的結果,那麼這裏究竟是值傳遞仍是引用傳遞
  • 咱們可否重載main()方法
  • 若是main方法被聲明爲private會怎樣

     

    GC

     

    概念

     

  • GC是什麼?爲何要有GC
  • 何時會致使垃圾回收
  • GC是怎麼樣運行的
  • 新老以及永久區是什麼
  • GC 有幾種方式?怎麼配置
  • 何時一個對象會被GC? 如何判斷一個對象是否存活
  • System.gc() Runtime.gc()會作什麼事情? 能保證 GC 執行嗎
  • 垃圾回收器能夠立刻回收內存嗎?有什麼辦法主動通知虛擬機進行垃圾回收?
  • Minor GC 、Major GC、Young GC 與 Full GC分別在何時發生
  • 垃圾回收算法的實現原理
  • 若是對象的引用被置爲null,垃圾收集器是否會當即釋放對象佔用的內存?
  • 垃圾回收的最佳作法是什麼

     

    GC收集器有哪些

     

  • 垃圾回收器的基本原理是什麼?
  • 串行(serial)收集器和吞吐量(throughput)收集器的區別是什麼
  • Serial 與 Parallel GC之間的不一樣之處
  • CMS 收集器 與 G1 收集器的特色與區別
  • CMS垃圾回收器的工做過程
  • JVM 中一次完整的 GC 流程是怎樣的? 對象如何晉升到老年代
  • 吞吐量優先和響應優先的垃圾收集器選擇

     

    GC策略

     

  • 舉個實際的場景,選擇一個GC策略
  • JVM的永久代中會發生垃圾回收嗎

     

    收集方法

     

    標記清除、標記整理、複製算法的原理與特色?分別用在什麼地方

    若是讓你優化收集方法,有什麼思路

     

    JVM

     

    參數

     

  • 說說你知道的幾種主要的jvm 參數
  • -XX:+UseCompressedOops 有什麼做用

     

    類加載器(ClassLoader)

     

  • Java 類加載器都有哪些
  • JVM如何加載字節碼文件

     

    內存管理

     

  • JVM內存分哪幾個區,每一個區的做用是什麼
  • 一個對象從建立到銷燬都是怎麼在這些部分裏存活和轉移的
  • 解釋內存中的棧(stack)、堆(heap)和方法區(method area)的用法
  • JVM中哪一個參數是用來控制線程的棧堆棧小
  • 簡述內存分配與回收策略
  • 簡述重排序,內存屏障,happen-before,主內存,工做內存
  • Java中存在內存泄漏問題嗎?請舉例說明
  • 簡述 Java 中軟引用(SoftReferenc)、弱引用(WeakReference)和虛引用
  • 內存映射緩存區是什麼

     

  1. jstack,jstat,jmap,jconsole怎麼用
  2. 32 位 JVM 和 64 位 JVM 的最大堆內存分別是多數?32 位和 64 位的 JVM,int 類型變量的長度是多數?
  3. 怎樣經過 Java 程序來判斷 JVM 是 32 位 仍是 64 位
  4. JVM自身會維護緩存嗎?是否是在堆中進行對象分配,操做系統的堆仍是JVM本身管理堆
  5. 什麼狀況下會發生棧內存溢出
  6. 雙親委派模型是什麼

     

    多線程

     

    基本概念

     

  • 什麼是線程
  • 多線程的優勢
  • 多線程的幾種實現方式

     

  1. 用 Runnable 仍是 Thread

     

  • 什麼是線程安全

     

  1. Vector, SimpleDateFormat 是線程安全類嗎
  2. 什麼 Java 原型不是線程安全的
  3. 哪些集合類是線程安全的

     

  • 多線程中的忙循環是什麼
  • 如何建立一個線程
  • 編寫多線程程序有幾種實現方式
  • 什麼是線程局部變量
  • 線程和進程有什麼區別?進程間如何通信,線程間如何通信
  • 什麼是多線程環境下的僞共享(false sharing)
  • 同步和異步有何異同,在什麼狀況下分別使用他們?舉例說明

     

    Current

     

  • ConcurrentHashMap 和 Hashtable的區別
  • ArrayBlockingQueue, CountDownLatch的用法
  • ConcurrentHashMap的併發度是什麼

     

    CyclicBarrier 和 CountDownLatch有什麼不一樣?各自的內部原理和用法是什麼

    Semaphore的用法

    Thread

     

  • 啓動一個線程是調用 run() 仍是 start() 方法?start() 和 run() 方法有什麼區別
  • 調用start()方法時會執行run()方法,爲何不能直接調用run()方法
  • sleep() 方法和對象的 wait() 方法均可以讓線程暫停執行,它們有什麼區別
  • yield方法有什麼做用?sleep() 方法和 yield() 方法有什麼區別
  • Java 中如何中止一個線程
  • stop() 和 suspend() 方法爲什麼不推薦使用
  • 如何在兩個線程間共享數據
  • 如何強制啓動一個線程
  • 如何讓正在運行的線程暫停一段時間
  • 什麼是線程組,爲何在Java中不推薦使用
  • 你是如何調用 wait(方法的)?使用 if 塊仍是循環?爲何

     

    生命週期

     

  • 有哪些不一樣的線程生命週期
  • 線程狀態,BLOCKED 和 WAITING 有什麼區別
  • 畫一個線程的生命週期狀態圖

     

    ThreadLocal 用途是什麼,原理是什麼,用的時候要注意什麼

    ThreadPool

     

  • 線程池是什麼?爲何要使用它
  • 如何建立一個Java線程池
  • ThreadPool用法與優點
  • 提交任務時,線程池隊列已滿時會發會生什麼
  • newCache 和 newFixed 有什麼區別?簡述原理。構造函數的各個參數的含義是什麼,好比 coreSize, maxsize 等
  • 線程池的實現策略
  • 線程池的關閉方式有幾種,各自的區別是什麼
  • 線程池中submit() 和 execute()方法有什麼區別?

     

    線程調度

     

  • Java中用到的線程調度算法是什麼
  • 什麼是多線程中的上下文切換
  • 你對線程優先級的理解是什麼
  • 什麼是線程調度器 (Thread Scheduler) 和時間分片 (Time Slicing)

     

    線程同步

     

  • 請說出你所知的線程同步的方法
  • synchronized 的原理是什麼
  • synchronized 和 ReentrantLock 有什麼不一樣
  • 什麼場景下可使用 volatile 替換 synchronized
  • 有T1,T2,T3三個線程,怎麼確保它們按順序執行?怎樣保證T2在T1執行完後執行,T3在T2執行完後執行
  • 同步塊內的線程拋出異常會發生什麼
  • 當一個線程進入一個對象的 synchronized 方法A 以後,其它線程是否可進入此對象的 synchronized 方法B
  • 使用 synchronized 修飾靜態方法和非靜態方法有什麼區別
  • 如何從給定集合那裏建立一個 synchronized 的集合

     

     

  • Java Concurrency API 中 的 Lock 接口是什麼?對比同步它有什麼優點
  • Lock 與 Synchronized 的區別?Lock 接口比 synchronized 塊的優點是什麼
  • ReadWriteLock是什麼?
  • 鎖機制有什麼用
  • 什麼是樂觀鎖(Optimistic Locking)?如何實現樂觀鎖?如何避免ABA問題
  • 解釋如下名詞:重排序,自旋鎖,偏向鎖,輕量級鎖,可重入鎖,公平鎖,非公平鎖,樂觀鎖,悲觀鎖
  • 何時應該使用可重入鎖
  • 簡述鎖的等級方法鎖、對象鎖、類鎖
  • Java中活鎖和死鎖有什麼區別?
  • 什麼是死鎖(Deadlock)?致使線程死鎖的緣由?如何確保 N 個線程能夠訪問 N 個資源同時又不致使死鎖
  • 死鎖與活鎖的區別,死鎖與飢餓的區別
  • 怎麼檢測一個線程是否擁有鎖
  • 如何實現分佈式鎖
  • 有哪些無鎖數據結構,他們實現的原理是什麼
  • 讀寫鎖能夠用於什麼應用場景

     

  • Executors類是什麼? Executor和Executors的區別
  • 什麼是Java線程轉儲(Thread Dump),如何獲得它
  • 如何在Java中獲取線程堆棧
  • 說出 3 條在 Java 中使用線程的最佳實踐
  • 在線程中你怎麼處理不可捕捉異常
  • 實際項目中使用多線程舉例。你在多線程環境中遇到的常見的問題是什麼?你是怎麼解決它的
  • 請說出與線程同步以及線程調度相關的方法
  • 程序中有3個 socket,須要多少個線程來處理
  • 假若有一個第三方接口,有不少個線程去調用獲取數據,如今規定每秒鐘最多有 10 個線程同時調用它,如何作到
  • 如何在 Windows 和 Linux 上查找哪一個線程使用的 CPU 時間最長
  • 如何確保 main() 方法所在的線程是 Java 程序最後結束的線程
  • 很是多個線程(多是不一樣機器),相互之間須要等待協調才能完成某種工做,問怎麼設計這種協調方案
  • 你須要實現一個高效的緩存,它容許多個用戶讀,但只容許一個用戶寫,以此來保持它的完整性,你會怎樣去實現它

     

    異常

     

    基本概念

     

  • Error 和 Exception有什麼區別
  1. UnsupportedOperationException是什麼
  2. NullPointerException 和 ArrayIndexOutOfBoundException 之間有什麼相同之處
  • 什麼是受檢查的異常,什麼是運行時異常
  • 運行時異常與通常異常有何異同
  • 簡述一個你最多見到的runtime exception(運行時異常)

     

    finally

     

  • finally關鍵詞在異常處理中如何使用
  1. 若是執行finally代碼塊以前方法返回告終果,或者JVM退出了,finally塊中的代碼還會執行嗎
  2. try裏有return,finally還執行麼?那麼緊跟在這個try後的finally {}裏的code會不會被執行,何時被執行,在return前仍是後
  3. 在什麼狀況下,finally語句不會執行

     

  • throw 和 throws 有什麼區別?
  • OOM你遇到過哪些狀況?你是怎麼搞定的?
  • SOF你遇到過哪些狀況?
  • 既然咱們能夠用RuntimeException來處理錯誤,那麼你認爲爲何Java中還存在檢查型異常
  • 當本身建立異常類的時候應該注意什麼
  • 致使空指針異常的緣由
  • 異常處理 handle or declare 原則應該如何理解
  • 怎麼利用 JUnit 來測試一個方法的異常
  • catch塊裏別不寫代碼有什麼問題
  • 你曾經自定義實現過異常嗎?怎麼寫的
  • 什麼是 異常鏈
  • 在try塊中能夠拋出異常嗎

     

    JDBC

     

  • 經過 JDBC 鏈接數據庫有哪幾種方式
  • 闡述 JDBC 操做數據庫的基本步驟
  • JDBC 中如何進行事務處理
  • 什麼是 JdbcTemplate
  • 什麼是 DAO 模塊
  • 使用 JDBC 操做數據庫時,如何提高讀取數據的性能?如何提高更新數據的性能
  • 列出 5 個應該遵循的 JDBC 最佳實踐

     

    IO

     

    File

     

  • File類型中定義了什麼方法來建立一級目錄
  • File類型中定義了什麼方法來判斷一個文件是否存在

     

     

  • 爲了提升讀寫性能,能夠採用什麼流
  • Java中有幾種類型的流
  • JDK 爲每種類型的流提供了一些抽象類以供繼承,分別是哪些類
  • 對文本文件操做用什麼I/O流
  • 對各類基本數據類型和String類型的讀寫,採用什麼流
  • 能指定字符編碼的 I/O 流類型是什麼

     

    序列化

     

  • 什麼是序列化?如何實現 Java 序列化及注意事項
  • Serializable 與 Externalizable 的區別

     

    Socket

     

  • socket 選項 TCP NO DELAY 是指什麼
  • Socket 工做在 TCP/IP 協議棧是哪一層
  • TCP、UDP 區別及 Java 實現方式

     

  • 說幾點 IO 的最佳實踐
  • 直接緩衝區與非直接緩衝器有什麼區別?
  • 怎麼讀寫 ByteBuffer?ByteBuffer 中的字節序是什麼
  • 當用System.in.read(buffer)從鍵盤輸入一行n個字符後,存儲在緩衝區buffer中的字節數是多少
  • 如何使用掃描器類(Scanner Class)令牌化

     

    面向對象編程(OOP)

     

  • 解釋下多態性(polymorphism),封裝性(encapsulation),內聚(cohesion)以及耦合(coupling)
  • 多態的實現原理
  • 封裝、繼承和多態是什麼
  • 對象封裝的原則是什麼?
  •  

  1. 得到一個類的類對象有哪些方式
  2. 重載(Overload)和重寫(Override)的區別。重載的方法可否根據返回類型進行區分?
  3. 說出幾條 Java 中方法重載的最佳實踐

     

  • 抽象類

     

  1. 抽象類和接口的區別
  2. 抽象類中是否能夠有靜態的main方法
  3. 抽象類是否可實現(implements)接口
  4. 抽象類是否可繼承具體類(concrete class)

     

  • 匿名類(Anonymous Inner Class)

     

  1. 匿名內部類是否能夠繼承其它類?是否能夠實現接口

     

  • 內部類

     

  1. 內部類分爲幾種
  2. 內部類能夠引用它的包含類(外部類)的成員嗎
  3. 請說一下 Java 中爲何要引入內部類?還有匿名內部類

     

  • 繼承

     

  1. 繼承(Inheritance)與聚合(Aggregation)的區別在哪裏
  2. 繼承和組合之間有什麼不一樣
  3. 爲何類只能單繼承,接口能夠多繼承
  4. 存在兩個類,B 繼承 A,C 繼承 B,能將 B 轉換爲 C 麼?如 C = (C) B
  5. 若是類 a 繼承類 b,實現接口c,而類 b 和接口 c 中定義了同名變量,請問會出現什麼問題

     

  • 接口

     

  1. 接口是什麼
  2. 接口是否可繼承接口
  3. 爲何要使用接口而不是直接使用具體類?接口有什麼優勢

     

    泛型

     

  • 泛型的存在是用來解決什麼問題
  • 泛型的經常使用特色
  • List可否轉爲List

     

    工具類

     

    日曆

     

  • Calendar Class的用途
  • 如何在Java中獲取日曆類的實例
  • 解釋一些日曆類中的重要方法
  • GregorianCalendar 類是什麼
  • SimpleTimeZone 類是什麼
  • Locale類是什麼
  • 如何格式化日期對象
  • 如何添加小時(hour)到一個日期對象(Date Objects)
  • 如何將字符串 YYYYMMDD 轉換爲日期

     

    Math

     

  • Math.round()什麼做用?Math.round(11.5) 等於多少?Math.round(-11.5)等於多少?

     

    XML

     

  • XML文檔定義有幾種形式?它們之間有何本質區別?解析XML文檔有哪幾種方式?DOM 和 SAX 解析器有什麼不一樣?
  • Java解析XML的方式
  • 用 jdom 解析 xml 文件時如何解決中文問題?如何解析
  • 你在項目中用到了 XML 技術的哪些方面?如何實現

     

    動態代理

     

  • 描述動態代理的幾種實現方式,分別說出相應的優缺點

     

    設計模式

     

  • 什麼是設計模式(Design Patterns)?你用過哪一種設計模式?用在什麼場合
  • 你知道哪些商業級設計模式?
  • 哪些設計模式能夠增長系統的可擴展性
  • 單例模式

     

  1. 除了單例模式,你在生產環境中還用過什麼設計模式?
  2. 寫 Singleton 單例模式
  3. 單例模式的雙檢鎖是什麼
  4. 如何建立線程安全的 Singleton
  5. 什麼是類的單例模式
  6. 寫出三種單例模式實現

     

  • 適配器模式

     

  1. 適配器模式是什麼?何時使用
  2. 適配器模式和代理模式以前有什麼不一樣
  3. 適配器模式和裝飾器模式有什麼區別

     

  • 何時使用享元模式
  • 何時使用組合模式
  • 何時使用訪問者模式
  • 什麼是模板方法模式
  • 請給出1個符合開閉原則的設計模式的例子

     

    開放問題

     

  • 用一句話歸納 Web 編程的特色
  • Google是如何在一秒內把搜索結果返回給用戶
  • 哪一種依賴注入方式你建議使用,構造器注入,仍是 Setter方法注入
  • 樹(二叉或其餘)造成許多普通數據結構的基礎。請描述一些這樣的數據結構以及什麼時候可使用它們
  • 某一項功能如何設計
  • 線上系統忽然變得異常緩慢,你如何查找問題
  • 什麼樣的項目不適合用框架
  • 新浪微博是如何實現把微博推給訂閱者
  • 簡要介紹下從瀏覽器輸入 URL 開始到獲取到請求界面以後 Java Web 應用中發生了什麼
  • 請你談談SSH整合
  • 高併發下,如何作到安全的修改同一行數據
  • 12306網站的訂票系統如何實現,如何保證不會票不被超賣
  • 網站性能優化如何優化的
  • 聊了下曾經參與設計的服務器架構
  • 請思考一個方案,實現分佈式環境下的 countDownLatch
  • 請思考一個方案,設計一個能夠控制緩存整體大小的自動適應的本地緩存
  • 在你的職業生涯中,算得上最困難的技術挑戰是什麼
  • 如何寫一篇設計文檔,目錄是什麼
  • 大寫的O是什麼?舉幾個例子
  • 編程中本身都怎麼考慮一些設計原則的,好比開閉原則,以及在工做中的應用
  • 解釋一下網絡應用的模式及其特色
  • 設計一個在線文檔系統,文檔能夠被編輯,如何防止多人同時對同一份文檔進行編輯更新
  • 說出數據鏈接池的工做機制是什麼
  • 怎麼獲取一個文件中單詞出現的最高頻率
  • 描述一下你最經常使用的編程風格
  • 若是有機會從新設計大家的產品,你會怎麼作
  • 如何搭建一個高可用系統
  • 如何啓動時不需輸入用戶名與密碼
  • 如何在基於Java的Web項目中實現文件上傳和下載
  • 如何實現一個秒殺系統,保證只有幾位用戶能買到某件商品。
  • 如何實現負載均衡,有哪些算法能夠實現
  • 如何設計一個購物車?想一想淘寶的購物車如何實現的
  • 如何設計一套高併發支付方案,架構如何設計
  • 如何設計創建和保持 100w 的長鏈接
  • 如何避免瀏覽器緩存。
  • 如何防止緩存雪崩
  • 若是AB兩個系統互相依賴,如何解除依
  • 若是有人惡意建立非法鏈接,怎麼解決
  • 若是有幾十億的白名單,天天白天須要高併發查詢,晚上須要更新一次,如何設計這個功能
  • 若是系統要使用超大整數(超過long長度範圍),請你設計一個數據結構來存儲這種超大型數字以及設計一種算法來實現超大整數加法運算)
  • 若是要設計一個圖形系統,請你設計基本的圖形元件(Point,Line,Rectangle,Triangle)的簡單實現
  • 若是讓你實現一個併發安全的鏈表,你會怎麼作
  • 應用服務器與WEB 服務器的區別?應用服務器怎麼監控性能,各類方式的區別?你使用過的應用服務器優化技術有哪些
  • 大型網站在架構上應當考慮哪些問題
  • 有沒有處理過線上問題?出現內存泄露,CPU利用率標高,應用無響應時如何處理的
  • 最近看什麼書,印象最深入的是什麼
  • 描述下經常使用的重構技巧
  • 你使用什麼版本管理工具?分支(Branch)與標籤(Tag)之間的區別在哪裏
  • 你有了解過存在哪些反模式(Anti-Patterns)嗎
  • 你用過的網站前端優化的技術有哪些
  • 如何分析Thread dump
  • 你如何理解AOP中的鏈接點(Joinpoint)、切點(Pointcut)、加強(Advice)、引介(Introduction)、織入(Weaving)、切面(Aspect)這些概念
  • 你是如何處理內存泄露或者棧溢出問題的
  • 大家線上應用的 JVM 參數有哪些
  • 怎麼提高系統的QPS和吞吐量

     

    知識面

     

  • 解釋什麼是 MESI 協議(緩存一致性)
  • 談談 reactor 模型
  • Java 9 帶來了怎樣的新功能
  • Java 與 C++ 對比,C++ 或 Java 中的異常處理機制的簡單原理和應用
  • 簡單講講 Tomcat 結構,以及其類加載器流程
  • 虛擬內存是什麼
  • 闡述下 SOLID 原則
  • 請簡要講一下你對測試驅動開發(TDD)的認識
  • CDN實現原理
  • Maven 和 ANT 有什麼區別
  • UML中有哪些經常使用的圖

     

  • Linux

     

  1. Linux 下 IO 模型有幾種,各自的含義是什麼。
  2. Linux 系統下你關注過哪些內核參數,說說你知道的
  3. Linux 下用一行命令查看文件的最後五行
  4. 平時用到哪些 Linux 命令
  5. 用一行命令輸出正在運行的 Java 進程
  6. 使用什麼命令來肯定是否有 Tomcat 實例運行在機器上

     

  • 什麼是 N+1 難題
  • 什麼是 paxos 算法
  • 什麼是 restful,講講你理解的 restful
  • 什麼是 zab 協議
  • 什麼是領域模型(domain model)?貧血模型(anaemic domain model) 和充血模型(rich domain model)有什麼區別
  • 什麼是領域驅動開發(Domain Driven Development)
  • 介紹一下了解的 Java 領域的 Web Service 框架
  • Web Server、Web Container 與 Application Server 的區別是什麼
  • 微服務(MicroServices)與巨石型應用(Monolithic Applications)之間的區別在哪裏
  • 描述 Cookie 和 Session 的做用,區別和各自的應用範圍,Session工做原理
  • 你經常使用的持續集成(Continuous Integration)、靜態代碼分析(Static Code Analysis)工具備哪些
  • 簡述下數據庫正則化(Normalizations)
  • KISS,DRY,YAGNI 等原則是什麼含義
  • 分佈式事務的原理,優缺點,如何使用分佈式事務?
  • 布式集羣下如何作到惟一序列號
  • 網絡

     

  1. HTTPS 的加密方式是什麼,講講整個加密解密流程
  2. HTTPS和HTTP的區別
  3. HTTP鏈接池實現原理
  4. HTTP集羣方案
  5. Nginx、lighttpd、Apache三大主流 Web服務器的區別

     

  • 是否看過框架的一些代碼
  • 持久層設計要考慮的問題有哪些?你用過的持久層框架有哪些
  • 數值提高是什麼
  • 你能解釋一下里氏替換原則嗎
  • 你是如何測試一個應用的?知道哪些測試框架
  • 傳輸層常見編程協議有哪些?並說出各自的特色

     

    編程題

     

    計算加班費

     

    加班10小時如下加班費是時薪的1.5倍。加班10小時或以上,按4元/時算。提示:(一個月工做26天,一天正常工做8小時)

     

  • 計算1000月

什麼是springboot

        用來簡化spring應用的初始搭建以及開發過程 使用特定的方式來進行配置(properties或yml文件) 

 

                建立獨立的spring引用程序 main方法運行

 

                嵌入的Tomcat 無需部署war文件

 

                簡化maven配置

 

                自動配置spring添加對應功能starter自動化配置

 

                

 

springboot經常使用的starter有哪些

 

        spring-boot-starter-web 嵌入tomcat和web開發須要servlet與jsp支持

 

        spring-boot-starter-data-jpa 數據庫支持

 

        spring-boot-starter-data-redis redis數據庫支持

 

        spring-boot-starter-data-solr solr支持

 

        mybatis-spring-boot-starter 第三方的mybatis集成starter

 

        

 

springboot自動配置的原理

 

        在spring程序main方法中 添加@SpringBootApplication或者@EnableAutoConfiguration

 

        會自動去maven中讀取每一個starter中的spring.factories文件  該文件裏配置了全部須要被建立spring容器中的bean

 

 

 

springboot讀取配置文件的方式

 

        springboot默認讀取配置文件爲application.properties或者是application.yml

 

        

 

springboot集成mybatis的過程

 

        添加mybatis的starter maven依賴

 

                <dependency>

 

                        <groupId>org.mybatis.spring.boot</groupId>

 

                        <artifactId>mybatis-spring-boot-starter</artifactId>

 

                        <version>1.2.0</version>

 

                </dependency>

 

        在mybatis的接口中 添加@Mapper註解

 

        在application.yml配置數據源信息

 

        

 

springboot如何添加【修改代碼】自動重啓功能

 

        添加開發者工具集=====spring-boot-devtools

 

        

 

什麼是微服務

 

        之前的模式是 全部的代碼在同一個工程中 部署在同一個服務器中 同一個項目的不一樣模塊不一樣功能互相搶佔資源

 

        微服務 將工程根據不一樣的業務規則拆分紅微服務 微服務部署在不一樣的機器上 服務之間進行相互調用

 

        Java微服務的框架有 dubbo(只能用來作微服務),spring cloud(提供了服務的發現,斷路器等)

 

        

 

springcloud如何實現服務的註冊和發現

 

        服務在發佈時 指定對應的服務名(服務名包括了IP地址和端口) 將服務註冊到註冊中心(eureka或者zookeeper)

 

        這一過程是springcloud自動實現 只須要在main方法添加@EnableDisscoveryClient  同一個服務修改端口就能夠啓動多個實例

 

        調用方法:傳遞服務名稱經過註冊中心獲取全部的可用實例 經過負載均衡策略調用(ribbon和feign)對應的服務

 

 

 

ribbon和feign區別

 

        Ribbon添加maven依賴 spring-starter-ribbon 使用@RibbonClient(value="服務名稱") 使用RestTemplate調用遠程服務對應的方法

 

        feign添加maven依賴 spring-starter-feign 服務提供方提供對外接口 調用方使用 在接口上使用@FeignClient("指定服務名")

 

Ribbon和Feign的區別:

 

        Ribbon和Feign都是用於調用其餘服務的,不過方式不一樣。

 

        1.啓動類使用的註解不一樣,Ribbon用的是@RibbonClient,Feign用的是@EnableFeignClients。

 

        2.服務的指定位置不一樣,Ribbon是在@RibbonClient註解上聲明,Feign則是在定義抽象方法的接口中使用@FeignClient聲明。

 

        3.調用方式不一樣,Ribbon須要本身構建http請求,模擬http請求而後使用RestTemplate發送給其餘服務,步驟至關繁瑣。

 

        Feign則是在Ribbon的基礎上進行了一次改進,採用接口的方式,將須要調用的其餘服務的方法定義成抽象方法便可,

 

        不須要本身構建http請求。不過要注意的是抽象方法的註解、方法簽名要和提供服務的方法徹底一致。

 

        

 

springcloud斷路器的做用

 

        當一個服務調用另外一個服務因爲網絡緣由或者自身緣由出現問題時 調用者就會等待被調用者的響應 當更多的服務請求到這些資源時

 

                致使更多的請求等待 這樣就會發生連鎖效應(雪崩效應) 斷路器就是解決這一問題

 

                斷路器有徹底打開狀態

 

                        必定時間內 達到必定的次數沒法調用 而且屢次檢測沒有恢復的跡象 斷路器徹底打開,那麼下次請求就不會請求到該服務

 

                半開

 

                        短期內 有恢復跡象 斷路器會將部分請求發給該服務 當能正常調用時 斷路器關閉

 

                關閉

 

                        當服務一直處於正常狀態 能正常調用 斷路器關閉
相關文章
相關標籤/搜索