Keep面經彙總

目錄java

1、Java

線程如何終止

  1. 使用退出標誌,使線程正常退出,也就是當run方法完成後線程終止。
  2. 使用stop方法強行終止線程。
  3. 使用interrupt方法中斷線程。

如何用一個cancel方法中止兩個線程

泛型原理、使用場景、優缺點

原理:泛型的實現是靠類型擦除技術,類型擦除是在編譯期完成的,在編譯期,編譯器會將泛型的類型參數都擦除成它的限定類型,若是沒有則擦除爲object類型以後在獲取的時候再強制類型轉換爲對應的類型。mysql

使用場景:參數類型能夠用在類、接口和方法的建立中,分別稱爲泛型類、泛型接口和泛型方法。git

優勢:算法

  1. 類型安全
  2. 消除強制類型轉換
  3. 潛在的性能收益

缺點:在性能上不如數組快。sql

手寫代碼,設計parseInt

public static int parseInt(String s) throws NumberFormatException {
        return parseInt(s,10);
    }
    public static int parseInt(String s, int radix)
                throws NumberFormatException
    {
        /*
         * 將整數字符串s轉換成10進制的整數
         * radix用來指明s是幾進制
         */
        //處理字符串s爲空的狀況
        if (s == null) {
            throw new NumberFormatException("null");
        }
        //Character.MIN_RADIX爲2,就是進制數radix小於2進制的話也是無效的
        if (radix < Character.MIN_RADIX) {
            throw new NumberFormatException("radix " + radix +
                                            " less than Character.MIN_RADIX");
        }
        //Character.MAX_RADIX爲36,就是進制數radix大於36進制的話也是無效的
        if (radix > Character.MAX_RADIX) {
            throw new NumberFormatException("radix " + radix +
                                            " greater than Character.MAX_RADIX");
        }

        int result = 0;
        //判斷正負號的標記,初始化爲正
        boolean negative = false;
        int i = 0, len = s.length();
        int limit = -Integer.MAX_VALUE;
        int multmin;
        int digit;

        if (len > 0) {
            //取出第一個字符判斷時候包含正負號
            char firstChar = s.charAt(0);
            if (firstChar < '0') {
                if (firstChar == '-') {
                    negative = true;
                    //如果字符串的符號是﹣,由於下面每次的result是相減的形式,因此這裏是﹢的
                    limit = Integer.MIN_VALUE;
                } else if (firstChar != '+')
                    throw NumberFormatException.forInputString(s);

                if (len == 1) 
                    throw NumberFormatException.forInputString(s);
                i++;
            }
            multmin = limit / radix;
            while (i < len) {
                // 返回使用指定radix進制的字符 s.charAt(i++) 的數值
                digit = Character.digit(s.charAt(i++),radix);
                // s.charAt(i++)的值是一個使用指定radix進制的無效數字,則返回 -1,異常
                if (digit < 0) {
                    throw NumberFormatException.forInputString(s);
                }
                if (result < multmin) {
                    throw NumberFormatException.forInputString(s);
                }
                //上一次的結果乘以radix進制
                result *= radix;
                //處理溢出狀況
                if (result < limit + digit) {
                    throw NumberFormatException.forInputString(s);
                }
                result -= digit;
            }
        } else {//長度小於0的話,異常
            throw NumberFormatException.forInputString(s);
        }
        //negative是true的話,此整數是負的,輸出result 
        //negative是false的話,此整數是正的,輸出-result
        return negative ? result : -result;
    }

hashmap是怎麼實現的,是線程安全的嗎

知道hashmap的擴容機制麼

arrylist實現原理

怎麼實現線程安全

互斥同步:推薦使用 synchronized 關鍵字進行同步, 在 concurrent包中有ReentrantLock類, 實現效果差很少. 仍是推薦原生態的synchronized.數據庫

非阻塞同步:須要硬件指令完成.經常使用的指令有:編程

Test-and-Set設計模式

Fetch-and-Increment數組

Swap安全

Compare-and-Swap (CAS)

Load-Linked/Store-Conditional (LL/SC)

典型的應用在 AtomicInteger 中

無同步方案:將變量保存在本地線程中,就不會出現多個線程併發的錯誤了。

java中主要使用的就是ThreadLocal這個類。

2、算法

從矩陣左上角到右下角的走法有多少種

一個長字符串,一個短字符串,短字符串中的字符間順序咱們能夠任意改變,實如今長串中找到短串的代碼

Top k問題

求不相鄰的最大子數組

排序算法有哪些?

介紹一下快排?

private static void quickSort(int[] array, int _left, int _right) {
        int left = _left;//
        int right = _right;
        int pivot;//基準線
        if (left < right) {
            pivot = array[left];
            while (left != right) {
                //從右往左找到比基準線小的數
                while (left < right && pivot <= array[right]) {
                    right--;
                }
                //將右邊比基準線小的數換到左邊
                array[left] = array[right];
                //從左往右找到比基準線大的數
                while (left < right && pivot >= array[left]) {
                    left++;
                }
                //將左邊比基準線大的數換到右邊
                array[right] = array[left];
            }
            //此時left和right指向同一位置
            array[left] = pivot;
            quickSort(array, _left, left - 1);
            quickSort(array, left + 1, _right);
        }
    }

兩個字符串找最長公共子串

