原理:泛型的實現是靠類型擦除技術,類型擦除是在編譯期完成的,在編譯期,編譯器會將泛型的類型參數都擦除成它的限定類型,若是沒有則擦除爲object類型以後在獲取的時候再強制類型轉換爲對應的類型。mysql
使用場景:參數類型能夠用在類、接口和方法的建立中,分別稱爲泛型類、泛型接口和泛型方法。git
優勢:算法
缺點:在性能上不如數組快。sql
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; }
互斥同步:推薦使用 synchronized 關鍵字進行同步, 在 concurrent包中有ReentrantLock類, 實現效果差很少. 仍是推薦原生態的synchronized.數據庫
非阻塞同步:須要硬件指令完成.經常使用的指令有:編程
Test-and-Set設計模式
Fetch-and-Increment數組
Swap安全
Compare-and-Swap (CAS)
Load-Linked/Store-Conditional (LL/SC)
典型的應用在 AtomicInteger 中
無同步方案:將變量保存在本地線程中,就不會出現多個線程併發的錯誤了。
java中主要使用的就是ThreadLocal這個類。
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); } }
類加載的過程主要分爲三個部分:
連接又能夠細分爲
程序計數器:記錄正在執行的虛擬機字節碼指令的地址(若是正在執行的是本地方法則爲空)。
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堆中來回複製數據。
HTTPS(Secure Hypertext Transfer Protocol) 安全超文本傳輸協議是一個安全的通訊通道,它基於HTTP開發,用於在客戶計算機和服務器之間交換信息。HTTPS使用安全套接字層(SSL)進行信息交換,簡單來講HTTPS是HTTP的安全版,是使用TLS/SSL加密的HTTP協議。
https通訊過程
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是對OOP的補充和完善。AOP利用的是代理,分爲CGLIB動態代理和JDK動態代理。OOP引入封裝、繼承和多態性等概念來創建一種對象層次結構。OOP編程中,會有大量的重複代碼。而AOP則是將這些與業務無關的重複代碼抽取出來,而後再嵌入到業務代碼當中。實現AOP的技術,主要分爲兩大類:一是採用動態代理技術,利用截取消息的方式,對該消息進行裝飾,以取代原有對象行爲的執行;二是採用靜態織入的方式,引入特定的語法建立「方面」,從而使得編譯器能夠在編譯期間織入有關「方面」的代碼,屬於靜態代理。