1. 程式人生 > >JAVA面試通關知識點必備(持續更新中)

JAVA面試通關知識點必備(持續更新中)

1.JAVA基本資料型別包括哪些?

  • 基本資料型別包括byte,short,int,long,float,double,boolean,char.

2.String能被繼承嗎?為什麼?

  • java.lang.String類是final型別的,因為不可以繼承這個類,不能修改這個類,為了提高效率節省空間,我們應該用StringBuffer類。

3.java集合有哪些?哪些是執行緒安全的?

  • ①Collection介面:單列集合,有兩個子介面
    • List:有三個實現類
      • *ArrayList:底層是陣列,每次刪除都要建立新陣列,效率低,查詢快
      • *LinkedList:底層是雙向連結串列,適合增刪元素,不適合查詢
      • *Vector:底層也是陣列,方法是Synchronize的,所以是執行緒安全的,效率低
    • Set:有兩個實現類
      • *HashSet:底層是雜湊表,儲存的元素無序,不可重複
      • *TreeSet:是SortedSet介面的實現類,儲存的元素是有序的
  • ②Map介面:雙列集合(value-key)
    • HashMap:非執行緒安全,高效,支援null
    • HashTable:執行緒安全,低效,不支援null
    • TreeMap:能夠把記錄值根據鍵排序,預設是鍵值的升序

4.HashMap和HashTable的區別?

  • HashMap是非執行緒安全的,HashTable是執行緒安全的
  • HashMap支援null鍵值,效率較高,HashTable不支援null,效率較低
  • HashTable的方法是Synchronize的,當多個執行緒訪問HashTable時,不需要自己為它的方法同步,HashMap就需要外同步例如:Map map=new  Collections.synchronizedMap(new  HashMap())

5.實現多型的方法?

  • 虛方法virtual:虛方法可以給父類的方法一個實現,也必須有實現部分,哪怕是空方法
  • 抽象方法abstract:抽象類不能被例項化,只能被其他類繼承,繼承抽象類的子類必須把抽象類中的抽象成員都重寫(除非子類也是抽象類)
  • 介面interface:介面實現了多型,介面解決了類的多繼承的問題,介面解決了類繼承以後體積龐大的問題。介面之間可以實現多繼承

6.用String   s=new String("xyz")   建立了幾個物件?

  • 首先String s是定義了一個字串變數,並未產生物件,=不產生物件,那麼只有後面的new String("xyz")了。把它拆分成"xyz"和new String(),首先在字串常量池去尋找有沒有"xyz"這個字串,沒有就建立一個“xyz”字串物件在棧中,然後new String把這個字串物件拷貝一份到堆中,返回這個物件的引用。所以一共產生兩個物件
  • 試問s變數儲存在堆中還是棧中?關鍵點是區分s是成員變數還是區域性變數,如果是區域性變數在方法體內,它就儲存在棧中,如果是成員變數那麼久跟隨成員物件儲存在堆中。

7.實現多執行緒的方法?

  • 繼承Thread類
  • 實現Runnable介面
  • 實現Callable介面(被執行緒執行後,有返回值)(Future可以取得返回值)點選

8.實現多執行緒我們使用Thread還是Runnable?

  • 當我們知道Java只支援單繼承的時候,Runnable可能會好一些,介面可以被多個類實現。

9.HashMap的工作原理?

  • Java 中的 HashMap 是以鍵值對(key-value)的形式儲存元素的。HashMap 需要一個 hash 函式, 它使用 hashCode()和 equals()方法來向集合/從集合新增和檢索元素。當呼叫 put()方法的時 候,HashMap 會計算 key 的 hash 值,然後把鍵值對儲存在集合中合適的索引上。如果 key 已經存在了,value 會被更新成新值。HashMap 的一些重要的特性是它的容量(capacity),負 載因子(load factor)和擴容極限(threshold resizing)

10.執行緒都有哪些狀態?

  • 新建狀態:剛被new出來,此時什麼都沒有做
  • 就緒狀態:當執行緒呼叫了Start()方法,執行緒就啟動了,不一定立刻開始執行,還能得到cpu才能執行
  • 執行狀態:執行緒獲得cpu的時候,執行緒開始執行,真正開始執行run方法
  • 阻塞狀態:i/o阻塞,等待i/o操作完成                 同步阻塞,等待獲取鎖
  • 死亡狀態:執行緒完成了執行任務

