1. 程式人生 > >我的java面試經驗總結

我的java面試經驗總結

                                                                                         本寶寶的Java面試經歷

 

1.一個網上商城的開發流程,你會寫需求文件嗎(ceo問)


2.介紹ajax,ajax為什麼可以實現區域性重新整理。(以下都為專案經理所問)

     實現區域性重新整理,原文: https://blog.csdn.net/fyxxq/article/details/22219361

     Overriew: onReadyStateChange被回撥函式賦值,則能實現非同步呼叫,回撥函式直接操作DOM,則能實現區域性重新整理。那麼XMLHttpRequest的onReadyStateChange如何知道服務ready了呢?狀態如何change了呢(觀察者模式)?則是通過客戶端對服務的狀態詢問(定期輪詢)所實現的。
    (1)  XMLHttpRequest 負責與伺服器端的通訊,其內部有很多重要的屬性:readyStatus=4,status=200等等。當XMLHttpRequest的整體狀態並且保證它已經完成(readyStatus=4),即資料已經發送完畢。然後根據伺服器的設定詢問(類似於客戶端會輪詢伺服器的返回狀態,仍然是http短連線,並非長連線的伺服器端push)請求狀態,如果一切已經就緒(status=200),那麼就執行需要的操作。操作一般就是直接操作DOM,所以AJAX能做到所謂的“無重新整理”使用者體驗

    (2)  那麼在AJAX客戶端如何做到的非同步呢?實際上就是Javascript的回撥函式起的作用提供一個回撥JavaScript函式,一旦伺服器響應可用,該函式就被執行

    (3) req.onreadystatechange = callback
   req.open("GET", url, true)

    第一行定義了JavaScript回撥函式,一旦響應就緒它就自動執行,而req.open()方法中所指定的“true”標誌說明想要非同步執行該請求。一旦伺服器處理完XmlHttpRequest並返回給瀏覽器,使用req.onreadystatechange指派所設定的回撥方法將被自動呼叫。
 

3.介紹shiro的認證和授權

      原文:https://blog.csdn.net/qq_34409255/article/details/80667995

      shiro是一個安全框架,是Apache的一個子專案。shiro提供了:認證、授權、加密、會話管理、與web整合、快取等

      Authentication:使用者身份識別,可以認為是登入; 
      Authorization:授權,即許可權驗證,驗證某個已認證的使用者是否擁有某個許可權;即判斷使用者是否能做事情,常見的如:驗證某個使用者是否擁有某個角色。或者細粒度的驗證某個使用者對某個資源是否具有某個許可權。
   其他: 

      Session Manager:會話管理,即使用者登入後就是一次會話,在沒有退出之前,它的所有資訊都在會話中;會話可以是普通 JavaSE 環境的,也可以是如 Web 環境的。
     Cryptography:加密,保護資料的安全性,如密碼加密儲存到資料庫,而不是明文儲存。
     Web Support:Web支援,可以非常容易的整合到 web 環境。
     Caching:快取,比如使用者登入後,其使用者資訊、擁有的角色/許可權不必每次去查,這樣可以提高效率。
     Concurrency:shiro 支援多執行緒應用的併發驗證,即如在一個執行緒中開啟另一個執行緒,能把許可權自動傳播過去。
     Testing:提供測試支援。
     Run As:允許一個使用者假裝為另一個使用者(如果他們允許)的身份進行訪問。
      Remember Me:記住我,這個是非常常見的功能,即一次登入後,下次再來的話不用登入了。

4.介紹md5

      md5資訊摘要演算法,只能加密不能解密,一種被廣泛使用的密碼雜湊函式,可以產生出一個128位(16位元組)的雜湊值(hash value),用於確保資訊傳輸完整一致。一般使用隨機生成的鹽值來進行加密。將密文和鹽值存放在資料庫,用於登入時認證使用者。


