java面試題總結-詳細分類

Mr.xin°發表於2020-10-08

技術點概念

1、Spring、SpringMvc、mybatis

Spring是什麼?幹什麼的?怎麼用?

Spring是一個輕量級控制反轉(IoC)和麵向切面(AOP)的容器框架。

spring是一個萬能的框架,方便解耦,開發,配置事務等等

Spring使用的是基本的JavaBean來完成以前只可能由EJB完成的事情。

Spring的核心機制是管理Bean

SpringMVC是什麼?幹什麼的?怎麼用?

SpringMVC是Spring框架的一個模組,使用Spring進行WEB開發時,可以使用Spring MVC框架。

web.xml中配置DisapatcherServlet,編寫配置檔案xxx-servlet.xml

mybatis是什麼?幹什麼的?怎麼用?

MyBatis 是一個持久層框架,用於 SQL查詢、儲存過程以及高階對映。兩種使用方式:xml和註解。

2、Springboot、spring secuity

Springboot是什麼?幹什麼的?

Spring Boot是用來簡化Spring應用初始搭建以及開發過程的全新框架,自動配置spring,maven管理,無需部署,快速構建spring專案。

Spring secuity是什麼?幹什麼的?

spring secuity是一個安全框架,用於授權和認證。

3、redis

Redis 是一個開源的,高效能的 key-value 資料庫。資料快取在記憶體中,但是可以持久化到磁碟。

Redis能幹什麼?

  1. 記憶體儲存、持久化,記憶體是斷電即失的,所以需要持久化(RDB、AOF)
  2. 高效率、用於高速緩衝
  3. 釋出訂閱系統
  4. 地圖資訊分析
  5. 計時器、計數器(eg:瀏覽量)等等

Redis特性

  1. 多樣的資料型別
  2. 持久化
  3. 叢集
  4. 事務

4、前端技術點

HTML、css、JavaScript

  • HTML 定義網頁的內容
  • CSS 規定網頁的佈局
  • JavaScript 是基於瀏覽器的客戶端指令碼,對網頁行為進行程式設計

ajax

AJAX 是一種可以區域性重新整理網頁的技術。通過 HTTP 請求載入遠端資料。即可傳送非同步的ajax請求等。(客戶端進行ajax操作,伺服器返回json資料)

ajax三要素:非同步互動、XMLHttpRequest物件、回撥函式。

5、其他

Web service 是什麼?如何使用?

基於 Web 的服務:伺服器端整出一些資源讓客戶端應用訪問。比如天氣預報資料。

編寫服務端和客戶端,進行釋出訪問 WebService Client–>(訪問) WebServiceServer

NIO API

什麼是Java NIO,它的工作原理是什麼

NIO是非阻塞式I/O模式,採用了通道和緩衝區的形式來進行處理資料。

專門的執行緒來處理 IO 事件,並負責分發。 事件驅動機制為:事件到的時候觸發,而不是同步的去監視事件。

java基礎

1、物件導向和麵向過程的區別?

程式導向:程式導向效能比物件導向高。

物件導向:物件導向易維護,易複用,易擴充套件。

2、建立執行緒方式一繼承Thread類

繼承Thread類來建立執行緒:

a.首先建立一個任務類extends Thread類,因為Thread類實現了Runnable介面,所以自定義的任務類也實現了Runnable介面,重寫run()方法,其中定義具體的任務程式碼或處理邏輯。

b.建立一個任務類物件,可以用Thread或者Runnable作為自定義的變數型別。

c.呼叫自定義物件的start()方法,啟動一個執行緒。

示例程式碼:

//每個任務都是Runable介面的一個例項,任務是可執行物件,執行緒即可執行物件。必須建立任務類,重寫run方法定義任務
public class EFT extends Thread {
 		private int a = 10;
    	@Override
    	//重寫run方法,定義任務
    	public void run() {
        while(a>=0)
 			{
            	System.out.println("$" + this.getName() + "(" + a + ")");
        	}
        }
      //呼叫start方法會啟動一個執行緒,導致任務中的run方法被呼叫,run方法執行完畢則執行緒終止
 public static void main(String[] args) {
  	EFT thread1 = new EFT();
  	EFT thread2 = new EFT();
  	thread1.start();
  	thread2.start();
  	System.out.println("火箭發射倒數計時:"); 
	 }
}	

3、REST模式中HTTP請求方法(GET,POST,PUT,DELETE)

GET就是獲取資源,POST就是建立資源,PUT就是更新資源,DELETE就是刪除資源。

4、集合Map

Map:key-value key不可以重複,value可以重複

HashMap:無序,key不可以重複(hashCode和equals),key允許為空