11.String,StringBuffer和StringBuilder的區別?

  • StringBuffer是執行緒安全的,StringBuilder是執行緒不安全的
  • 執行速度,String<StringBuffer<StringBuilder
  • 原因是String是字串常量,一旦被new過就不可變了,每一次字串的改變都是建立了新物件和垃圾回收的過程,所以速度慢,另外兩個都是字串變數,更改並不會建立新物件,StringBuffer是執行緒安全的,效率較低,比StringBuilder慢。

12.Spring中最重要的兩個方面是什麼,簡述一下?

  • IOC:控制反轉,物件的建立不是通過new來建立,而是交給spring配置建立物件,IOC 或 依賴注入把應用的程式碼量降到最低。它使應用容易測試,單元測試不再需要單例和JNDI查詢機制。最小的代價和最小的侵入性使鬆散耦合得以實現。
  • AOP:面向切面程式設計,擴充套件功能不通過原始碼實現,採用橫向抽取機制,取代了傳統縱向繼承體系重複性程式碼。

13.Spring中用到了哪些設計模式?

  • 工廠模式:Spring的Bean管理裡用到了工廠模式,把物件的建立和使用相分離
  • 單例模式:Spring的Bean 預設都是singleton,即唯一的標識去工作
  • 代理模式:Spring Aop中用到了JDK 的動態代理方法
  • 觀察者模式:Spring中listener的實現基本都是觀察者,監控想監控的物件
  • 此外還有幾種...面試的時候沒有必要說完

14.解釋一下Synchronize關鍵字的作用?

  • Synchronize是Java中的一個關鍵字,是一個同步鎖,可以作用在幾個方面
    • 修飾一個程式碼塊,被修飾的程式碼塊被稱為同步語句塊,作用範圍就是{}裡的程式碼,作用的物件是呼叫這個程式碼塊的物件。
    • 修飾一個方法,被修飾的方法叫做同步方法,作用範圍就是整個方法,作用物件就是呼叫這個方法的物件。
    • 修飾一個靜態方法,作用範圍就是整個靜態方法,作用物件就是呼叫這個靜態方法的物件。
    • 修飾一個類,作用物件就是類的所有物件   詳細內容 請點選

15.對Sql有哪些常見的優化方式?

  • 對查詢進行優化,儘量避免全表掃描,首先考慮在where和orderby涉及的列上建立索引
  • 儘量避免判斷為null操作,計算機會放棄索引去掃描全表
  • 索引上,用>=代替=
  • sql語句優化
  • 用exists代替in
  • 使用groupby之前可以把不需要的資料先過濾掉
  • 儘量多使用commit,會因為commit釋放資源效率提高
  • 儘量避免使用*
  • 使用別名

16.Mybatis的工作原理

  • MyBatis應用程式根據XML配置檔案建立SqlSessionFactory,SqlSessionFactory在根據配置,配置來源於兩個地方,一處是配置檔案,一處是Java程式碼的註解,獲取一個SqlSession。SqlSession包含了執行sql所需要的所有方法,可以通過SqlSession例項直接執行對映的sql語句,完成對資料的增刪改查和事務提交等,用完之後關閉SqlSession。

17.Spring MVC 的工作原理

  • 第一步:發起請求到前端控制器(DispatherServlet)
  • 第二步:前端控制器請求處理器對映器(HandlerMapping)查詢處理器(Handler)
    • 可以根據xml配置,註解進行查詢
  • 第三步:處理器對映器向前端控制器返回Handler
  • 第四步:前端控制器呼叫處理器介面卡(HandlerAdapter)去執行Handler
  • 第五步:處理器介面卡去執行Handler
  • 第六步:Handler執行完成向處理器介面卡返回ModelAndView
    • ModelAndView是springmvc框架的一個底層物件
  • 第七步:處理器介面卡向前端控制器返回ModelAndView
  • 第八步:前端控制器請求檢視解析器去進行檢視解析(jsp)
  • 第九步:檢視解析器向前端控制器返回View
  • 第十步:前端控制器進行檢視渲染
  • 第十一步:前端控制器相應到使用者
  • 涉及到的元件
    • 前端控制器DispatherServlet
      • 作用是接收請求,響應結果,相當於轉發器
    • 處理器對映器HandlerMapping
      • 作用是根據請求的URL查詢Handler
    • 處理器Handler(需要我們實現)
    • 處理器介面卡HandlerAdapter
      • 作用是根據特定規則(HandlerAdapter要求的規則)去執行Handler
      • 注意:編寫Handler時按照HandlerAdapter的要求去做,才能被介面卡識別
    • 檢視解析器Viewresolver
      • 作用是進行檢視解析,根據邏輯檢視解析成真正的檢視