5.reddis叢集怎麼搭建

       1)第一步建立例項:建立/usr/local/redis_cluster目錄,在裡面建立建立6個redis例項,埠號從7001~7006
        2)第二步修改redis的配置檔案:修改埠號,修改埠號從7001 ~ 7006、開啟cluster-enable前面的註釋、註釋掉繫結ip
        3)第三步複製ruby指令碼:把建立叢集的ruby指令碼複製到redis-cluster目錄下
        4)第四步啟動6個redis例項:
            (1)/usr/local/redis/bin/redis-server /usr/local/redis-cluster/800*/redis.conf
            (2)ps -ef | grep redis 檢視是否啟動成功
        5)第五步建立叢集:把6個例項加入到叢集
            ./redis-trib.rb create --replicas 1 192.168.2.10:7001 192.168.2.10:7002 192.168.2.10:7003 192.168.2.10:7004 192.168.2.10:7005  192.168.2.10:7006

6.介紹多執行緒,開多執行緒和記憶體的關係

         執行緒安全就是多執行緒訪問時,採用了加鎖機制,當一個執行緒訪問該類的某個資料時,進行保護,其他執行緒不能進行訪問直到該執行緒讀取完,其他執行緒才可使用。不會出現資料不一致或者資料汙染。
7.建立執行緒,以及其生命週期

    1)繼承Thread類建立執行緒,我們考慮類只能單繼承不常使用。
    2)實現Runnable介面建立執行緒,常用因為可以多實現介面我們常使用它建立執行緒。
    3)實現Callable介面通過FutureTask包裝器來建立Thread執行緒
    4)執行緒安全理解:執行緒安全就是多執行緒訪問時,採用了加鎖機制,當一個執行緒訪問該類的某個資料時,進行保護,其他執行緒不能進行訪問直到該執行緒讀取完,其他執行緒才可使用。不會出現資料不一致或者資料汙染。

      生命週期:

      1、 新建狀態:當程式使用new關鍵字建立了一個執行緒之後,該執行緒就處於新建狀態,此時僅由JVM為其分配記憶體,並初始化其成員變數的值
        2、就緒狀態:當執行緒物件呼叫了start()方法之後,該執行緒處於就緒狀態。Java虛擬機器會為其建立方法呼叫棧和程式計數器,等待排程執行
        3、執行狀態:如果處於就緒狀態的執行緒獲得了CPU,開始執行run()方法的執行緒執行體,則該執行緒處於執行狀態
        4、阻塞狀態:當處於執行狀態的執行緒失去所佔用資源之後,便進入阻塞狀態
            4.1、當佔用CPU的時間片刻用完(Thread.yield()),執行緒進入到阻塞狀態;需要再一次被選中排程才能再次進入就緒狀態。
            4.2、當遇到了synchronized執行緒進入阻塞狀態,需要拿到物件所標記才能再次進入就緒狀態。
            4.3、當執行緒呼叫了某個物件的wait()方法時;也會使執行緒進入阻塞狀態;需要用notify()或者notifyall()方法來喚醒。
            4.4、一個執行緒呼叫了另一個執行緒的join()方法時,當前執行緒進入阻塞狀態。等新加入的執行緒執行結束後會結束阻塞狀態,進入就緒狀態。
            4.5、呼叫了Thread的sleep(long millis)。執行緒睡眠時間到了會自動進入就緒狀態。
            4.6、當遇到使用者輸入時候也會進入阻塞狀態;要等待使用者結束才能再次就緒狀態。
            4.7、執行緒從阻塞狀態只能進入就緒狀態,而不能直接進入執行狀態,即結束阻塞的執行緒需要重新進入可執行池中,等待系統的排程。
        5、死亡狀態:執行緒的run()方法正常執行完畢或者執行緒丟擲一個未捕獲的異常(Exception)、錯誤(Error),執行緒就進入死亡狀態。一旦進入死亡狀態,執行緒將不再擁有執行的資格,也不能轉換為其他狀態。

 

8.介紹關係型資料庫和非關係型資料庫

 


9.java的三大特徵

     封裝、繼承、多型
10.http協議

1、Http狀態碼有哪些

    200 – 請求成功;301 – 資源(網頁等)被永久轉移到其它URL;404 – 請求的資源(網頁等)不存在;500 – 內部伺服器錯誤
    1**資訊:伺服器收到請求,需要請求者繼續執行操作(100Continue繼續。客戶端應繼續其請求)
    2**成功:操作被成功接收並處理(200 – 請求成功)
    3**重定向:需要進一步的操作以完成請求(301 – 資源(網頁等)被永久轉移到其它URL)
    4**客戶端錯誤:請求包含語法錯誤或無法完成請求(404 – 請求的資源(網頁等)不存在)
    5**伺服器錯誤:伺服器在處理請求的過程中發生了錯誤(500 – 內部伺服器錯誤)

