標籤:禁止訪問 頁面 獲得 排序 查看 允許 syn 握手 迴圈
一些Java基本功的記錄。
Java基礎系列:
Java基礎-1
Java基礎-2
ArrayList與LinkedList的底層實現
ArrayList是List介面的一個實作類別,特點是查詢效率高,增刪效率低,線程不安全
原因是ArrayList底層封裝了一個數組,他是用數組實現的。
| 地址 |
|
數組空間 |
| 2000 |
-------------> |
a[0] |
| 2004 |
-------------> |
a[1] |
| 2008 |
-------------> |
a[2] |
| --- |
-------------> |
... |
| 2000+(n-1)*4 |
-------------> |
a[n] |
定義一個int[]數組,首地址是2000,int類型佔4個位元組,所以a[0]的首地址2000,a[1]就是2004
每次查詢只要一個位移量就可以了,所以查詢效率高
增刪效率低的原因:
| 地址 |
|
數組空間 |
| 2000 |
-------------> |
a[0] |
| 2004 |
-------------> |
(新增元素) |
| 2008 |
-------------> |
a[1] |
| --- |
-------------> |
... |
| 2000+(n-1)*4 |
-------------> |
a[n] |
新增元素會引起後面的元素的移動,所以增刪效率低。
增刪效率高,查詢效率低
LinkedList底層採用雙向迴圈鏈表實現的List,鏈表的儲存特點是不挨著,它儲存每個元素分為三段:上一項的地址,下一項的地址,元素的內容。
每個元素在記憶體中的排列像是隨機的,得根據地址來找元素,所以很慢
增刪很快是因為,刪除一個元素,前後元素會自動連上,而且刪除一個元素隻影響前後元素,所以增刪效率高。
TCP三向交握,以及為什麼不是兩次或四次
第一次握手:用戶端發送TCP包,置SYN標誌位為1,將初始序號X,儲存在包頭的序號(Seq)裡。
第二次握手:服務端回應確認包,置SYN標誌位為1,置ACK為X+1,將初始序號Y,儲存在包頭的序號裡。
第三向交握:用戶端對服務端的確認包進行確認,置SYN標誌位為0,置ACK為Y+1,置序號為Z。
第二次握手後,服務端發送請求給用戶端,服務端以為串連成功了,但是如果實際上用戶端沒收到的話,用戶端會認為串連沒有建立,服務端會對已建立的串連儲存必要的資源,如果出現大量這種情況,服務端會崩潰。
無謂的第四次
二叉樹深度、結點
?二叉樹的第 i 層至多有 2^(i-1) 個結點;
深度為 k 的二叉樹至多有 2^k - 1 ?個結點;
對任何一棵二叉樹 T,如果其終端結點數為 n0,度為 2 的結點數為 n2,則n0 = n2 + 1。
排序演算法的穩定性是指
- 經過排序之後,能使值相同的資料保持原順序中的相對位置不變
HTTP方法
擷取介面資訊
支援等冪性的POST
緊急查看介面的HTTP的頭
提交資料到伺服器
刪除伺服器上的資源
查看支援的方法
常見的HTTP相應狀態代碼
1xx:指示資訊--表示請求已接收,繼續處理2xx:成功--表示請求已被成功接收、理解、接受3xx:重新導向--要完成請求必須進行更進一步的操作4xx:用戶端錯誤--請求有語法錯誤或請求無法實現5xx:伺服器端錯誤--伺服器未能實現合法的請求
101 – 切換協議201 – 已建立。202 – 已接受。203 – 非權威性資訊。204 – 無內容。205 – 重設內容。206 – 部分內容。302 – 對象已移動。304 – 未修改。307 – 臨時重新導向。401 – 訪問被拒絕403 – 禁止訪問404 – 未找到405 – 用來訪問本頁面的 HTTP 謂詞不被允許(方法不被允許)406 – 用戶端瀏覽器不接受所請求頁面的 MIME 類型。407 – 要求進行Proxy 驗證。412 – 前提條件失敗。413 – 請求實體太大。414 – 請求 URI 太長。415 – 不支援的媒體類型。416 – 所請求的範圍無法滿足。417 – 執行失敗。423 – 鎖定的錯誤。500 – 內部伺服器錯誤。200:請求被正常處理204:請求被受理但沒有資源可以返回206:用戶端只是請求資源的一部分,伺服器只對請求的部分資源執行GET方法,相應報文中通過Content-Range指定範圍 的資源。301:永久性重新導向302:臨時重新導向303:與302狀態代碼有相似功能,只是它希望用戶端在請求一個URI的時候,能通過GET方法重新導向到另一個URI上304:發送附帶條件的請求時,條件不滿足時返回,與重新導向無關307:臨時重新導向,與302類似,只是強制要求使用POST方法400:請求報文文法有誤,伺服器無法識別401:請求需要認證403:請求的對應資源禁止被訪問404:伺服器無法找到對應資源500:伺服器內部錯誤503:伺服器正忙
反射機制功能
- 獲得一個對象所屬的類
- 獲得一個類所有的成員變數和方法
- 運行時建立對象
- 運行時調用對象的方法
Java建立對象的方式
- new一個
- 反射機制
- clone()方法
- 還原序列化的方式
Java程式初始化順序
- 父類靜態變數
父類靜態代碼塊
- 子類靜態變數
子類靜態代碼塊
- 父類非靜態變數
- 父類非靜態代碼塊
父類建構函式
- 子類非靜態變數
- 子類非靜態代碼塊
子類建構函式
volatile
用來修飾被不同線程訪問和修改的變數
被volatile類型定義的變數,系統每次用它都是直接從記憶體中取,而不會利用緩衝。
Java堆溢出
public class HeapOOM1 { static class OOMObject{} public static void main(String [] args){ List<OOMObject> list = new ArrayList<OOMObject>(); while (true){ list.add(new OOMObject()); } }}
單例模式
單例模式就是在應用程式中只建立一個該類的對象。又分為餓漢模式和懶漢模式。*實現套路也就是只提供私人建構函式,然後提供公有的 getInstance 方法。*
- 餓漢模式:也就是一開始就建立該對象
- 懶漢模式:等到需要用到的時候才建立該對象
餓漢模式
public class Singleton { private static Singleton singleton = new Singleton(); private Singleton(){}; public static Singleton getInstance(){ return singleton; } }
懶漢模式
public class Singleton { private static Singleton singleton; private Singleton(){}; public static Singleton getInstance(){ if(singleton == null) singleton = new Singleton(); return singleton; } }
多線程 synchronized
public static synchronized Singleton getInstance(){ if(singleton == null) singleton = new Singleton(); return singleton; }
雙重檢驗鎖
public class Singleton { private static volatile Singleton singleton; public static Singleton getInstance() { if (singleton == null) { //Single Checked synchronized (Singleton.class) { if (singleton == null) { //Double Checked singleton = new Singleton(); } } } return singleton; }}
Java基礎-3