18.JVM

19.不使用第三方變數,實現兩個整形變數交換?(異或運算子的考查)

  • 一個數杯同一個數異或兩次,原數不變,例如5^10^10=5
  • 所以我們可以用異或交換兩個數的值
  • int x=5,y=10
  • x=x^y;//x=5^10
  • y=x^y;//y=5^10^10=5
  • x=x^y;//x=5^10^5=10
  • 我們發現x,y的值發生了交換。

20.最有效計算2*8的值(位移運算子的考查)

  • 2<<3;//2的二進位制左移3位相當於乘以2的3次冪

21.抽象類和介面的區別?

  • 介面中所有的方法隱含的都是抽象的。而抽象類則可以同時包含抽象和非抽象方法
  • 類可以實現多個介面,但是隻能繼承一個抽象類
    • 類如果要實現一個介面,它必須要實現介面宣告的所有方法。但可以不實現抽象類宣告的所有方法,當然,在這種情況下,類必須宣告是抽象的
    • 抽象類可以在不提供介面方法的情況下實現介面 
    • Java介面中宣告的變數預設都是final的。抽象類可以包含非final的變數
    • Java介面中成員函式預設是public的,抽象類的成員函式可以是private,protected或者是public
    • 介面是絕對抽象的,不可以被例項化。抽象類也不可以被例項化。但是,如果它包含main方法的話可以被呼叫的。

22.JVM的垃圾回收原理?

 

23.sleep()和wait()方法的區別?

  • 每個物件都有一個鎖來控制同步訪問,Synchronized關鍵字可以和物件的鎖互動,來實現同步方法或同步塊。sleep()方法正在執行的執行緒主動讓出CPU(然後CPU就可以去執行其他任務),在sleep指定時間後CPU再回到該執行緒繼續往下執行(注意:sleep方法只讓出了CPU,而並不會釋放同步資源鎖!!!)wait()方法則是指當前執行緒讓自己暫時退讓出同步資源鎖,以便其他正在等待該資源的執行緒得到該資源進而執行,只有呼叫了notify()或notifyAll()方法,之前呼叫wait()的執行緒才會解除wait狀態,可以去參與競爭同步資源鎖,進而得到執行。(注意:notify的作用相當於叫醒睡著的人,而並不會給他分配任務,就是說notify只是讓之前呼叫wait的執行緒有權利重新參與執行緒的排程)
  • sleep()方法可以在任何地方使用;wait()方法則只能在同步方法或同步塊中使用;
  • sleep()是執行緒執行緒類(Thread)的方法,呼叫會暫停此執行緒指定的時間,但監控依然保持,不會釋放物件鎖,到時間自動恢復;wait()是Object的方法,呼叫會放棄物件鎖,進入等待佇列,待呼叫notify()/notifyAll()喚醒指定的執行緒或者所有執行緒,才會進入鎖池,不再次獲得物件鎖才會進入執行狀態;

24.執行緒關閉的幾種方式?

  • 1.設定標誌符號,使執行緒正常退出,也就是當run()方法完成後執行緒終止

  • 2.使用interrupt()方法中斷執行緒

  • 3.使用stop方法強行終止執行緒(不推薦使用,Thread.stop, Thread.suspend, Thread.resume 和Runtime.runFinalizersOnExit 這些終止執行緒執行的方法已經被廢棄,使用它們是極端不安全的!)