2、Http協議中TCP三次握手和四次揮手的流程
    三次握手:首先Client端傳送連線請求報文,Server段接受連線後回覆ACK=1的報文,併為這次連線分配資源。Client端接收到ACK報文後也向Server段發出ACK=(服務的seq+1)的報文,並分配資源,這樣TCP連線就建立了。
        1)連線請求(SYN=1, seq=x):客戶端向伺服器傳送一個 TCP 的 SYN 標誌位置1的包,指明客戶端打算連線的伺服器的埠,以及儲存在包頭的序列號(Sequence Number)欄位裡初始序號X。
        2)授予連線(給出響應;SYN=1, ACK=1, seq=y, ACKnum=x+1):伺服器給客戶端給出響應;伺服器發回確認包(ACK)應答。即 SYN 標誌位和 ACK 標誌位均為1。伺服器端選擇自己 ISN 序列號,放到 Seq 域裡,同時將確認序號(Acknowledgement Number)設定為客戶的 ISN 加1,即X+1。
        3)確認連線(ACK=1,ACKnum=y+1):客戶端再次傳送確認包(ACK),SYN 標誌位為0,ACK 標誌位為1,並且把伺服器發來 ACK 的序號欄位+1,放在確定欄位中傳送給對方,並且在資料段放寫ISN的+1
傳送完畢後,客戶端進入?ESTABLISHED?狀態,當伺服器端接收到這個包時,也進入?ESTABLISHED?狀態,TCP 握手結束。
        
    四次揮手:
        1)傳送關閉請求(FIN=1,seq=x):客戶端傳送一個 FIN 標誌位置為1的包,表示自己已經沒有資料可以傳送了,但是仍然可以接受資料。傳送完畢後,客戶端進入 FIN_WAIT_1 狀態。
        2)給出響應(ACK=1,ACKnum=x+1):伺服器端確認客戶端的 FIN 包,傳送一個確認包,表明自己接受到了客戶端關閉連線的請求,但還沒有準備好關閉連線。傳送完畢後,伺服器端進入 CLOSE_WAIT 狀態,客戶端接收到這個確認包之後,進入 FIN_WAIT_2 狀態,等待伺服器端關閉連線。
        3)伺服器準備關閉(FIN=1,seq=y):伺服器端準備好關閉連線時,向客戶端傳送結束連線請求,FIN 置為1。傳送完畢後,伺服器端進入 LAST_ACK 狀態,等待來自客戶端的最後一個ACK。
        4)客戶端確認關閉(ACK=1,ACKnum=y+1):客戶端接收到來自伺服器端的關閉請求,傳送一個確認包,並進入 TIME_WAIT狀態,等待可能出現的要求重傳的 ACK 包。伺服器端接收到這個確認包之後,關閉連線,進入 CLOSED 狀態。客戶端等待了某個固定時間(兩個最大段生命週期,2MSL,2 Maximum Segment Lifetime)之後,沒有收到伺服器端的 ACK ,認為伺服器端已經正常關閉連線,於是自己也關閉連線,進入 CLOSED 狀態。?
    【問題1】為什麼連線的時候是三次握手,關閉的時候卻是四次握手?
        答:因為當Server端收到Client端的SYN連線請求報文後,可以直接傳送SYN+ACK報文。其中ACK報文是用來應答的,SYN報文是用來同步的。但是關閉連線時,當Server端收到FIN報文時,很可能並不會立即關閉SOCKET,所以只能先回復一個ACK報文,告訴Client端,"你發的FIN報文我收到了"。只有等到我Server端所有的報文都發送完了,我才能傳送FIN報文,因此不能一起傳送。故需要四步握手。
    【問題2】為什麼TIME_WAIT狀態需要經過2MSL(最大報文段生存時間)才能返回到CLOSE狀態?
        答:雖然按道理,四個報文都發送完畢,我們可以直接進入CLOSE狀態了,但是我們必須假象網路是不可靠的,有可以最後一個ACK丟失。所以TIME_WAIT狀態就是用來重發可能丟失的ACK報文。

