java(基礎)面試要點1

一、面向對象的特徵css

    java面向對象的的三大特徵,封裝、繼承、多態。html

    封裝:是指將某事物的屬性和行爲包裝到對象中,這個對象只對外公開屬性和行爲,java中使用private、protected、public、不用,來限制對象屬性和方法的訪問。前端

    四個做用域可見範圍不一樣。java

    繼承:子類能夠繼承父類的方法和屬性。android

    多態:父類中同一個方法在多個子類中有不一樣的表現。web

      多態的三個必要條件:要有繼承、要有重寫、父類引用指向子類對象。算法

二、final、finally、finalize的區別spring

    final:是修飾符。修飾變量不能別改變、修飾方法不能被重寫、修飾類不能被繼承sql

    finally:java的一種異常處理機制。是異常中的finally塊,finally語句塊的語句最終被執行,不管是否發生異常。數據庫

    finalize: Java技術使用finalize()方法。在垃圾收集器將對象從內存中清除出去前,作必要的清理工做。這個方法是由垃圾收集器在肯定這個對象沒有被引用時對這個對象調用的。它是在Object類中定義的,所以全部的類都繼承了它。子類覆蓋finalize()方法以整理系統資源或者執行其餘清理工做。finalize()方法是在垃圾收集器刪除對象以前對這個對象調用的

三、int 和 integer區別

    區別:Ingeter是int的包裝類,int的初值爲0,Ingeter的初值爲null

    ①不管如何,Integer與new Integer不會相等。不會經歷拆箱過程,new出來的對象存放在堆,而非new的Integer常量則在常量池(在方法區),他們的內存地址不同,因此爲false。

    ②兩個都是非new出來的Integer,若是數在-128到127之間,則是true,不然爲false。由於java在編譯Integer i2 = 128的時候,被翻譯成:Integer i2 = Integer.valueOf(128);而valueOf()函數會對-128到127之間的數進行緩存。

    ③兩個都是new出來的,都爲false。仍是內存地址不同。

    ④int和Integer(不管new否)比,都爲true,由於會把Integer自動拆箱爲int再去比。

四、重載和重寫的區別

    重載:同一個類中有相同的方法名,不一樣的參數個數、類型,返回值類型可相同可不一樣。

    重寫:是子類重寫父類的方法,要求與被重寫方法的,參數列表、方法名、返回值類型相同,訪問修飾的權限不能大於被重寫方法,不能拋出比被重寫方法更寬泛的異常。

五、抽象類和接口有什麼區別

    接口(interface):接口是抽象方法的集合,一個雷要實現一個接口必須實現接口的抽象方法。(Oracle已經開始嘗試向接口中引入默認方法和靜態方法,以此來減小抽象類和接口之間的差別。如今,咱們能夠爲接口提供默認實現的方法了而且不用強制子類來實現它),不能被繼承,可使用implements實現。

    抽象類(abstract):抽象類是子類的通用特性,不能被實例化,只能被用做子類的超類,抽象類是用來建立繼承層級裏子類的模板。如HttpServlet   extends GenericServlet

六、何時用抽象類和接口

    假如考慮一些方法須要有默認的實現,就使用抽象類。

    假如想實現多重繼承,就用接口,java不支持多重繼承,子類不能繼承多個類,能夠實現多個接口。

    若是基本功能在不斷改變,那麼就須要使用抽象類。若是不斷改變基本功能而且使用接口,那麼就須要改變全部實現了該接口的類。

七、說說反射的用途及實現

    java反射機制是很是強大的,spring、mybatis都有反射的身影

    獲取一個對象的反射類的方法有三種:①對象.getClass()方法②類名.class③Class.ForName("全類名");

八、說說自定義註解的場景及實現

 

九、HTTP 請求的 GET 與 POST 方式的區別參考
在客戶機和服務器之間進行請求-響應時,兩種最常被用到的方法是:GET 和 POST。

  • GET - 從指定的資源請求數據。
  • POST - 向指定的資源提交要被處理的數據