25.servlet為何設計成單例多執行緒?

  • servlet中的init方法只有在啟動(例如web容器啟動,要看loadOnStartup的設定)的時候呼叫,也就是隻初始化一次,這就是單例項。
  • servlet在處理請求的時候 呼叫的是service方法,這個方法可以處理多個客戶端的請求。 具體訪問時: JSP 在web容器中"翻譯成servlet"由容器執行,web 容器本身就是提供的多執行緒,A,B,C 3個訪問,建立3個獨立的執行緒組,然後執行一個servlet。依次執行。

26.jsp的內建物件有哪些?

  • request物件  request 物件是 javax.servlet.httpServletRequest型別的物件。 該物件代表了客戶端的請求資訊,主要用於接受通過HTTP協議傳送到伺服器的資料。(包括頭資訊、系統資訊、請求方式以及請求引數等)。request物件的作用域為一次請求。
  •  response物件  response 代表的是對客戶端的響應,主要是將JSP容器處理過的物件傳回到客戶端。response物件也具有作用域,它只在JSP頁面內有效。
  •  session物件  session 物件是由伺服器自動建立的與使用者請求相關的物件。伺服器為每個使用者都生成一個session物件,用於儲存該使用者的資訊,跟蹤使用者的操作狀態。session物件內部使用Map類來儲存資料,因此儲存資料的格式為 “Key/value”。 session物件的value可以使複雜的物件型別,而不僅僅侷限於字串型別。
  •  application物件   application 物件可將資訊儲存在伺服器中,直到伺服器關閉,否則application物件中儲存的資訊會在整個應用中都有效。與session物件相比,application物件生命週期更長,類似於系統的“全域性變數”。  
  • out 物件  out 物件用於在Web瀏覽器內輸出資訊,並且管理應用伺服器上的輸出緩衝區。在使用 out 物件輸出資料時,可以對資料緩衝區進行操作,及時清除緩衝區中的殘餘資料,為其他的輸出讓出緩衝空間。待資料輸出完畢後,要及時關閉輸出流。
  • pageContext 物件  pageContext 物件的作用是取得任何範圍的引數,通過它可以獲取 JSP頁面的out、request、reponse、session、application 等物件。pageContext物件的建立和初始化都是由容器來完成的,在JSP頁面中可以直接使用 pageContext物件。
  • config 物件  config 物件的主要作用是取得伺服器的配置資訊。通過 pageConext物件的 getServletConfig() 方法可以獲取一個config物件。當一個Servlet 初始化時,容器把某些資訊通過 config物件傳遞給這個 Servlet。 開發者可以在web.xml 檔案中為應用程式環境中的Servlet程式和JSP頁面提供初始化引數。  
  • page 物件  page 物件代表JSP本身,只有在JSP頁面內才是合法的。 page隱含物件本質上包含當前 Servlet介面引用的變數,類似於Java程式設計中的 this 指標。  
  • exception 物件  exception 物件的作用是顯示異常資訊,只有在包含 isErrorPage="true" 的頁面中才可以被使用,在一般的JSP頁面中使用該物件將無法編譯JSP檔案。excepation物件和Java的所有物件一樣,都具有系統提供的繼承結構。exception 物件幾乎定義了所有異常情況。在Java程式中,可以使用try/catch關鍵字來處理異常情況; 如果在JSP頁面中出現沒有捕獲到的異常,就會生成 exception 物件,並把 exception 物件傳送到在page指令中設定的錯誤頁面中,然後在錯誤頁面中處理相應的 exception 物件。

27.轉發和重定向的區別?

  • 轉發在伺服器端完成的;重定向是在客戶端完成的
  • 轉發的速度快;重定向速度慢
  • 轉發的是同一次請求;重定向是兩次不同請求
  • 轉發不會執行轉發後的程式碼;重定向會執行重定向之後的程式碼
  • 轉發位址列沒有變化;重定向位址列有變化
  • 轉發必須是在同一臺伺服器下完成;重定向可以在不同的伺服器下完成

28.http中get和post的區別?

  • get是從伺服器端取得資料,post是向伺服器端傳送資料
  • get會在請求中把資訊附加在URL上,是非常不安全的,post把Http包中比較安全一些
  • 一般來說get有對資料大小有限制(主要是瀏覽器對URL的限制),而post請求理論上沒有限制