TreeMap:按照key進行升序排序,key不可重複(與compareTo方法有關)

HashTable:與HashMap相近,區別在於HashTable中的方法基本都是同步方法,key不允許null,直接會丟擲NullPointException

遍歷map的方式:

public class Example02 {
  public static void main(String[] args) {
    Map map = new HashMap();
    map.put("1", "老大");
    map.put("2", "老二");
    map.put("3", "老三");
    Set keySet = map.keySet();      //獲取鍵的集合
    Iterator it = keySet.iterator();      //迭代鍵的集合
    while(it.hasNext()) {
      Object key = it.next();
      Object value = map.get(key);    //獲取每個鍵所對應的值
      System.out.println(key+" : "+value);
    }
  }
}

5、什麼是 java 序列化?什麼情況下需要序列化?

序列化:將 Java 物件轉換成位元組流的過程。

反序列化:將位元組流轉換成 Java 物件的過程。

當 Java 物件需要在網路上傳輸 或者 持久化儲存到檔案中時,就需要對 Java 物件進行序列化處理。

如何實現物件的序列化?

1、新建一個實體物件,實現Serializable介面,這個實體物件就可以進行序列化了

2、另一個類中序列化這個實體類,並且將序列化之後的位元組序列存在磁碟上。

public class SerializableDemo {
    public static void main(String[] args) throws Exception {
        
        //序列化一個物件
        ObjectOutputStream objOutputStream = new ObjectOutputStream(new FileOutputStream("D:\\obj.txt"));
        Person person = new Person();
        person.setName("Tom");
        person.setAge(24);
        
        //寫入字面值常量
        objOutputStream.writeObject("將物件序列化");
        //寫入匿名物件
        objOutputStream.writeObject(new Date());
        //寫入物件
        objOutputStream.writeObject(person);
        
        //反序列化一個物件
        ObjectInputStream objInputStream = new ObjectInputStream(new FileInputStream("D:\\obj.txt"));
        System.out.println("讀取的字面值常量:"+(String)objInputStream.readObject());
        System.out.println("讀取的匿名物件"+(Date)objInputStream.readObject());
        System.out.println("讀取person物件"+((Person)objInputStream.readObject()).toString());
    }
}

6、HashMap與Hashtable的區別與聯絡

相同點:
實現原理相同,功能相同,底層都是雜湊表結構,查詢速度快,在很多情況下可以互用
不同點:
1、Hashtable是早期提供的介面,HashMap是新版JDK提供的介面。
2、Hashtable繼承Dictionary類,HashMap實現Map介面。
3、Hashtable執行緒安全,HashMap執行緒非安全。
4、Hashtable不允許null值,HashMap允許null值。

7、建立執行緒有幾種不同的方式?用過那種方式/你喜歡那種?

java建立執行緒的三種方式:

  1. 繼承Thread類建立執行緒類

  2. 通過Runable介面建立執行緒類

  3. 實現Callable介面

  4. 應用程式可以使用Executor [ɪɡˈzekjətə®] 框架來建立執行緒池

    Runnable介面有如下好處:
    ①避免單繼承的侷限,一個類可以實現多個介面。
    ②適合於資源的共享

    ②同時執行緒池的效率也非常高,很容易實現和使用。

//繼承Thread類
public class MyThread extends Thread {

	@Override
	public void run() {
		  System.out.println(getName());    
	}
	
	public static void main(String[] args) {
		for(int i=0;i<10;i++){
			new MyThread().start();
		}
		
		//  內部類 方式
		new Thread(){
			@Override
			public void run() {
				for (int x = 0; x < 10; x++) {
					System.out.println(Thread.currentThread().getName() + ":" + x);
				}
			}
		}.start();
	}
    
}
// 實現runnable介面
public class RunnableThreadTest implements Runnable {

	public void run() {
		System.out.println("run:" + Thread.currentThread().getName());
	}

	public static void main(String[] args) {
		
		System.out.println("main:"+ Thread.currentThread().getName());
		RunnableThreadTest rt = new RunnableThreadTest();
		new Thread(rt, "執行緒1").start();

		// 用內部類的方式建立執行緒,實現runnable介面
		new Thread(new Runnable() {
			@Override
			public void run() {
				for (int x = 0; x < 10; x++) {
					System.out.println(Thread.currentThread().getName() + ":" + x);
				}
			}
		}).start();
	}

}

8、簡述java中String、StringBuffer、StringBuilder的區別和他們的使用場景

區別:

執行速度不同:string最慢。

執行緒安全不同:StringBuffer是執行緒安全的,StringBuilder是執行緒不安全的

String內容不可變,StringBuffer、StringBuilder內容可變