GET方法

請注意,查詢字符串(名稱/值對)是在 GET 請求的 URL 中發送的:

/test/demo_form.asp?name1=value1&name2=value2
  • 請求可被緩存
  • 請求保留在瀏覽器歷史記錄中
  • 請求可被收藏爲書籤
  • 請求不該在處理敏感數據時使用
  • 請求有長度限制
  • 請求只應當用於取回數據

POST方法

請注意,查詢字符串(名稱/值對)是在 POST 請求的 HTTP 消息主體中發送的:

POST /test/demo_form.asp HTTP/1.1 Host: w3schools.com name1=value1&name2=value2

比較 GET 與 POST

方法 GET POST
緩存 能被緩存 不能緩存  
編碼類型 application/x-www-form-urlencoded application/x-www-form-urlencoded 或 multipart/form-data。爲二進制數據使用多重編碼。
對數據長度的限制 是的。當發送數據時,GET 方法向 URL 添加數據;URL 的長度是受限制的(URL 的最大長度是 2048 個字符) 無限制。
對數據類型的限制 只容許 ASCII 字符 沒有限制。也容許二進制數據。
安全性 與 POST 相比,GET 的安全性較差,由於所發送的數據是 URL 的一部分。在發送密碼或其餘敏感信息時毫不要使用 GET POST 比 GET 更安全,由於參數不會被保存在瀏覽器歷史或 web 服務器日誌中。
可見性 數據在 URL 中對全部人都是可見的。 數據不會顯示在 URL 中。

其餘 HTTP 請求方法

  • HEAD 與 GET 相同,但只返回 HTTP 報頭,不返回文檔主體。
  • PUT 上傳指定的 URI 表示。
  • DELETE 刪除指定資源。
  • OPTIONS 返回服務器支持的 HTTP 方法
  • CONNECT 把請求鏈接轉換到透明的 TCP/IP 通道。

十、session 與 cookie 區別

  cookie數據存放在客戶的瀏覽器上,session數據放在服務器上。
  cookie不是很安全,別人能夠分析存放在本地的COOKIE並進行COOKIE欺騙考慮到安全應當使用session。
  session會在必定時間內保存在服務器上。當訪問增多,會比較佔用你服務器的性能考慮到減輕服務器性能方面,應當使用COOKIE。
  單個cookie保存的數據不能超過4K,不少瀏覽器都限制一個站點最多保存20個cookie。
  因此我的建議:
  將登錄信息等重要信息存放爲SESSION
  其餘信息若是須要保留,能夠放在COOKIE中

 

 

十一、session 分佈式處理參考,不錯

第一種:粘性session

粘性Session是指將用戶鎖定到某一個服務器上,好比上面說的例子,用戶第一次請求時,負載均衡器將用戶的請求轉發到了A服務器上,若是負載均衡器設置了粘性Session的話,那麼用戶之後的每次請求都會轉發到A服務器上,至關於把用戶和A服務器粘到了一塊,這就是粘性Session機制

第二種:服務器session複製

原理:任何一個服務器上的session發生改變(增刪改),該節點會把這個 session的全部內容序列化,而後廣播給全部其它節點,無論其餘服務器需不須要session,以此來保證Session同步。

第三種:session共享機制

使用分佈式緩存方案好比memcached、Redis,可是要求Memcached或Redis必須是集羣。

原理:不一樣的 tomcat指定訪問不一樣的主memcached。多個Memcached之間信息是同步的,能主從備份和高可用。用戶訪問時首先在tomcat中建立session,而後將session複製一份放到它對應的memcahed上

第四種:session持久化到數據庫

原理:就不用多說了吧,拿出一個數據庫,專門用來存儲session信息。保證session的持久化。 優勢:服務器出現問題,session不會丟失 缺點:若是網站的訪問量很大,把session存儲到數據庫中,會對數據庫形成很大壓力,還須要增長額外的開銷維護數據庫。

