阿里企業金融二面覆盤

Java

這次竟然沒有一個Java基礎相關的。。。。

我極度懷疑面試官看了我博客,故意避開我會的。。。

框架

1. @bean的作用

聲明該返回值是一個bean

運行還是編譯 運行

bean如何起作用

通過@ComponentScan對包進行掃描

通過什麼查看註解

反射有個查看annotation方法

2. 爲什麼@Before可以AOP

在spring的生命週期的後置方法中,先查找實現了pointcutAdvisor的切面類,該類包含了Pointcut和Advice對象,檢查在Pointcut中的表達式能否匹配到當前的bean類,如果匹配則對bean進行織如

代理類沒有接口怎麼辦 cglib

如何代理final 通過aspectJ或者動態代理

3. SpringBoot的@SpringBootApplication

有三個nb註解@EnableAutoConfiguration,@ComponentScan和@SpringBootConfiguration,第一個裏面會有一個@Import註解,導入一個Select.class,該class會通過拿到每一個starter裏面的resources/META-INF的文件

如何寫一個starter

在自定義的starter裏面增加一個spring.proprites文件用來通知SpringBoot配置類的位置,然後在配置類中注入bean,如果需要映射參數的時候,可以通過@ConfigurationProperties註解

DB

4. 爲什麼索引用B+樹

深度淺,每個節點的key值更多

5. 爲什麼只有右模糊查詢走索引

用B+樹來解釋,MySQL的B+樹索引是按照從左向右的原則進行匹配的,如果其他模糊效率將是index

網絡

6. 面試時語音走得所有協議

語音如何通過網絡傳輸

微信文字的傳輸

微信發文字和圖片傳輸的區別

反正沒有回答到點上,有知道的logo可以發消息給我

算法

7. 瞭解哪些數據結構和算法

dp,貪心,dfs,bfs,prime,kruskal,樹,棧,圖,鏈表,數組,字符串

堆排序是穩定的嗎 不穩定

堆排序的最終結果集是平衡二叉樹嗎 不是

Arrays.sort()源碼

有三種排序方式:雙軸快排,併發歸併,以及修改的歸併

主要是修改的歸併:如果長度小於7的話會使用插入排序(即將刪除)

另外一種修改的歸併排序是TimSort:

  1. 掃描數組,確定其中的單調上升段和嚴格單調下降段,將嚴格下降段反轉;

  2. 定義最小基本片段長度,短於此的單調片段通過插入排序集中爲長於此的段;

  3. 反覆歸併一些相鄰片段,過程中避免歸併長度相差很大的片段,直至整個排序完成,所用分段選擇策略可以保證O(n log n)時間複雜性。

可以看到,原則上TimSort是歸併排序,但小片段的合併中用了插入排序。TimSort的最好複雜度是O(N),但是普通規並是O(nlogn)

OS

8. .java文件如何被OS執行

我回答的是虛擬機的那一塊

項目

9. 如何提高併發量

集羣,緩存,數據庫

10. 如何保證數據一致性

加鎖,雙刪,MQ

做題

面試官說給我個不常見的題,我吐。。。

11. 請用JAVA代碼完成以下功能,要求使用多線程

cat /home/admin/logs/*.log | grep "Login"| sort -nr | uniq -c

/**
 * 讀取 這個文件夾下 以.log結尾的文件
 * 匹配包含Login的字符串
 * 並將字符串逆序排列相同的字符串合在一起
 * 並在左側標出重複出現的次數
 *
 * @author wxxlamp
 * @date 2020/03/11~14:53
 */
public class Ali {
    public static String dir = "/home/admin/logs/";
    public static String target = "Login";

    public static void run() throws ExecutionException, InterruptedException {
        Tree tree = new Tree();
        List<String> stringList = getMultiFile(dir);
        for (String s : stringList) {
            tree.add(s);
        }
        tree.print();
    }

    private List<String> getMultiFile(String dir) throws ExecutionException, InterruptedException {
        File fileDir = new File(dir);
        File[] files = fileDir.listFiles();
        List<String> list = new ArrayList<>();
        assert files != null;
        for (File file : files) {
            if (file.getName().matches("^((?!log).*).log$")) {
                FutureTask<List<String>> futureTask = new FutureTask<>(new Worker(file));
                new Thread(futureTask).start();
                list.addAll(futureTask.get());
            }
        }
        return list;
    }

    private List<String> getTargetStringLine(File file) {
        Charset charset = StandardCharsets.UTF_8;
        StringBuilder sb = new StringBuilder();
        try(FileChannel fin = new FileInputStream(file).getChannel()) {
            ByteBuffer buffer = ByteBuffer.allocate(1024);
            while (fin.read(buffer) != -1) {
                buffer.flip();
                sb.append(charset.decode(buffer));
                buffer.clear();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        String[] ss = sb.toString().split("\\r");
        List<String> stringList = new ArrayList<>();
        for (String s : ss) {
            if (s.contains(target)) {
                stringList.add(s);
            }
        }
        return stringList;
    }

    private class Worker implements Callable<List<String>> {
        private File file;
        public Worker (File file){
            this.file = file;
        }

        @Override
        public List<String> call() {
            return getTargetStringLine(file);
        }
    }
    
    private static class Tree {

        private Map<String,Integer> map = new TreeMap<>(
                Comparator.reverseOrder());

        public synchronized void add(String str) {
            if(!map.containsKey(str)) {
                map.put(str,1);
                return;
            }
            Integer num = map.get(str);
            map.put(str, ++num);
        }

        public void print() {
            print(map);
        }

        public void print(Map<String, Integer> map) {
            for (Map.Entry<String, Integer> entry : map.entrySet()) {
                System.out.println(entry.getKey() + " : " + entry.getValue());
            }
        }
    }
}

12. LeetCode打家劫舍

13. 寫一個黑名單過濾系統

這兩個算法題是淘寶一面後的筆試題,不是本次面試題

覆盤

以前都是聽說阿里越往後項目越多,爲什麼這次全是基礎啊QAQ

突然發現面試官會看我CSDN,我在考慮要不要把我的面經設爲私人可見,因爲最近發現面試官問的問題基本剛好撇開了我整理的

這次的面試官和往常的大不一樣,完全不走常規路,就像是和我討論問題一樣,一點一點問,完全問到我不會。還有一個就是寫第一個場景題的時候,我多線程寫完沒來得及提交就到時間了,淦。這個場景題據我所知會成爲最終評級考覈的參考之一,我傷心555

面試官誇說我在本科生中還不錯,對我印象挺好,但是還是要多實踐。幸好二面險過。

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