String類的場景:在字串不經常變化的場景中

StringBuffer類的場景:在頻繁進行字串運算,並且執行在多執行緒環境中。

StringBuilder類的場景:在頻繁進行字串運算,並且執行在單執行緒的環境中。

9、Hashtable&HashMap&ConcurrentHashMap區別與選擇

Hashtable: 執行緒安全、效率低。(內部有上鎖的控制synchronized)

HashMap:執行緒不安全、效率高。(多個執行緒同時操作這一個HashMap,可能出現執行緒不安全的情況,甚至出現死鎖)

ConcurrentHashMap:分段鎖,將鎖的力度變小,兼顧兩者,保證執行緒安全和效能
在這裡插入圖片描述
在這裡插入圖片描述

(老版本升級,相容新版本時)

10、請描述下java的異常體系

在這裡插入圖片描述

通過異常體系保證程式的健壯性。

error: 一般指jvm錯誤,

  • 棧記憶體異常
  • 堆記憶體異常

runtimeexception (執行時異常):LogicException 邏輯異常,程式碼寫得不嚴謹,陣列越界,空指標異常。

11、羅列常見的5個執行時異常,5個非執行時異常。

在這裡插入圖片描述
在這裡插入圖片描述

12、throw和throws的區別

在這裡插入圖片描述

13、談談你對執行緒安全的理解?

專業描述:當多個執行緒訪問一個物件時,如果不用進行額外的同步控制或其他的協調操作,呼叫這個物件的行為都可以獲得正確的結果,我們就說這個物件是執行緒安全的。

那麼我們如何做到執行緒安全?

一般採用synchronized關鍵字給程式碼塊或方法加鎖

在開發中,如果需要拼接字串,使用StringBuilder還是StringBuffer?

場景一:

如果是多個執行緒訪問同一個資源,那麼就需要上鎖,才能保證資料的安全性。

這個時候如果使用的是非執行緒安全的物件,比如StringBuilder,那麼就需要藉助外力,給他加synchronized關鍵字。或者直接使用執行緒安全的物件StringBuffer。

場景二:

如果每個執行緒訪問的是各自的資源,那麼就不需要考慮執行緒安全的問題,所以這個時候,我們可以放心使用非執行緒安全的物件,比如StringBuilder。

在方法中,建立物件,來實現字串的拼接使用哪個好?

建議建立StringBuilder,這時候相當是每個執行緒獨立佔有一個StringBuilder物件,不存在多執行緒共享一個資源的情況,所以我們可以安心使用,雖然StringBuilder本身不是執行緒安全的。

什麼時候需要考慮執行緒安全?

1,多個執行緒訪問同一個資源

2,資源是有狀態的,比如我們上述講的字串拼接,這個時候資料是會有變化的

14、一個普通main方法的執行,是單執行緒模式還是多執行緒模式?為什麼?

因為java有個重要的特性,叫垃圾自動回收機制,所以答案是多執行緒,這裡面有兩部分,主執行緒(使用者執行緒),垃圾回收執行緒GC(守護執行緒)同時存在。

javaWeb基礎

1、描述JSP和Servlet的區別

技術的角度:

JSP本質就是一個Servlet
JSP的工作原理:JSP->翻譯->Servlet(java)->編譯->Class(最終跑的檔案)

應用的角度:

JSP=HTML+Java
Servlet=Java+HTML
各取所長,JSP的特點在於實現檢視,Servlet的特點在於實現控制邏輯

2,談談Servlet的生命週期

Servlet是單例項的。

生命週期的流程:

建立物件–>初始化–>service()–>doXXX()–>銷燬

建立物件的時機:

1,預設是第一次訪問該Servlet的時候建立
2,也可以通過配置web.xml,來改變建立時機,比如在容器啟動的時候去建立,DispatcherServlet(SpringMVC前端控制器)就是一個例子
1

執行的次數

物件的建立只有一次,單例
初始化一次
銷燬一次

關於執行緒安全

構成執行緒不安全三個因素:
1,多執行緒的環境(有多個客戶端,同時訪問Servlet)
2,多個執行緒共享資源,比如一個單例物件(Servlet是單例的)
3,這個單例物件是有狀態的(比如在Servlet方法中採用全域性變數,並且以該變數的運算結果作為下一步操作的判斷依據)

3,描述Session跟Cookie的區別(重要)

儲存的位置不同

Session:服務端
Cookie:客戶端

儲存的資料格式不同

Session:value為物件,Object型別
Cookie:value為字串,如果我們儲存一個物件,這個時候,就需要將物件轉換為JSON

儲存的資料大小

Session:受伺服器記憶體控制
Cookie:一般來說,最大為4k

