面經1------------------------------------------------------------------
1. list和set的區別
- list可以存儲重複元素,set不能存儲重複元素
- list可以存儲多個null值,set只能存儲一個null值
- list的存儲順序和插入順序一致,set的存儲順序和插入順序不一致
2. 寫過切面類嗎
- 橫切關注點與業務邏輯無關,比如日誌、聲明式事務、安全等,都與業務邏輯無關,因此將這些東西抽象爲單獨的模塊,就是切面類。
- Spring中的切面類需要兩個註解,一個是@Component,將切面類加入IOC容器中,另一個是@Aspect,使其成爲切面類
- 切面類中的功能被稱爲通知,分爲五種:
(1)前置通知:在目標方法調用之前調用通知的內容
(2)後置通知:在目標方法完成之後調用通知的內容,不關心方法的輸出是什麼
(3)返回通知:在目標方法成功執行之後
(4)異常通知:在目標方法拋出異常後調用通知
(5)環繞通知:通知包裹了被通知的方法,在被通知方法調用之前和之後執行自定義的行爲
@Component
@Aspect
public class LoggingAspect {
//現在想在實現類中的每個方法執行前、後、以及是否發生異常等信息打印出來,需要把日誌信息抽取出來,寫到對應的切面的類中 LoggingAspect.java 中
//要想把一個類變成切面類,需要兩步,
//① 在類上使用 @Component 註解 把切面類加入到IOC容器中
//② 在類上使用 @Aspect 註解 使之成爲切面類
/**
* 前置通知:目標方法執行之前執行以下方法體的內容
* @param jp
*/
@Before("execution(* com.svse.aop.*.*(..))")
public void beforeMethod(JoinPoint jp){
String methodName =jp.getSignature().getName();
System.out.println("【前置通知】the method 【" + methodName + "】 begins with " + Arrays.asList(jp.getArgs()));
}
/**
* 返回通知:目標方法正常執行完畢時執行以下代碼
* @param jp
* @param result
*/
@AfterReturning(value="execution(* com.svse.aop.*.*(..))",returning="result")
public void afterReturningMethod(JoinPoint jp, Object result){
String methodName =jp.getSignature().getName();
System.out.println("【返回通知】the method 【" + methodName + "】 ends with 【" + result + "】");
}
/**
* 後置通知:目標方法執行之後執行以下方法體的內容,不管是否發生異常。
* @param jp
*/
@After("execution(* com.svse.aop.*.*(..))")
public void afterMethod(JoinPoint jp){
System.out.println("【後置通知】this is a afterMethod advice...");
}
/**
* 異常通知:目標方法發生異常的時候執行以下代碼
*/
@AfterThrowing(value="execution(* com.qcc.beans.aop.*.*(..))",throwing="e")
public void afterThorwingMethod(JoinPoint jp, NullPointerException e){
String methodName = jp.getSignature().getName();
System.out.println("【異常通知】the method 【" + methodName + "】 occurs exception: " + e);
}
/**
* 環繞通知:目標方法執行前後分別執行一些代碼,發生異常的時候執行另外一些代碼
* @return
*/
/*@Around(value="execution(* com.svse.aop.*.*(..))")
public Object aroundMethod(ProceedingJoinPoint jp){
String methodName = jp.getSignature().getName();
Object result = null;
try {
System.out.println("【環繞通知中的--->前置通知】:the method 【" + methodName + "】 begins with " + Arrays.asList(jp.getArgs()));
//執行目標方法
result = jp.proceed();
System.out.println("【環繞通知中的--->返回通知】:the method 【" + methodName + "】 ends with " + result);
} catch (Throwable e) {
System.out.println("【環繞通知中的--->異常通知】:the method 【" + methodName + "】 occurs exception " + e);
}
System.out.println("【環繞通知中的--->後置通知】:-----------------end.----------------------");
return result;
}*/
}
3. TreeMap中自定義類作爲key如何比較
(1)自定義類實現Comparable接口
import java.util.Comparator;
import java.util.HashMap;
import java.util.TreeMap;
class Solution {
public static void main(String[] args) {
TreeMap<Student, Integer> treeMap = new TreeMap<>();
treeMap.put(new Student(1,"xixi"), 1);
treeMap.put(new Student(1,"haha"), 1);
}
}
class Student implements Comparable<Student>{
private int age;
private String name;
public Student(int age, String name) {
this.age = age;
this.name = name;
}
@Override
public int compareTo(Student o) {
return this.age - o.age;
}
}
(2)創建TreeMap對象時,指定比較器 Comparator
import java.util.Comparator;
import java.util.HashMap;
import java.util.TreeMap;
class Solution {
public static void main(String[] args) {
TreeMap<Student, Integer> treeMap = new TreeMap<>(new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
return o1.getAge() - o2.getAge();
}
});
treeMap.put(new Student(1,"xixi"), 1);
treeMap.put(new Student(1,"haha"), 1);
}
}
class Student{
private int age;
private String name;
public Student(int age, String name) {
this.age = age;
this.name = name;
}
public int getAge() {
return age;
}
public String getName() {
return name;
}
}
4. 索引,如何知道查詢過程有沒有使用索引,索引結構
- (1)什麼是索引?
索引是將數據庫中的一個或者多個字段,進行排序的一種結構,可以提高數據庫的查詢效率。 - (2)有哪些索引結構?
Hash表、B樹、B+樹等。 - (3)各個索引結構的特點
Hash表:查詢時間複雜度O(1),但是不合適範圍查找、模糊查找、排序等;
B樹:多路搜索樹,關鍵字和記錄放在一起,非葉子節點也存儲數據
B+樹:葉子結點只存儲關鍵字,非葉子節點存儲所有的關鍵字和記錄,葉子結點之間存在雙向指針(便於範圍查找) - (4)如何知道查詢過程有沒有使用索引?在查詢語句前加上explain就可以了
- (5)explain列解釋?
- type:這是重要的列,顯示連接使用了何種類型。從最好到最差的連接類型爲const、eq_reg、ref、range、index和ALL
- possible_keys:顯示可能應用在這張表中的索引。如果爲空,沒有可能的索引
- key: 實際使用的索引。如果爲NULL,則沒有使用索引。很少的情況下,MYSQL會選擇優化不足的索引。這種情況下,可以在SELECT語句中使用USE INDEX(indexname)來強制使用一個索引或者用IGNORE INDEX(indexname)來強制MYSQL忽略索引
5. 項目部署在哪裏的
服務器:
- 操作系統:CentOs
- 內存:2GB
面經2------------------------------------------------------------------
1. HaspMap擴容是怎樣擴容的,爲什麼都是2的N次冪的大小。
-
(1)初始容量
默認構造函數:初始容量16
指定初始容量:Hash會選擇大於該數字的第一個2的冪作爲容量。(3->4、7->8、9->16) -
(2)擴容過程
-
(3)爲什麼都是2的N次冪的大小
2. 內存模型 new一個類的具體過程 以及調用一個成員的具體在內存中的過程
3. 靜態代理 動態代理
4. 索引 聯合列索引
5. 線程池
6. 線程的創建
7. 瞭解spring嗎
8. 瞭解servlet嗎
9. java I/O相關的簡單介紹一下
10. 關於maven說一下
11. Hashmap瞭解嗎
12. 那你說說關於紅黑樹
13. Java 反射機制
14. 網絡層次 HTTP TCP
15. 對稱加密 非對稱加密
16. 樂觀鎖 悲觀鎖
17. 設計模式 說幾種