標籤:max NPU 類型擦除 exception 情境 情況 垃圾 oca rup
一、Java線程如何終止
- 使用退出標誌,使線程正常退出,也就是當run方法完成後線程終止。
- 使用stop方法強行終止線程。
- 使用interrupt方法中斷線程。
如何用一個cancel方法停止兩個線程泛型原理、使用情境、優缺點
原理:泛型的實現是靠類型擦除技術,類型擦除是在編譯期完成的,在編譯期,編譯器會將泛型的型別參數都擦除成它的限定類型,如果沒有則擦除為object類型之後在擷取的時候再強制類型轉換為對應的類型。
使用情境:參數類型可以用在類、介面和方法的建立中,分別稱為泛型類、泛型介面和泛型方法。
優點:
- 型別安全
- 消除強制類型轉換
- 潛在的效能收益
缺點:在效能上不如數組快。
手寫代碼,設計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這個類。
二、演算法從矩陣左上方到右下角的走法有多少種一個長字串,一個短字串,短字串中的字元間順序我們可以任意改變,實現在長串中找到短串的代碼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的和值最大的子串歸併思想三、JVM強軟弱引用以及使用情境對象的生命週期如何判斷對象能否回收對象循環參考了怎麼辦什麼情況下會觸發gc記憶體流失有哪些情境、如何檢測、如何避免java堆中存放的是什麼,棧中存放什麼。類載入的過程
類載入的過程主要分為三個部分:
- 載入:指的是把class位元組碼檔案從各個來源通過類載入器裝載入記憶體中。
- 連結
- 初始化:對類變數初始化,是執行類構造器的過程。
連結又可以細分為
- 驗證:為了保證載入進來的位元組流符合虛擬機器規範,不會造成安全錯誤。
- 準備:為類變數(注意,不是執行個體變數)分配記憶體,並且賦予初值。
- 解析:將常量池內的符號引用替換為直接引用的過程。
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堆中來回複製資料。
四、網路和資料庫Mysql索引選擇Mysql索引實現https原理
HTTPS(Secure Hypertext Transfer Protocol) 安全超文字傳輸通訊協定 (HTTPS)是一個安全的通訊通道,它基於HTTP開發,用於在客戶電腦和伺服器之間交換資訊。HTTPS使用安全通訊端層(SSL)進行資訊交換,簡單來說HTTPS是HTTP的安全版,是使用TLS/SSL加密的HTTP協議。
https通訊過程
- 用戶端發送請求到伺服器端
- 伺服器端返回認證和公開密鑰,公開密鑰作為認證的一部分而存在
- 用戶端驗證認證和公開密鑰的有效性,如果有效,則產生共用密鑰並使用公開祕密金鑰加密發送到伺服器端
- 伺服器端使用私人密鑰解密資料,並使用收到的共用祕密金鑰加密資料,發送到用戶端
- 用戶端使用共用密鑰解密資料
- SSL加密建立
五、作業系統處理序間通訊有哪些方式
六、設計模式用過哪些設計模式寫安全執行緒的單例模式,為什麼用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; }}
七、架構介紹一下aop
AOP是對OOP的補充和完善。AOP利用的是代理,分為CGLIB動態代理和JDK動態代理。OOP引入封裝、繼承和多態性等概念來建立一種對象階層。OOP編程中,會有大量的重複代碼。而AOP則是將這些與業務無關的重複代碼抽取出來,然後再嵌入到業務代碼當中。實現AOP的技術,主要分為兩大類:一是採用動態代理技術,利用截取訊息的方式,對該訊息進行裝飾,以取代原有對象行為的執行;二是採用靜態織入的方式,引入特定的文法建立“方面”,從而使得編譯器可以在編譯期間織入有關“方面”的代碼,屬於靜態代理。
八、其他設計一個微博 大v可能有幾百萬粉絲 大v發的微博關注他的使用者會有即時通知 使用者那裡可以查看關注的所有人的微博短網域名稱和長網域名稱。怎麼根據短網域名稱映射到對應的長網域名稱,怎麼儲存,用什麼資料結構。長網域名稱怎麼轉化得到短網域名稱的字串?統計一個網址訪問次數前10多的ip地址。怎麼保證即時性。
Keep面經匯總