生命週期不同

Session:伺服器端控制,預設是30分鐘,注意,當使用者關閉了瀏覽器,session並不會消失

Cookie:客戶端控制,其實是客戶端的一個檔案,分兩種情況
1,預設的是會話級的cookie,這種隨著瀏覽器的關閉而消失,比如儲存sessionId的cookie
2,非會話級cookie通過設定有效期來控制,比如這種“7天免登入”這種功能,
就需要設定有效期,setMaxAge

4、cookie跟session之間的聯絡

Session機制背後的原理是,伺服器會自動生成會話級的cookie來儲存session的標識。

5、xml和json的區別

xml:可擴充套件標記語言,是一種用於標記電子檔案使其具有結構性的標記語言

json:(JavaScript Object Notation, JS 物件簡譜) 是一種輕量級的資料交換格式。

二者區別:

它們都是一種資料交換格式。

1,xml是重量級的,json是輕量級的。

2,xml在傳輸過程中比較佔頻寬,json佔頻寬少,易於壓縮。

3,xml和json都用在專案互動下,xml多用於做配置檔案,json用於資料互動。

4,json可用jackson,gson等方法解析,xml可用dom,sax,demo4j等方式解析。

6、轉發和重定向的區別

轉發:

發生在伺服器內部的跳轉,所以,對於客戶端來說,至始至終就是一次請求,所以這期間,儲存在request物件中的資料可以傳遞

重定向:

發生在客戶端的跳轉,所以,是多次請求,這個時候,如果需要在多次請求之間傳遞資料,就需要用session物件

面試官的問題:

在後臺程式,想跳轉到百度,應該用轉發還是重定向?
答案:重定向,因為轉發的範圍限制在伺服器內部

7、談談三層架構

1,JavaEE將企業級軟體架構分為三個層次:

Web層:負責與使用者互動並對外提供服務介面
業務邏輯層:實現業務邏輯模組
資料存取層:將業務邏輯層處理的結果持久化,方便後續查詢

2,看圖:
在這裡插入圖片描述

3,每個層都有各自的框架

WEB層:SpringMVC,Struts2,Struts1
業務邏輯層:Spring
資料持久層:Hibernate,MyBatis,SpringDataJPA,SpringJDBC

8、談談對MVC的理解(重要)

MVC是對Web層做了進一步的劃分,更加細化

Model(模型) - 模型代表一個存取資料的物件或 JAVA POJO。
View(檢視) - 檢視代表模型包含的資料的視覺化,比如HTML,JSP,Thymeleaf,FreeMarker等等
Controller(控制器) - 控制器作用於模型和檢視上。它控制資料流向模型物件,並在資料變化時更新檢視。它使檢視與模型分離開,目前的技術代表是Servlet,Controller。

SpringMVC分為兩個控制器

DispatchServlet:前端控制器,由它來接收客戶端的請求,再根據客戶端請求的URL的特點,分發到對應的業務控制器,比如UserController。

9、描述JSP的9大內建物件(不重要)

記得多少回答多少即可。

內建物件名 型別
request (HttpServletRequest)
response (HttpServletResponse)
config (ServletConfig)
application (ServletContext)
session (HttpSession)
exception (Throwable)
page (Object(this))
out (JspWriter)
pageContext (PageContext)

10、4大域物件的作用範圍

page域: 只能在當前jsp頁面使用 (當前頁面)
request域: 只能在同一個請求中使用 (轉發才有效,重定向無效)
session域: 只能在同一個會話(session物件)中使用 (私有的,多個請求和響應之間)
context域: 只能在同一個web應用中使用 (全域性的)

11、併發和並行的區別

併發:同一個CPU執行多個任務,按細分的時間片交替執行

並行:在多個CPU上同時處理多個任務

資料庫sql、oracle

1、mysql增刪改查

增:

1.1【插入單行】
insert [into] <表名> (列名) values (列值)
例:insert into Strdents (姓名,性別,出生日期) values (‘開心朋朋’,‘男’,‘1980/6/15’)

刪:

2.1【刪除<滿足條件的>行】
delete from <表名> [where <刪除條件>]
例:delete from a where name=‘開心朋朋’(刪除表a中列值為開心朋朋的行)

改:

update <表名> set <列名=更新值> [where <更新條件>]
例:update tongxunlu set 年齡=18 where 姓名=‘藍色小名’

查:

4.1、精確(條件)查詢
select <列名> from <表名> [where <查詢條件表達試>] [order by <排序的列名>[asc或desc]]

查詢所有:select * from 表名;

4.1.2【查詢部分行列–條件查詢】
例:select i,j,k from a where f=5
說明:查詢表a中f=5的所有行,並顯示i,j,k3列

