网易一面总结
先是自我介紹,期間面試官給我的感覺很好
接口和抽象類的區別:
抽象類:可以有構造方法,可以有普通成員變量,可以有非抽象方法,抽象方法修飾符類型可以是public、protected、default,可以有靜態方法,也可以有靜態成員變量。
接口:不可以有構造方法,沒有普通成員變量,不可以有非抽象方法,抽象方法修飾符必須是public,默認是public abstract,不可以包含靜態方法,可以有靜態成員變量。
一個類可以實現多個接口,但是只能繼承一個抽象類。
接口是對動作的抽象(has-a),抽象類是對根源的抽象(is-a)。
進程與線程的區別:
進程是操作系統資源分配的基本單位,而線程是處理器任務調度和執行的基本單位,每個進程都有獨立的代碼和數據空間(程序上下文),程序之間的切換會有較大的開銷;線程可以看做輕量級的進程,同一類線程共享代碼和數據空間,每個線程都有自己獨立的運行棧和PC(程序計數器),線程之間切換的開銷小。如果一個進程內有多個線程,則執行過程不是一條線的,而是多條線(線程)共同完成的;線程是進程的一部分,所以線程也被稱為輕權進程或者輕量級進程。同一進程的線程共享本進程的地址空間和資源,而進程之間的地址空間和資源是相互獨立的。一個進程崩潰后,在保護模式下不會對其他進程產生影響,但是一個線程崩潰整個進程都死掉。所以多進程要比多線程健壯。每個獨立的進程有程序運行的入口、順序執行序列和程序出口。但是線程不能獨立執行,必須依存在應用程序中,由應用程序提供多個線程執行控制,兩者均可并發執行。
tcp/udp:
1、 TCP面向連接 (如打電話要先撥號建立連接); UDP是無連接 的,即發送數據之前不需要建立連接,TCP提供可靠的服務。也就是說,通過TCP連接傳送的數據,無差錯,不丟失,不重復,且按序到達;UDP盡最大努力交付,即不保證可靠交付,Tcp通過校驗和,重傳控制,序號標識,滑動窗口、確認應答實現可靠傳輸。如丟包時的重發控制,還可以對次序亂掉的分包進行順序控制。
2、UDP具有較好的實時性,工作效率比TCP高,適用于對高速傳輸和實時性有較高的通信或廣播通信。每一條TCP連接只能是點到點的;UDP支持一對一,一對多,多對一和多對多的交互通。TCP對系統資源要求較多,UDP對系統資源要求較少。
TCP三次握手四次揮手:
?
?為什么三次握手:
? ? ? ? 防止重復連接引起連接混亂的問題,同步初始化序列化來保證穩定性。
數據庫MySQL默認存儲引擎InnoDB,默認隔離級別 可重復讀
數據庫隔離級別:
讀未提交(RU:read-uncommitted):在RU級別中,事務讀到的所有數據都是最新的數據,可能是事務提交后的數據,也可能是事務執行中的數據(可能會被回滾)。當隔離級別為RU時:所有的讀不加鎖,讀到的數據都是最新的數據,性能最好。所有的寫加行級鎖,寫完釋放。
讀已提交(RC:read-committed):使用MVCC技術,在每一行加入隱藏的字段(DB_TRX_ID:修改該行的最后一個事務的id,DB_ROLL_PTR:指向當前行的undo log日志,DB_ROW_ID:行標識,DELETE_BIT:刪除標志),它實現了不加鎖的讀操作。當隔離級別為RC時:寫操作:加行級鎖。事務開始后,會在UNDO日志中寫入修改記錄,數據行中的隱藏列DATA_POLL_PTR存儲指向該行的UNDO記錄的指針。讀操作:不加鎖。在讀取時,如果該行被其它事務鎖定,則順著隱藏列DATA_POLL_PTR指針,找到上一個有效的歷史記錄(有效的記錄:該記錄對當前事務可見,且DELETE_BIT=0)。
可重復讀(RR:repeatable-read):當隔離級別為RR時:寫操作:加行級鎖。事務開始后,會在UNDO日志中寫入修改記錄,數據行中的隱藏列DATA_POLL_PTR存儲指向該行的UNDO記錄的指針。讀操作:不加鎖。在讀取時,如果該行被其它事務鎖定,則順著隱藏列DATA_POLL_PTR指針,找到上一個有效的歷史記錄(有效的記錄:該記錄對當前事務可見,且DELETE_BIT=0)。
可串行化(serializable):讀寫都會加鎖。
JVM五大內存區域介紹:
?
1、程序計數器
??程序計數器是一塊很小的內存空間,它是線程私有的,可以認作為當前線程的行號指示器。那么計數器記錄虛擬機字節碼指令的地址。如果為native【底層方法】,那么計數器為空。?這塊內存區域是虛擬機規范中唯一沒有OutOfMemoryError的區域。
2、Java棧(虛擬機棧)
棧描述的是Java方法執行的內存模型。每個方法被執行的時候都會創建一個棧幀用于存儲局部變量表,操作棧,動態鏈接,方法出口等信息。每一個方法被調用的過程就對應一個棧幀在虛擬機棧中從入棧到出棧的過程。平時說的棧一般指局部變量表部分。局部變量表所需要的內存空間在編譯期完成分配,當進入一個方法時,這個方法在棧中需要分配多大的局部變量空間是完全確定的,在方法運行期間不會改變局部變量表大小。
Java虛擬機棧可能出現兩種類型的異常:
3、本地方法棧
本地方法棧是與虛擬機棧發揮的作用十分相似,區別是虛擬機棧執行的是Java方法(也就是字節碼)服務,而本地方法棧則為虛擬機使用到的native方法服務,可能底層調用的c或者c++,我們打開jdk安裝目錄可以看到也有很多用c編寫的文件,可能就是native方法所調用的c代碼。
4、堆
堆是java虛擬機管理內存最大的一塊內存區域,因為堆存放的對象是線程共享的,所以多線程的時候也需要同步機制。java虛擬機規范對這塊的描述是:所有對象實例及數組都要在堆上分配內存,但隨著JIT編譯器的發展和逃逸分析技術的成熟,這個說法也不是那么絕對,但是大多數情況都是這樣的。即時編譯器:可以把把Java的字節碼,包括需要被解釋的指令的程序)轉換成可以直接發送給處理器的指令的程序)逃逸分析:通過逃逸分析來決定某些實例或者變量是否要在堆中進行分配,如果開啟了逃逸分析,即可將這些變量直接在棧上進行分配,而非堆上進行分配。這些變量的指針可以被全局所引用,或者其其它線程所引用。堆是所有線程共享的,它的目的是存放對象實例。同時它也是GC所管理的主要區域,因此常被稱為GC堆,又由于現在收集器常使用分代算法,Java堆中還可以細分為新生代和老年代。根據虛擬機規范,Java堆可以存在物理上不連續的內存空間,就像磁盤空間只要邏輯是連續的即可。它的內存大小可以設為固定大小,也可以擴展。當前主流的虛擬機如HotPot都能按擴展實現(通過設置 -Xmx和-Xms),如果堆中沒有內存內存完成實例分配,而且堆無法擴展將報OOM錯誤(OutOfMemoryError)
5、方法區
方法區同堆一樣,是所有線程共享的內存區域,為了區分堆,又被稱為非堆。方法區用于存儲已被虛擬機加載的類信息、常量、靜態變量,如static修飾的變量加載類的時候就被加載到方法區中。在老版jdk,方法區也被稱為永久代。不過自從JDK7之后,Hotspot虛擬機便將運行時常量池從永久代移除了。
手撕代碼:
輸入一個整型數組,數組中的一個或連續多個整數組成一個子數組。求所有子數組的和的最大值。
class?Solution?{
????public?int?maxSubArray(int[]?nums)?{
????????int?prev?=?0;
????????int?maxAns?=?nums[0];
????????for(int?i=0;i<nums.length;i++){
????????????prev?=?Math.max(prev+nums[i],nums[i]);
????????????maxAns?=?Math.max(prev,maxAns);
????????}
????????return?maxAns;
????}
}
給你一個整數n,請你在無限的整數序列找到并返回第n位
class Solution {
public:
? ? int findNthDigit(int n) {
? ? ? ? long long arr[10];//打表,將10^10次方以內的位數界限打出來
? ? ? ? for(int i=0;i<10;i++)
? ? ? ? {
? ? ? ? ? ? if(i!=0)
? ? ? ? ? ? ? ? arr[i] = (pow(10,i+1)-pow(10,i))*(i+1)+arr[i-1];
? ? ? ? ? ? else
? ? ? ? ? ? ? ? arr[i] = 9;
? ? ? ? }
? ? ? ? //確定位數
? ? ? ? int num1=0;
? ? ? ? for(int i=0;i<10;i++)
? ? ? ? {
? ? ? ? ? ? if(n<=arr[i])
? ? ? ? ? ? {
? ? ? ? ? ? ? ? num1=i;
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? long long num2=0;
? ? ? ? if(num1==0)
? ? ? ? ? ? num2 = 0;
? ? ? ? else
? ? ? ? ? ? num2 = arr[num1-1];
? ? ? ??
? ? ? ? long long num3 = (n-num2-1)%(num1+1);
? ? ? ??
? ? ? ? long long num4 = (n-num2-1)/(num1+1);
? ? ? ??
? ? ? ? long long num5=pow(10,num1)+num4;
? ? ? ??
? ? ? ? string str = to_string(num5);
? ? ? ??
? ? ? ? return str[num3]-'0';
? ? }
};
總結
- 上一篇: Grapher是二维绘图软件,主要用于绘
- 下一篇: guacamole1.4.0安装记录