7月4日問題

面經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. 設計模式 說幾種

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章