java面試題總結-詳細分類
技術點概念
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能幹什麼?
- 記憶體儲存、持久化,記憶體是斷電即失的,所以需要持久化(RDB、AOF)
- 高效率、用於高速緩衝
- 釋出訂閱系統
- 地圖資訊分析
- 計時器、計數器(eg:瀏覽量)等等
Redis特性
- 多樣的資料型別
- 持久化
- 叢集
- 事務
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建立執行緒的三種方式:
-
繼承Thread類建立執行緒類
-
通過Runable介面建立執行緒類
-
實現Callable介面
-
應用程式可以使用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的父子容器關係
-
SpringMVC容器管理,controller,Handlermapping,ViewResolver
-
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的事務管理分為兩種形式:
- 使用JDBC的事務管理機制:即利用java.sql.Connection物件完成對事務的提交(commit())、回滾(rollback())、關閉(close())等。
- 使用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的響應資訊中,然後返回給客戶端。
客戶端瀏覽器完成對伺服器響應資訊的渲染,將資訊展現在使用者面前。
示意圖:
相關文章
- 超詳細的Java面試題總結(四 )之JavaWeb基礎知識總結Java面試題Web
- 超詳細的Java面試題總結(三)之Java集合篇常見問題Java面試題
- phpRedis函式使用總結【分類詳細】PHPRedis函式
- PHP 詳細面試總結 (每日更新)PHP面試
- 面試題總結-Java部分面試題Java
- 【Java問題面試總結】Java面試
- PHP 詳細面試總結 (五 每日更新)PHP面試
- Spring面試題總結的很全面,附帶超詳細答案Spring面試題
- PHP 詳細面試總結 (三 Redis 基礎詳解)PHP面試Redis
- Java執行緒類相關面試題與答案總結Java執行緒面試題
- 2019 阿里java面試總結 (含面試題解析)阿里Java面試題
- Java類載入機制詳解【java面試題】Java面試題
- java面試總結Java面試
- Java面試題總結之Java基礎(三)Java面試題
- Android面試輕鬆搞定設計模式:六大原則+三大分類+詳細總結Android面試設計模式
- 面試題總結面試題
- Java面試題總結(基礎面試題完結版,2020-10-13)Java面試題
- Java 面試(二)| 詳細的MySql面試部分Java面試MySql
- 面試題總結: 類的載入過程面試題
- PHP 詳細面試總結 (二 HTTP 請求全過程)PHP面試HTTP
- 2018.7 前端面試題大總結 很詳細【下】前端面試題
- Java面試題之Java類載入機制詳解!Java面試題
- 面試問題總結(Java工程師 20190301)面試Java工程師
- JAVA物件導向詳細總結Java物件
- Java集合類常見面試知識點總結Java面試
- 測試面試題總結面試題
- Kafka詳細教程加面試題Kafka面試題
- iOS 面試題總結iOS面試題
- 面試刷題總結面試
- Ajax面試題總結面試題
- 面試問題總結面試
- css面試題總結CSS面試題
- Hadoop面試題總結Hadoop面試題
- PHP面試題總結PHP面試題
- Kafka面試題總結Kafka面試題
- java面試題總結(開發者必備)Java面試題
- 小馬哥Java面試題課程總結Java面試題
- 死磕 java原子類之終結篇(面試題)Java面試題