4.1.3【在查詢中使用AS更改列名】
例:select name as 姓名 from a where xingbie=‘男’
說明:查詢a表中性別為男的所有行,顯示name列,並將name列改名為(姓名)顯示

4.1.4 模糊查詢

例:select * from a where name like ‘趙%’

4.2.2【使用between在某個範圍內進行查詢】
例:select * from a where age between 18 and 20

4.2.3【使用in在列舉值內進行查詢】
例:select name from a where address in (‘北京’,‘上海’,‘唐山’)

4.3.1【使用group by進行分組查詢】
例:select studentID ,AVG(score) from student group by studentID (score)指的是列名

4.3.2【使用having子句進行分組篩選】
例:select studentID ,AVG(score) from student group by studentID having count(score)>1

注:由於where只能在沒有分組時使用,分組後只能使用having來限制條件。

4.4.1內聯接(只列出兩張表關聯查詢符合條件的記錄**)
例:select a.name,b.chengji from a,b where a.name=b.name或者

select a.name,b.chengji from a inner join b on a.name=b.name

4.4.2.1【左外聯接查詢】
例:select s.id sid, s.name sname,c.id cid, from strdent s left join score c on s.id=c.sid 以左表為主

右外連線改為right 以左表為主

2、oracle相關查詢:

(1)求出員工總人數。 SELECT COUNT(*) FROM emp; – SELECT count(rowid) FROM emp;
(2)求出公司每月要支付的工資總數。 SELECT COUNT(sal) FROM emp;
(3)求出最高月薪、最低月薪。 SELECT MAX(sal), MIN(sal) FROM emp;
(4)求出公司的平均月薪。 SELECT AVG(sal) FROM emp;

SQL1999標準中多表連線的語法:
SELECT [DISTINCT] *|[列名 別名,…]
FROM 主表名 [別名]
JOIN_TYPE 從表名 [別名] ON 連線條件
WHERE 查詢條件
GROUPBY 分組表示式
HAVING 組過濾條件
ORDERY BY 排序表示式;

(5)顯示每個部門的員工數量。 SELECT COUNT(rowid) FROM emp GROUP BY deptno;
(6)顯示每種職位的名及平均月薪。SELECT job,AVG(sal) FROM emp GROUP BY job;

(7)顯示平均月薪大於2000的部門編號及平均月薪。SELECT deptno,AVG(sal) FROM emp GROUP BY deptno HAVING AVG(sal) > 2000;

(注:聚合函式不能出現在WHERE子句中。)

(8)顯示不是總裁(PRESIDENT)的職位名以及該職位的員工月薪總和,還要滿足同職位的員工的月薪總和大於4500。輸出結果按月薪的總和降序排列。

​ 1、職位不是總裁的職位名:SELECT job FROM emp WHERE job!=‘PRESIDENT’;
​ 2、按職位分組,求出月薪總和:SELECT job,SUM(sal) FROM emp WHERE job!=‘PRESIDENT’ GROUP BY job;
​ 3、分組後過濾月薪總和大於4500:SELECT job,SUM(sal) FROM emp WHERE job!=‘PRESIDENT’ GROUP BY job HAVING SUM(sal) > 4500;
​ 4、結果按月薪的總計降序排列:SELECT job,SUM(sal) FROM emp WHERE job!=‘PRESIDENT’ GROUP BY job HAVING SUM(sal) > 4 4500 ORDER BY SUM(sal) DESC;
​ select job,sum(sal) from emp group by job having sum(sal) >4500 and job!=‘PRESIDENT’ order by sum(sal) desc;

(9)求出部門平均月薪的最高值。 SELECT MAX(AVG(sal)) FROM emp GROUP BY deptno;

(10)求出部門平均月薪最高的部門編號和平均月薪。

SELECT deptno,AVG(sal) FROM emp GROUP BY deptno HAVING avg(sal)=(SELECT MAX(AVG(sal)) FROM emp GROUP BY deptno);

(11)查詢出月薪大於2000的員工姓名、月薪、受僱日期及其所在的部門名,輸出結果按受僱日期排序。

SELECT ename,sal,hiredate,dname FROM emp INNER JOIN dept ON emp.deptno=dept.deptno WHERE emp.sal>2000 ORDER BY hiredate;

(12)查詢出月薪比“SMITH”高的員工資訊。 Select * from emp where sal>(select sal from emp where ename=‘SCOTT’)
(13)查詢出月薪最高的員工姓名和月薪。 Select ename,sal from emp where sal=(select max(sal) from emp)

3、mysql常用儲存引擎

(inodb 、myisam 、memory 、merge、archive )