3、Http協議中Get和Post請求方式的區別
    1)請求報文格式不同:即Get使用Url或cookie傳引數,而post使用body傳引數
    2)對資料的長度限制不同:get的url會有長度限制(最大2048個字元),而Post資料則可以不受url的限制,可以很大
    3)對資料型別限制不同:GET只允許ASCII碼字元;POST沒有限制;也可以是二進位制資料
    4)安全性不同:post比get安全,因為傳遞引數在url中不可見;
    5)細分用途不同:get請求主要用於獲取、查詢資源資訊;post請求,更新資料,一般要到form(表單),比較麻煩。
    6)響應速度不同:GET速度快;POST速度慢


11.介紹多型

      父類引用指向子類物件,過載和重寫都是多型的表現形式
12.介紹gc

 原:https://blog.csdn.net/yuexianchang/article/details/74025140

  1.根據Java虛擬機器規範,JVM將記憶體劃分為:

  • New(年輕代)——年輕代用來存放JVM剛分配的Java物件

                        Eden:Eden用來存放JVM剛分配的物件

                        Survivor1

                        Survivro2:兩個Survivor空間一樣大,當Eden中的物件經過垃圾回收沒有被回收掉時,會在兩個Survivor之間來   回Copy,當滿足某個條件,比如Copy次數,就會被Copy到Tenured。顯然,Survivor只是增加了物件在年輕代中的逗留時間,增加了被垃圾回收的可能性。 

  • Tenured(年老代)- ——年輕代中經過垃圾回收沒有回收掉的物件將被Copy到年老代
  • 永久代(Perm)—— 永久代存放Class、Method元資訊,其大小跟專案的規模、類、方法的量有關,一般設定為128M就足夠,設定原則是預留30%的空間。

   New和Tenured屬於堆記憶體,堆記憶體會從JVM啟動引數(-Xmx:3G)指定的記憶體中分配

  Perm不屬於堆記憶體,有虛擬機器直接分配,但可以通過-XX:PermSize -XX:MaxPermSize等引數調整其大小

2.垃圾回收演算法

  垃圾回收演算法可以分為三類,都基於標記-清除(複製)演算法:

  • Serial演算法(單執行緒)
  • 並行演算法
  • 併發演算法

  JVM會根據機器的硬體配置對每個記憶體代選擇適合的回收演算法,比如,如果機器多於1個核,會對年輕代選擇並行演算法,關於選擇細節請參考JVM調優文件。


13.java中有沒有指標和goto

    java中沒有指標,Java中有goto保留字,但並沒有實際使用它。


14.二叉樹、連結串列

各位兄弟百度吧···


15.分頁
使用了PageHelper外掛來進行資料分頁
      

使用了PageHelper外掛來進行資料分頁
		@RequestMapping("/emps")
    
public String list(@RequestParam(required =false,defaultValue = "1",value = "pn") Integerpn,
                       Map<String,Object> map)
{
 
       	 //引入分頁查詢,使用PageHelper分頁功能
        
	//在查詢之前傳入當前頁,然後多少記錄
        
	PageHelper.startPage(pn,5);
        
	//startPage後緊跟的這個查詢就是分頁查詢
        
	List<Employee> emps = employeeService.getAll();
        
	//使用PageInfo包裝查詢結果,只需要將pageInfo交給頁面就可以
        
	PageInfo pageInfo = new PageInfo<>(emps,5);
        
	//pageINfo封裝了分頁的詳細資訊,也可以指定連續顯示的頁數
 
        
	map.put("pageInfo",pageInfo);
        
	return "list";

}





實現mysql的分頁?Oracle的分頁?
        1)mysql分頁:mysql的分頁sql格式是:select * from table limit (start-1)*limit,limit; 其中start是頁碼,limit是每頁顯示的條數。
            例:select * from test limit 3,5;--查詢test從3開始,5條資料  
        2)Oracle分頁:使用rownum使其重新排列,從1開始
            例:select rownum,rowid,tt.* from t_user5 tt where rownum<=3 and sex=1 and  rownum>=2

 