29.Spring宣告物件有幾種方式?

  • 無參構造方法(我們常用的get和set方法,<bean id="user" class="CreateObject.User">)
  • 有參構造方法(<bean id="user" class="CreateObject.User"> <!-- index表示引數順序,type為引數型別 value為引數值 --> <constructor-arg value="100" index="0" type="int"></constructor-arg>)
  • 工廠模式(<!-- 建立工廠 --> <bean id="factory" class="CreateObject.ObjectFactory"></bean> <!-- 建立user物件,用factory的例項方法 --> <!-- factory-bean指定的是具體物件 --> <bean id="user4" factory-bean="factory" factory-method="getInstance"></bean> <!-- 靜態方法 --> <!-- 靜態方法由類呼叫,需要指定類的位置,factory-method指定的是工廠內的靜態方法 --> <bean id="user" class="CreateObject.ObjectFactory" factory-method="getStaticInstance"></bean> </beans>)

30.Mybatis中${}和#{}的區別?

  • #將傳入的資料都當成一個字串,會對自動傳入的資料加一個雙引號。如:order by #user_id#,如果傳入的值是111,那麼解析成sql時的值為order by "111", 如果傳入的值是id,則解析成的sql為order by "id".  $將傳入的資料直接顯示生成在sql中。如:order by $user_id$,如果傳入的值是111,那麼解析成sql時的值為order by 111,  如果傳入的值是id,則解析成的sql為order by id.  
  • #方式能夠很大程度防止sql注入。  $方式無法防止Sql注入。
  • $方式一般用於傳入資料庫物件,例如傳入表名.  
  • 一般能用#的就別用$.
  • MyBatis排序時使用order by 動態引數時需要注意,用$而不是#

31.volatile關鍵字的作用?

  • 保證了不同執行緒對這個變數進行操作時的可見性,即一個執行緒修改了某個變數的值,這新值對其他執行緒來說是立即可見的。
  • 禁止進行指令重排序。
  • 看到一篇文章寫的非常清楚     詳情點選

32.JAVA中有哪些鎖?

JAVA中鎖的總結

33.switch中可以填哪些值?

 

34.怎麼避免死鎖?

35.什麼是事務?

36.什麼是反射機制?

37.

38.final關鍵字有什麼作用?

39.過載和重寫有什麼區別?

  • 方法的重寫Overriding和過載Overloading是Java多型性的不同表現。
  • 重寫Overriding是父類與子類之間多型性的一種表現,過載Overloading是一個類中多型性的一種表現。
  • 如果在子類中定義某方法與其父類有相同的名稱和引數,我們說該方法被重寫 (Overriding)。子類的物件使用這個方法時,將呼叫子類中的定義,對它而言,父類中的定義如同被“遮蔽”了。如果在一個類中定義了多個同名的方法,它們或有不同的引數個數或有不同的引數型別,則稱為方法的過載(Overloading)。Overloaded的方法是可以改變返回值的型別。

40.tomcat下怎麼佈置專案?

 

41.單例模式有哪些常見型別?

42.JAVA使用JDBC的步驟?

  • 載入JDBC驅動程式:
  • 提供JDBC連線的URL 。 
  • 建立資料庫的連線 
  • 建立一個Statement
  • 執行SQL語句
  • 處理結果 兩種情況:
  • 關閉JDBC物件 操作完成以後要把所有使用的JDBC物件全都關閉,以釋放JDBC資源         詳情點選

43.Mysql資料庫索引有哪些方式?

 

44.類和物件有什麼區別?

  • 類是一類物體的共同特性的抽象.物件是類的一個例項.

45.JSP是如何被處理的?

  • 瀏覽器首先要請求一個以.jsp副檔名結尾的頁面,發起jsp請求,然後web伺服器讀取這個請求,使用jsp編譯器把jsp頁面變成一個servlet類,只有當第一次請求頁面或者時候jsp檔案發生改變的時候jsp文字才會被編譯,然後伺服器呼叫servlet類,處理瀏覽器的請求,一旦請求執行結束,servlet會把響應傳送到客戶端。