4、什麼是事務

事務是訪問資料庫的一個操作序列,資料庫應用系統通過事務集來完成對資料庫的存取。

注:事務必須服從ISO/IEC所制定的ACID原則。ACID是原子性(atomicity)、一致性(consistency)、隔離性(isolation)和永續性(durability)

原子性是基礎,隔離性是手段,一致性 是約束條件,而永續性是我們的目的。

5、MySql事務隔離級別

l READ UNCOMMITTED 讀未提交,髒讀、不可重複讀、幻讀有可能發生。
l READ COMMITTED 讀已提交,可避免髒讀的發生,但不可重複讀、幻讀有可能發生。
l REPEATABLE READ 可重複讀,可避免髒讀、不可重複讀的發生,但幻讀有可能發生。
l SERIALIZABLE 序列化,可避免髒讀、不可重複讀、幻讀的發生,但效能會影響比較大。

特別說明:

幻讀,是指在本地事務查詢資料時只能看到3條,但是當執行更新時,卻會更新4條,所以稱為幻讀

6、資料庫的三大正規化

第一正規化:列不可分
第二正規化:要有主鍵
第三正規化:不可存在傳遞依賴

7、JDBC如何實現對事務的控制及事務邊界

JDBC對事務的操作是基於Connection來進行控制的,具體程式碼如下:

try {
   //開啟事務
   connection.setAutoCommit(false);
   //做業務操作
   //doSomething();
   //提交事務
   connection.commit();
}catch(Exception e){
   //回滾事務
   try {
      connection.rollback();
   } catch (SQLException e1) {
      e1.printStackTrace();
   }
}

但,注意,事務的邊界我們是放在業務層進行控制,因為業務層通常包含多個dao層的操作。

8、synchronized和lock的區別

1,作用的位置不同

synchronized [ˈsɪŋkrənaɪzd] 可以給方法,程式碼塊加鎖

lock只能給程式碼塊加鎖

2,鎖的獲取鎖和釋放機制不同

**synchronized無需手動獲取鎖和釋放鎖,**發生異常會自動解鎖,不會出現死鎖。

lock需要自己加鎖和釋放鎖,如lock()和unlock(),如果忘記使用unlock(),則會出現死鎖,

所以,一般我們會在finally裡面使用unlock().

synchronized修飾成員方法時,預設的鎖物件,就是當前物件

synchronized修飾靜態方法時,預設的鎖物件,當前類的class物件,比如User.class

9、什麼是死鎖?如何防止死鎖?

1、執行緒A和執行緒B相互持有對方需要的鎖,從而發生阻塞,最終變為死鎖。

2,如何防止死鎖?(重點)

減少同步程式碼塊巢狀操作

降低鎖的使用粒度,不要幾個功能共用一把鎖

儘量採用tryLock(timeout)的方法,可以設定超時時間,這樣超時之後,就可以主動退出,防止死鎖(關鍵)

10、索引的幾種型別

分別是普通索引、唯一索引、聚集索引、主鍵索引、全文索引幾種。

使用索引的優點:

  • 提高資料的搜尋速度
  • 加快表與表之間的連線速度
  • 在資訊檢索過程中,若使用分組及排序子句進行時,通過建立索引能有效的減少檢索過程中所需的分組及排序時間,提高檢索效率。

使用索引的缺點:

  • 在我們建立資料庫的時候,需要花費的時間去建立和維護索引,而且隨著資料量的增加,需要維護它的時間也會增加。
  • 在建立索引的時候會佔用儲存空間。
  • 在我們需要修改表中的資料時,索引還需要進行動態的維護,所以對資料庫的維護帶來了一定的麻煩。

唯一索引:在建立唯一索引時要不能給具有相同的索引值。
主鍵索引:在我們給一個欄位設定主鍵的時候,它就會自動建立主鍵索引,用來確保每一個值都是唯一的。
聚集索引:我們在表中新增資料的順序,與我們建立的索引鍵值相同,而且一個表中只能有一個聚集索引。
普通索引:它的結構主要以B+樹和雜湊索引為主,主要是對資料表中的資料進行精確查詢。
全文索引:它的作用是搜尋資料表中的欄位是不是包含我們搜尋的關鍵字,就像搜尋引擎中的模糊查詢。

框架相關

1、什麼是反射?可以解決什麼問題?

反射是一種在程式執行時,動態獲取當前類物件的所有屬性和方法的能力,可以動態執行方法,給屬性賦值等操作的能力。

在java中,Class類就是關鍵API,在我們的許多框架的背後實現上,都採用了反射的機制來實現動態效果。

2、Spring的核心特性

在這裡插入圖片描述