16.switch中可以float,long和String嗎

      switch中只能為int型別。由於byte、char、short、int在底部使用時會轉換成int型別所以他們可以作為引數。而long、float不可以,在jdk7之後Stirng也可以作為引數。


17.資料庫執行計劃
18.分散式的事務控制
19.資料庫的函式
20.儲存過程,觸發器,遊標

    看我plsql總結
21.泛型
22.反射


23.SSM框架的流程

    看我專門總結
24.springmvc的執行流程
25.spring的事務
26.spring的核心思想
27.linux的發展史,和window的區別,以及命令
28.jvm效能調優
29.馮諾依曼原理和哈佛原理

30.資料庫索引,以及最左原則

31.流量的削峰

31.雙親委託機制

32.跨域、同源的問題

   推薦:https://www.cnblogs.com/fengli9998/p/6731661.html

 

33.http和https的區別

34.如何建立索引,索引會影響什麼的效能

35.資料庫常用的型別

36.什麼是序列化,為什麼使用序列化

37.為什麼使用xml,它的作用是啥

38.常用排序演算法

39.cpu使用率過高,cpu如何調優

40.單列模式你認為最優的模式

41.正則表示式的使用

42.公平鎖和不公平鎖

43.在前後端的互動上,websocket是怎麼實現的,原理是什麼?

websocket是一個持久化的協議,它實現了瀏覽器與伺服器全雙工(full-duplex)通訊——允許伺服器主動傳送資訊給客戶端,它是基於HTTP協議的,但它只是借用了HTTP的協議來完成一部分握手,例如:客戶端傳送請求到伺服器,裡面指明用的websocket協議,和確定連線的key,不同的服務名,協議版本;然後伺服器返回接受請求的資訊,資訊包括加密後的key和哪個服務;經過這些操作後接下就按照websocket協議進行了。websocket只需要經過一次請求就能做到源源不斷的資訊傳送。

 

44.一級快取和二級快取的區別?

(1)一級快取基於sqlSession預設開啟,在操作資料庫時需要構造SqlSession物件,在物件中有一個HashMap用於儲存快取資料。不同的SqlSession之間的快取資料區域是互相不影響的。一級快取的作用域是SqlSession範圍的,當在同一個sqlSession中執行兩次相同的sql語句時,第一次執行完畢會將資料庫中查詢的資料寫到快取(記憶體),第二次查詢時會從快取中獲取資料,不再去底層資料庫查詢,從而提高查詢效率。

(2)二級快取的作用域是mapper的同一個namespace。不同的sqlSession兩次執行相同的namespace下的sql語句,且向sql中傳遞的引數也相同,即最終執行相同的sql語句,則第一次執行完畢會將資料庫中查詢的資料寫到快取,第二次查詢會從快取中獲取資料,不再去底層資料庫查詢,從而提高效率。

 

 

45.為什麼要用springboot?

spring boot提高了Java的開發速度,快速構建專案;簡化了開發過程、配置過程、部署過程、監控過程;專案可獨立執行,無需外部依賴servlet容器;

 

 

46.高併發的解決方案?

1.應用程式和靜態資原始檔進行分離;

2.頁面快取;

3.叢集與分散式;

4.反向代理;

5.CDN

 

47.JDK動態代理和cglib代理的區別?

java動態代理是利用反射機制生成一個實現代理介面的匿名類,在呼叫具體方法前呼叫InvokeHandler來處理。

而cglib動態代理是利用asm開源包,對代理物件類的class檔案載入進來,通過修改其位元組碼生成子類來處理。

 

48.反射機制是什麼?

   Java 反射機制是在執行狀態中,對於任意一個類,都能夠獲得這個類的所有屬性和方法,對於任意一個物件都能夠呼叫它的任意一個屬性和方法。這種在執行時動態的獲取資訊以及動態呼叫物件的方法的功能稱為 Java 的反射機制。 有屬性和方法,對於任意一個物件都能夠呼叫它的任意一個屬性和方法

49.介紹一下二叉樹,以及前序、中序、後序遍歷以及深度遍歷和廣度遍歷。

50.手寫生產者和消費者

51.內連線和外連線