第五種terracotta實現session複製

原理:就不用多說了吧,拿出一個數據庫,專門用來存儲session信息。保證session的持久化。 優勢:服務器出現問題,session不會丟失 缺點:若是網站的訪問量很大,把session存儲到數據庫中,會對數據庫形成很大壓力,還須要增長額外的開銷維護數據庫

十二、JDBC 流程[](http://www.cnblogs.com/lazyco...

注意:在此以前應該先把全部用到的對象設爲null

(1)向DriverManager類註冊驅動數據庫驅動程序,

Class.forName( "com.somejdbcvendor.TheirJdbcDriver" );

(2)調用DriverManager.getConnection方法, 經過JDBC URL,用戶名,密碼取得數據庫鏈接的Connection對象。

Connection conn = DriverManager.getConnection(
      "jdbc:somejdbcvendor:other data needed by some jdbc vendor", //URL "myLogin", // 用戶名 "myPassword" ); // 密碼

(3)獲取Connection後, 即可以經過createStatement建立Statement用以執行SQL語句。下面是一個插入(INSERT)的例子:

Statement stmt = conn.createStatement();
 stmt.executeUpdate( "INSERT INTO MyTable( name ) VALUES ( 'my name' ) " );

(4)有時候會獲得查詢結果,好比select,獲得查詢結果,查詢(SELECT)的結果存放於結果集(ResultSet)中。

ResultSet rs = stmt.executeQuery( "SELECT * FROM MyTable" );

(5)關閉數據庫語句,關閉數據庫鏈接。

rs.close(); stmt.close();

1三、MVC 設計思想

每當用戶在Web瀏覽器中點擊連接或提交表單的時候,請求就開始工做了。請求是一個十分繁忙的傢伙,從離開瀏覽器開始到獲取響應返回,它會經歷不少站,在每站都會留下一些信息,同時也會帶上一些信息。

Spring工做流程描述原文在這裏

    1. 用戶向服務器發送請求,請求被Spring 前端控制Servelt DispatcherServlet捕獲;
    1. DispatcherServlet對請求URL進行解析,獲得請求資源標識符(URI)。而後根據該URI,調用HandlerMapping得到該Handler配置的全部相關的對象(包括Handler對象以及Handler對象對應的攔截器),最後以HandlerExecutionChain對象的形式返回;
    1. DispatcherServlet 根據得到的Handler,選擇一個合適的HandlerAdapter。(附註:若是成功得到HandlerAdapter後,此時將開始執行攔截器的preHandler(...)方法)
    1. 提取Request中的模型數據,填充Handler入參,開始執行Handler(Controller)。 在填充Handler的入參過程當中,根據你的配置,Spring將幫你作一些額外的工做:
    • HttpMessageConveter: 將請求消息(如Json、xml等數據)轉換成一個對象,將對象轉換爲指定的響應信息
    • 數據轉換:對請求消息進行數據轉換。如String轉換成Integer、Double等
    • 數據根式化:對請求消息進行數據格式化。 如將字符串轉換成格式化數字或格式化日期等
    • 數據驗證: 驗證數據的有效性(長度、格式等),驗證結果存儲到BindingResult或Error中
    1. Handler執行完成後,向DispatcherServlet 返回一個ModelAndView對象;
    1. 根據返回的ModelAndView,選擇一個適合的ViewResolver(必須是已經註冊到Spring容器中的ViewResolver)返回給DispatcherServlet ;
    1. ViewResolver 結合Model和View,來渲染視圖
    1. 將渲染結果返回給客戶端。

圖片參考這裏

Spring工做流程描述

  • 爲何Spring只使用一個Servlet(DispatcherServlet)來處理全部請求?
  • 詳細見J2EE設計模式-前端控制模式
  • Spring爲何要結合使用HandlerMapping以及HandlerAdapter來處理Handler?
  • 符合面向對象中的單一職責原則,代碼架構清晰,便於維護,最重要的是代碼可複用性高。如HandlerAdapter可能會被用於處理多種Handler。

 


一、請求旅程的第一站是Spring的DispatcherServlet。與大多數基於Java的Web框架同樣,Spring MVC全部的請求都會經過一個前端控制器(front contrller)Servlet.前端控制器是經常使用Web應用程序模式。在這裏一個單實例的Servlet將請求委託給應用的其餘組件來執行實際的處理。在Spring MVC中,DisPatcherServlet就是前端控制器。

二、DisPactcher的任務是將請求發送Spring MVC控制器(controller).控制器是一個用於處理請求的Spring組件。在典型的應用中可能會有多個控制器,DispatcherServlet須要知道應該將請求發送給那個哪一個控制器。因此Dispactcher以會查詢一個或 多個處理器映射(Handler mapping),來肯定請求的下一站在哪裏。處理映射器根據請求攜帶的 URL信息來進行決策。

三、一旦選擇了合適的控制器,DispatcherServlet會將請求發送給選中的控制器。到了控制器,請求會卸下其負載(用戶提交的信息)並耐心等待控制器處理這些信息。(實際上,設計良好的控制器 自己只是處理不多,甚至不處理工做,而是將業務邏輯委託給一個或多個服務器對象進行處理)

四、控制器在完成處理邏輯後,一般會產生一些信息。這些 信息須要返回給 用戶,並在瀏覽器上顯示。這些信息被稱爲模型(Model),不過僅僅給用戶返回原始的信息是不夠的----這些信息須要以用戶友好的方式進行格式化,通常會是HTML。因此,信息須要發送一個視圖(View),一般會是JSP。

五、 控制器作的最後一件事就是將模型打包,而且表示出用於渲染輸出的視圖名。它接下來會將請求連同模型和視圖發送回DispatcherServlet。

六、這樣,控制器就不會與特定的視圖相耦合*傳遞給控制器的視圖名並不直接表示某個特定的jsp。實際上,它甚至並不能肯定視圖就是JSP。相反,它僅僅傳遞了一個邏輯名稱,這個名字將會用來查找產生結果的真正視圖。DispatcherServlet將會使用視圖解析器(View resolver),來將邏輯視圖名稱匹配爲一個特定的視圖實現,他可能也可能不是JSP

七、雖然DispatcherServlet已經知道了哪一個駛入渲染結果、那請求的任務基本上也就完成了,它的最後一站是試圖的實現。在這裏它交付給模型數據。請求的任務就結束了。視圖將使用模型數據渲染輸出。這個輸出經過響應對象傳遞給客戶端(不會像聽上去那樣硬編碼)

能夠看到,請求要通過不少步驟,最終才能造成返回給客戶端的響應,大多數的 步驟都是在Spirng框架內部完成的。

1四、equals 與 == 的區別參考

    • 一、使用==比較原生類型如:boolean、int、char等等,使用equals()比較對象。
    • 二、==返回true若是兩個引用指向相同的對象,equals()的返回結果依賴於具體業務實現
    • 三、字符串的對比使用equals()代替==操做符

其主要的不一樣是一個是操做符一個是方法,==用於對比原生類型而equals()方法比較對象的相等性。

==是判斷兩個變量或實例是否是指向同一個內存空間 equals是判斷兩個變量或實例所指向的內存空間的值是否是相同。

1五、Switch可否用String作參數?

  -在java7以前,switch只能支持byte,short,char,int或其對應的封裝類以及Enum類型,在java7中string支持被加上了。long不被支持。

1六、Object有哪些公用方法

  -equals、clone、getClass、notify、notifyall、wait

17.hashcode的做用,與equal有什麼區別。

  --一樣用於鑑定2個對象是否相等,java集合中有list和set兩類,其中set不容許元素重複實現,那個這個不容許重複實現的方法,若是用equals去比較的話,若是存在1000個元素,你new一個新的元素出來,須要用1000次equal去逐個和他們比較是不是同一個對象,這樣會大大下降效率。hashcode其實是返回對象的內存儲地址,若是這個位置上沒有元素,就把元素直接存儲在上面,若是這個位置上已經存在元素,這個時候纔去調用equals方法與新元素進行比較。

18.String、StringBuffer、StringBuilder的區別

  --string是final修飾的因此不可變,stringBuffer線程安全,stringbuilder線程不安全。

19.override和overload的含義區別

  --override方法的重寫,發生在子類繼承父類時,要求方法名相同,參數列表相同,返回值類型相同

  --overload方法的重載,發生在同一個類中,要求方法名相同,參數列表不一樣,與返回值無關。

20.抽象類和接口的區別

  --一個類只能繼承單個類,可是能夠實現多個接口

  抽象類中的方法並不必定是要抽象的,而接口的全部方法必須是抽象的不能有方法體(java8中接口中也能夠有方法體,因爲接口是不能實例化的因此要聲明的方法必須是default,static,接口的實現類能夠調用接口中的default修飾的方法)

21.解析xml的幾種方式的原理特色

  dom解析,消耗內存

  sax解析,效率高

22.wait 和sleep的區別

  wait來自object類,sleep 來自Thread類

  wait()會釋放對象鎖,並須要經過notify,notifyAll來喚醒才能從新搶佔cpu資源

  sleep()不會釋放對象鎖,時間到繼續搶佔cpu資源

23.java中堆棧的區別,說下java的內存機制

  基本數據類型變量和對象的引用都是在棧中分配

  堆內存用來存放new建立的對象和數組

  類變量(static修飾的變量),程序在一加載的時候就在堆中爲類變量分配內存,堆中的內存地址存放在棧中

  實例變量:當你使用java關鍵字new的時候,系統在堆中開闢並不必定是連續的空間分配給變量,是根據零散的堆內存地址,經過哈希算法換算爲一長串數字以表徵這個變量在堆中的「物理位置」,實例變量的生命週期-當實例變量的引用丟失後,將gc(垃圾回收器)列入可回收「名單」中,但並非立刻就釋放堆中內存

  局部變量:由聲明在某方法,或某代碼段(好比for循環),執行到它的時候在棧中開闢內存,當局部變量一旦脫離做用域,內存當即釋放

24.java多態的事項原理

  抽象的講,多態的意思是統一消息能夠根據發送對象的不一樣採用多種不一樣的行爲方式。(發送消息就是函數調用)

  java是動態的語言,動態綁定程序調用方法在運行期才動態綁定,jvm經過參數的自動轉型來找到合適的方法。

25.單利模式

  單利模式的8中寫法,以及比較 

//推薦寫法,雙重檢查
public class Singleton {

    private static volatile Singleton singleton;

    private Singleton() {}

    public static Singleton getInstance() {
        if (singleton == null) {
            synchronized (Singleton.class) {
                if (singleton == null) {
                    singleton = new Singleton();
                }
            }
        }
        return singleton;
    }
}

26.java常見的設計模式以及應用(參考)

https://blog.csdn.net/xiaokang123456kao/article/details/76268527

27.jvm內存結構

  

  其中,方法區和堆全部線程共享。

  深刻理解JVM的內存結構及GC機制:https://blog.csdn.net/anjoyandroid/article/details/78609971

  Java 內存溢出(java.lang.OutOfMemoryError)的常見狀況和處理方式總結:http://outofmemory.cn/c/java-outOfMemoryError

  Java OutOfMemory異常清單 :https://blog.csdn.net/hzy38324/article/details/76719105?utm_source=gold_browser_extension

 

 

 

 

 

 

 

 

   https://www.cnblogs.com/java1024/p/7685400.html

  https://blog.csdn.net/litongwei7601/article/details/80132662

  https://www.cnblogs.com/jacksonxiao/p/8185569.html

相關文章
相關標籤/搜索