IOC:“控制反轉”。可以自動管理依賴的物件,重點是解耦!

AOP:面向切面程式設計。方便我們將一些非核心業務邏輯抽離,從而實現核心業務和非核心業務的解耦,即關注業務邏輯的開發。

其他:宣告式事物的支援、方便程式測試、方便整合各種優秀框架、降低Java EE API的使用難度。

Spring AOP ,面向切面程式設計。原理:JDK動態代理

3、簡述spring中的IOC和DI原理

IOC,即控制反轉,是一種設計思想,就是容器控制應用程式所需要外部資源的建立和管理,然後將其反轉給應用程式

DI,即依賴注入,一種實現手段,在系統執行過程中,動態的向某個物件注入它所依賴的物件。

4、Spring的bean作用域有哪些?

1,預設是singleton,即單例模式(常用)

2,prototype,每次從容器呼叫bean時都會建立一個新的物件,比如整合Struts2框架的時候,spring管理action物件則需要這麼設定。

3,request,每次http請求都會建立一個物件

4,session,同一個session共享一個物件

5,global-session

5、Spring的bean是執行緒安全的嗎?

大家可以回顧下執行緒不安全構成的三要素:

1,多執行緒環境

2,訪問同一個資源

3,資源具有狀態性

那麼Spring的bean模式是單例,而且後端的程式,天然就處於一個多執行緒的工作環境。

那麼是安全的嗎?

關鍵看第3點,我們的bean基本是無狀態的,所以從這個點來說,是安全的。

所謂無狀態就是沒有儲存資料,即沒有通過資料的狀態來作為下一步操作的判斷依據
在這裡插入圖片描述

6、Spring支援的事務傳播特性

PROPAGATION_REQUIRED:支援當前事務,如果當前沒有事務,就新建一個事務。這是最常見的選擇。

這個配置項的意思是說當我呼叫service層的方法的時候,開啟一個事務,那麼在呼叫這個service層裡面的其他的方法的時候,如果當前方法產生了事務就用當前方法產生的事務,否則就建立一個新的事務。這個工作是由Spring來幫助我們完成的。

7、簡述springMvc的執行流程

1,首先,將請求分給前端控制器DispatcherServlet

2,DispatcherServlet查詢HandlerMapping(對映控制器),從而找到處理請求的Controller(處理器)

3,Controller執行業務邏輯處理後,返回一個ModelAndView(模型和檢視)

4,DispatcherServlet查詢一個或多個ViewResolver(檢視解析器),找到ModelAndView對應的檢視物件,檢視物件負責渲染返回給客戶端

快速記憶技巧:

核心控制器捕獲請求、

查詢Handler、

執行Handler、

選擇ViewResolver、

通過ViewResolver渲染檢視並返回。

8、SpringMVC+Spring的父子容器關係

  1. SpringMVC容器管理,controller,Handlermapping,ViewResolver

  2. Spring容器管理,service,datasource,mapper,dao

  • Spring容器是父容器,SpringMVC容器是子容器
  • 子容器可以訪問父容器上面的資源,所以我們會在看Controller可以注入Service

9、SpringMVC有哪些常用的註解?有什麼作用?

@RequestMapping:做請求的URL,跟我們controller或者方法的對映關係

@RequestParam:做請求引數的匹配,當請求引數名稱跟我們方法的引數名不一致的時候,可以做匹配

@GetMapping: 請求方式為GET

@PostMapping:請求方式為POST

@PathVariable:獲取URL中攜帶的引數值,處理RESTful風格的路徑引數

@CookieValue:獲取瀏覽器傳遞cookie值

@RequestBody:接收請求中的引數資訊,一般來說,接收一個集合或陣列,或者以post方式提交的資料

@ResponseBody: 改變返回邏輯檢視的預設行為,返回具體的資料,比如json

@Controller:Spring定義的,作用就是標明這是一個controller類

@RestController:@Controller+@ResponseBody的組合

10、什麼是悲觀鎖,什麼是樂觀鎖?

1,悲觀鎖是利用資料庫本身的鎖機制來實現,會鎖記錄。安全

2,樂觀鎖是一種不鎖記錄的實現方式,採用CAS模式,建議採用version欄位來作為判斷依據。

11、MyBatis-快取機制,從一級快取到二級快取

一級快取總結:

1,一級快取模式是開啟狀態
2,一級快取作用域在於SqlSession
3,如果中間有對資料的更新操作,則將清空一級快取。

要使用二級快取,需要經歷兩個步驟
1,開啟二級快取(預設處於開啟狀態)

2,在Mapper.xml中,配置二級快取(也支援在介面配置)
在標籤下面新增標籤即可