n個數中找到長度爲m的和值最大的子串

歸併思想

3、JVM

強軟弱引用以及使用場景

對象的生命週期

如何判斷對象可否回收

對象循環引用了怎麼辦

什麼狀況下會觸發gc

內存泄漏有哪些場景、如何檢測、如何避免

java堆中存放的是什麼,棧中存放什麼。

類加載的過程

類加載的過程主要分爲三個部分:

  • 加載:指的是把class字節碼文件從各個來源經過類加載器裝載入內存中。
  • 連接
  • 初始化:對類變量初始化,是執行類構造器的過程。

連接又能夠細分爲

  • 驗證:爲了保證加載進來的字節流符合虛擬機規範,不會形成安全錯誤。
  • 準備:爲類變量(注意,不是實例變量)分配內存,而且賦予初值。
  • 解析:將常量池內的符號引用替換爲直接引用的過程。

jvm分區

JVM內存模型

程序計數器:記錄正在執行的虛擬機字節碼指令的地址(若是正在執行的是本地方法則爲空)。

Java虛擬機棧:每一個 Java 方法在執行的同時會建立一個棧幀用於存儲局部變量表、操做數棧、常量池引用等信息。每個方法從調用直至執行完成的過程,就對應着一個棧幀在 Java 虛擬機棧中入棧和出棧的過程。

本地方法棧:與 Java 虛擬機棧相似,它們之間的區別只不過是本地方法棧爲本地方法服務。

Java堆:幾乎全部對象實例都在這裏分配內存。是垃圾收集的主要區域("GC 堆"),虛擬機把 Java 堆分紅如下三塊:

  • 新生代
  • 老年代
  • 永久代

新生代又可細分爲Eden空間、From Survivor空間、To Survivor空間,默認比例爲8:1:1。

方法區:方法區(Method Area)與Java堆同樣,是各個線程共享的內存區域。Object Class Data(類定義數據)是存儲在方法區的,此外,常量、靜態變量、JIT編譯後的代碼也存儲在方法區。

運行時常量池:運行時常量池是方法區的一部分。Class 文件中的常量池(編譯器生成的各類字面量和符號引用)會在類加載後被放入這個區域。除了在編譯期生成的常量,還容許動態生成,例如 String 類的 intern()。這部分常量也會被放入運行時常量池。

直接內存:直接內存(Direct Memory)並非虛擬機運行時數據區的一部分,也不是Java虛擬機規範中定義的內存區域,可是這部份內存也被頻繁地使用,並且也可能致使OutOfMemoryError 異常出現。避免在Java堆和Native堆中來回複製數據。

4、網絡和數據庫

Mysql索引選擇

Mysql索引實現

https原理

HTTPS(Secure Hypertext Transfer Protocol) 安全超文本傳輸協議是一個安全的通訊通道,它基於HTTP開發,用於在客戶計算機和服務器之間交換信息。HTTPS使用安全套接字層(SSL)進行信息交換,簡單來講HTTPS是HTTP的安全版,是使用TLS/SSL加密的HTTP協議。

https通訊過程

  • 客戶端發送請求到服務器端
  • 服務器端返回證書和公開密鑰,公開密鑰做爲證書的一部分而存在
  • 客戶端驗證證書和公開密鑰的有效性,若是有效,則生成共享密鑰並使用公開密鑰加密發送到服務器端
  • 服務器端使用私有密鑰解密數據,並使用收到的共享密鑰加密數據,發送到客戶端
  • 客戶端使用共享密鑰解密數據
  • SSL加密創建

5、操做系統

進程間通訊有哪些方式

  • 消息傳遞
    • 管道
    • 消息隊列
    • 套接字
  • 共享內存

6、設計模式

用過哪些設計模式

寫線程安全的單例模式,爲何用volatile和synchronized,底層是怎麼實現的,volatile是可重排序的嗎

public class Singleton {
    private volatile static Singleton instance = null;

    private Singleton() {

    }

    /**
     * 當第一次調用getInstance()方法時,instance爲空,同步操做,保證多線程實例惟一
     * 當第一次後調用getInstance()方法時,instance不爲空,不進入同步代碼塊,減小了沒必要要的同步
     */
    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

7、框架

介紹一下aop

AOP是對OOP的補充和完善。AOP利用的是代理,分爲CGLIB動態代理和JDK動態代理。OOP引入封裝、繼承和多態性等概念來創建一種對象層次結構。OOP編程中,會有大量的重複代碼。而AOP則是將這些與業務無關的重複代碼抽取出來,而後再嵌入到業務代碼當中。實現AOP的技術,主要分爲兩大類:一是採用動態代理技術,利用截取消息的方式,對該消息進行裝飾,以取代原有對象行爲的執行;二是採用靜態織入的方式,引入特定的語法建立「方面」,從而使得編譯器能夠在編譯期間織入有關「方面」的代碼,屬於靜態代理。

8、其餘

設計一個微博 大v可能有幾百萬粉絲 大v發的微博關注他的用戶會有實時通知 用戶那裏能夠查看關注的全部人的微博

短域名和長域名。怎麼根據短域名映射到對應的長域名,怎麼存儲,用什麼數據結構。長域名怎麼轉化獲得短域名的字符串?

統計一個網址訪問次數前10多的ip地址。怎麼保證明時性。

相關文章
相關標籤/搜索