二級快取作用域在於SqlSessionFactory。MyBatis的二級快取預設採用的是Map的實現。二級快取優先於一級緩衝。

12、MyBatis有哪些分頁方式?

分為邏輯分頁(正常人,一般使用)和物理分頁。

13、說說MyBatis分頁外掛的原理是什麼?

首先,在MyBatis內部定義了一個攔截器介面

所有的外掛都要實現該介面,來,我們看看這個介面的定義

public interface Interceptor {

  Object intercept(Invocation invocation) throws Throwable;

  Object plugin(Object target);

  void setProperties(Properties properties);

}

那麼其中一個關鍵的方法就是intercept,從而實現攔截

分頁外掛的原理:就是使用MyBatis提供的外掛介面,實現自定義外掛,在外掛的攔截方法內,攔截待執行的SQL然後根據設定的dialect(方言),和分頁引數重寫SQL ,生成帶有分頁語句的SQL,執行從而實現分頁

所以原理還是基於攔截器。

14、mysql和oracle分頁的區別

MySQL使用limit分頁計算引數為 開始序號(startNum),要查的總條數 (totalNum)

select * from stu limit m, n; //m = (startPage-1)*pageSize,n = pageSize

Oracle使用rownum分頁計算引數為 開始序號(startNum) , 結束序號 (endNum)

select * from (
select rownum rn,a.* from table_name a where rownum <= x
//結束行,x = startPage*pageSize
)
where rn >= y; //起始行,y = (startPage-1)*pageSize+1

15、mybatis中#{}和${}的區別

1、#是將傳入的值當做字串的形式,eg:select id,name,age from student where id =#{id},當前端把id值1,傳入到後臺的時候,就相當於 select id,name,age from student where id =‘1’. #{} 佔位符

2 、== 是 將 傳 入 的 數 據 直 接 顯 示 生 成 s q l 語 句 = = , e g : s e l e c t i d , n a m e , a g e f r o m s t u d e n t w h e r e i d = 是將傳入的資料直接顯示生成sql語句==,eg:select id,name,age from student where id = sql==eg:selectid,name,agefromstudentwhereid={id},當前端把id值1,傳入到後臺的時候,就相當於 select id,name,age from student where id = 1. ${} 拼接符

MyBatis如何解決了SQL隱碼攻擊的問題?採用#

16、MyBatis的事務管理分為兩種形式:

  1. 使用JDBC的事務管理機制:即利用java.sql.Connection物件完成對事務的提交(commit())、回滾(rollback())、關閉(close())等。
  2. 使用MANAGED的事務管理機制:這種機制MyBatis自身不會去實現事務管理,而是讓程式的容器如(JBOSS,Weblogic)來實現對事務的管理。

17、MyBatis的XML對映檔案都有哪些標籤

1,基本的CRUD標籤,select|insert|updae|delete

2,、、、、

3,動態SQL標籤:trim | where | set | foreach | if | choose | when | otherwise | bind等,其中為sql片段標籤,通過標籤引入sql片段

Springboot、微服務

1、SpringCloud是什麼?

SpringCloud是基於Springboot的、微服務系統架構的一站式解決方案。

2、 SpringCloud和SpringBoot的區別與聯絡

區別:

  • SpringBoot可以離開SpringCloud獨立使用,開發專案,但SpringCloud離不開SpringBoot,屬於依賴關係;
  • SpringBoot專注於快速、方便的開發單個個體微服務,SpringCloud關注全域性的服務治理框架;

聯絡:

Sprigboot為SprigCloud提供了程式碼實現環境,使用SprigBoot將其它元件有機融合到了SprigCloud的體系架構中了。

3、SprigCloud與SpringBoot是什麼關係呢?

Sprigboot為SprigCloud提供了程式碼實現環境,使用SprigBoot將其它元件有機融合到了SprigCloud的體系架構中了。

3、SprigCloud與Dubbo技術選型
在這裡插入圖片描述
在這裡插入圖片描述

其他相關

1,從瀏覽器輸入URL到頁面載入完畢,都經歷了什麼?(瞭解)

首先,需要經過DNS(域名解析服務)將URL轉換為對應的ip地址,實際上域名只是方便我們記憶,在網路上的每臺主機互動的地址都是IP。

其次,我們需要通過這個ip地址跟伺服器建立TCP網路連線,隨後向我們的伺服器發出http請求。注意,http協議是tcp的上層協議

最後,伺服器接收到我們的請求,處理完畢之後,將響應資料放入到http的響應資訊中,然後返回給客戶端。

客戶端瀏覽器完成對伺服器響應資訊的渲染,將資訊展現在使用者面前。

示意圖:
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述

相關文章