面試題&筆試歸納——個人筆記(常見問題,逐步更新)

算法題:

出棧種類:卡特蘭數 ,1,1,2,5,14,42.。。。

 

常識類:

虛擬內存:

虛擬內存隔離了各個進程的內存空間,虛擬內存可以防止應用程序直接訪問物理地址。

SCAN調度(電梯調度)算法,優先滿足掃描方向的請求。

Cookie是Web服務器發送給客戶端的一小段信息,客戶端請求時,可以讀取該信息發送到服務器端

 

協議類:

GBN協議:幀0、1、2、3均已正確接收到,需要重發的是4、5、6、7幀(從最後一個順序往下就行)

UDP,TPC:

 

TCP與UDP最大的不同就是前者是可靠傳輸,後者是不可靠的。爲了保證可靠傳輸,TCP採用了一系列機制,比如序列號是指客戶端確認序列號以及以前的信息都收到了,窗口大小則是提高傳輸效率,保證信息按序到達。這些很明顯UDP是沒有的。

UDP頭部信息只有4個,
從哪來:源端口
到哪去:目的端口
有多長:長度
對不對:校驗和

 

ping 使用的協議爲icmp,通過域名解析,需要用到DNS,局域網中使用arp進行主機間的通信。TCP層是位於IP層之上,應用層之下的中間層。不同主機的應用層之間經常需要可靠的、像管道一樣的連接

ICMP協議是一種面向無連接的協議,用於傳輸出錯報告控制信息。從技術角度來說,ICMP就是一個“錯誤偵測與回報機制”,其目的就是讓我們能夠檢測網路的連線狀況﹐也能確保連線的準確性。當路由器在處理一個數據包的過程中發生了意外,可以通過ICMP向數據包的源端報告有關事件。

DNS:域名到IP地址

ARP:IP地址到物理地址

FTP協議使用TCP20號和21號端口,20號端口用於數據交換,21號端口用於建立連接

SMTP是簡單郵件傳輸協議(Simple Mail Transfer Protocol,SMTP)是爲網絡系統間的電子郵件交換而設計的。使用 25 端口。SMTP只需要在接收端的一個電子郵件地址即可發送郵件。POP3 協議用來接收郵件.使用110端口

TCP建立連接時,首先客戶端和服務器處於close狀態。然後客戶端發送SYN同步位,此時客戶端處於SYN-SEND狀態,服務器處於lISTEN狀態,當服務器收到SYN以後,向客戶端發送同步位SYN和確認碼ACK,然後服務器變爲SYN-RCVD,客戶端收到服務器發來的SYN和ACK後,客戶端的狀態變成ESTABLISHED(已建立連接),客戶端再向服務器發送ACK確認碼,服務器接收到以後也變成ESTABLISHED。然後服務器客戶端開始數據傳輸

https://www.cnblogs.com/tonyluis/p/5729531.html

time wait的原因:防止ack丟失,這時服務器重發fin,客戶端需要能重發ack,因此需要time wait狀態。

https://blog.csdn.net/weibo1230123/article/details/81950420

排序:

 

情景題:

1.如何判斷一個元素在億級數據中是否存在?

https://blog.csdn.net/qq_18661793/article/details/84562372

內容:布隆過濾->https://www.cnblogs.com/liyulong1982/p/6013002.html

2.兩個玻璃球,最快速度找出破碎的臨界點。

一開始感覺網上搜到的方法感覺不太對???

自己做了一下得出的結論是每次分層的最優值爲剩下層數2倍的開平方。最終的答案和網上答案几乎一樣(100層的時候都是取的14層)

擴展問題是m層樓n個玻璃球,最快找出臨界點。

 

大量讀操作,少量寫操作:數據庫讀寫分離;

https://blog.csdn.net/rlnlo2pnefx9c/article/details/82754262

使用緩存時面對讀寫操作如何更新數據:

https://blog.csdn.net/hukaijun/article/details/81010475


基礎題:

c/c++

1.保護成員和私有成員的區別在於把保護成員的訪問範圍擴展到派生類中。x

https://blog.csdn.net/qq_41199502/article/details/80703943

2.構造函數,析構函數

https://www.cnblogs.com/MrListening/p/5567762.html

數據庫:

數據庫事務的四大特性爲:

1. 原子性

原子性是指事務包含的所有操作要麼全部成功,要麼全部失敗回滾

事務是用戶定義的一個數據庫操作序列,這些操作要麼全做,要麼全不做,是一個不可分割的工作單位。

2. 一致性

一致性是指事務必須使數據庫從一個一致性狀態變換到另一個一致性狀態,也就是說一個事務執行之前和執行之後都必須處於一致性狀態。

3. 隔離性

當多個用戶併發訪問數據庫時,比如操作同一張表時,數據庫爲每一個用戶開啓的事務,不能被其他事務的操作所幹擾,多個併發事務之間要相互隔離。

4. 持續性

持久性是指一個事務一旦被提交了,那麼對數據庫中的數據的改變就是永久性的,即便是在數據庫系統遇到故障的情況下也不會丟失提交事務的操作。

 

Java:

代解決:1.多線程安全的hashmap,2.反射和多態在jvm底層的實現

å¾ 1.JVM è¿è¡æ¶ç»æ

 

  • 在JDK6.0及之前版本,字符串常量池是放在Perm Gen區(也就是方法區)中;
  • 在JDK7.0版本,字符串常量池被移到了堆中了。至於爲什麼移到堆內,大概是由於方法區的內存空間太小了。
  • 運行時常量池(Runtime Constant Pool)是方法區的一部分

 

 

1.JVM在調用main之前先對靜態內容(static)初始化,順序爲:父類的靜態變量, 父類的靜態代碼塊 ,子類的靜態變量,子類的靜態代碼塊。

類方法就是被static修飾的方法,無this指針。可以將this理解爲對象,而類方法屬於類,不屬於對象,所以類方法前不能加this指針。

靜態塊>main()>構造塊>構造方法 

如果首先出現靜態變量,則先運行靜態變量類中的構造塊,然後運行本類的靜態塊,最後main

 

2.final修飾的類不能被繼承,不允許被子類覆蓋,修飾的局部變量只能被賦值一次,爲常量。靜態成員變量未被final時,它的值可以被更改。

在接口中,屬性都是默認public static final修飾的,可省略(接口中的變量因爲是final所以需要賦值)

類的final成員變量必須滿足以下其中一個條件

 1、在構造函數中賦值

 2、初始化賦值

3.finally塊中如果有return語句,會覆蓋掉函數中的其他return語句

finalize:

finalize()是在java.lang.Object裏定義的,也就是說每一個對象都有這麼個方法。這個方法在gc啓動,該對象被回收的時候被調用。其實gc可以回收大部分的對象(凡是new出來的對象,gc都能搞定,一般情況下我們又不會用new以外的方式去創建對象),所以一般是不需要程序員去實現finalize的。 
特殊情況下,需要程序員實現finalize,當對象被回收的時候釋放一些資源,比如:一個socket鏈接,在對象初始化時創建,整個生命週期內有效,那麼就需要實現finalize,關閉這個鏈接。 
  使用finalize還需要注意一個事,調用super.finalize();

  一個對象的finalize()方法只會被調用一次,而且finalize()被調用不意味着gc會立即回收該對象,所以有可能調用finalize()後,該對象又不需要被回收了,然後到了真正要被回收的時候,因爲前面調用過一次,所以不會調用finalize(),產生問題。 所以,推薦不要使用finalize()方法,它跟析構函數不一樣。(析構函數(destructor) 與構造函數相反,當對象結束其生命週期,如對象所在的函數已調用完畢時,系統自動執行析構函數。析構函數往往用來做“清理善後” 的工作(例如在建立對象時用new開闢了一片內存空間,delete會自動調用析構函數後釋放內存)。)

4.volatile:https://www.cnblogs.com/dolphin0520/p/3920373.html (很詳細)

  • 原子性 (synchronized和Lock能夠保證任一時刻只有一個線程執行該代碼塊,那麼自然就不存在原子性問題了,從而保證了原子性。)
  • 可見性(當一個共享變量被volatile修飾時,它會保證修改的值會立即被更新到主存,當有其他線程需要讀取時,它會去內存中讀取新值。另外,通過synchronized和Lock也能夠保證可見性,synchronized和Lock能保證同一時刻只有一個線程獲取鎖然後執行同步代碼,並且在釋放鎖之前會將對變量的修改刷新到主存當中。因此可以保證可見性。)
  • 有序性(可以通過volatile關鍵字來保證一定的“有序性”(具體原理在下一節講述)。另外可以通過synchronized和Lock來保證有序性,很顯然,synchronized和Lock保證每個時刻是有一個線程執行同步代碼,相當於是讓線程順序執行同步代碼,自然就保證了有序性。)

volatile:https://www.jianshu.com/p/157279e6efdb

JMM通過控制主內存與每個線程的本地內存之間的交互,來爲java程序員提供內存可見性保證

5.

1、基本型和基本型封裝型進行“==”運算符的比較,基本型封裝型將會自動拆箱變爲基本型後再進行比較,因此Integer(0)會自動拆箱爲int類型再進行比較,顯然返回true;
2、兩個Integer類型進行“==”比較,如果其值在-128至127,那麼返回true,否則返回false, 這跟Integer.valueOf()的緩衝對象有關,這裏不進行贅述。

詳細解釋,Java面試——從JVM角度比較equals和==的區別https://blog.csdn.net/seu_calvin/article/details/52089040


3、兩個基本型的封裝型進行equals()比較,首先equals()會比較類型,如果類型相同,則繼續比較值,如果值也相同,返回true
4、基本型封裝類型調用equals(),但是參數是基本類型,這時候,先會進行自動裝箱,基本型轉換爲其封裝類型,再進行3中的比較。

泛型只是提高了數據傳輸安全性,並沒有改變程序運行的性能

int a=257;
Integer b=257;
Integer c=257;
Integer b2=57;
Integer c2=57;
System.out.println(a==b);
//System.out.println(a.equals(b));  編譯出錯,基本型不能調用equals()
System.out.println(b.equals(257.0));
System.out.println(b==c);
System.out.println(b2==c2);

因此上面的代碼的結果因此爲 true, false, false, true

6. 父類子類跳轉問題 https://blog.csdn.net/zhumintao/article/details/53818972

7.servlet 

servlet生命週期:init 、service、destory

除了init只初始化一次外、其他 用戶端運行JSP時方法都會運行一次

8.

9.判斷 | 和||, &和&&

一個爲位或和與或,兩邊的都要運行,||和&&,先判斷左邊在看右邊的是否運行。(短路功能)

10.內存

在函數中定義的一些基本類型的變量和對象的引用變量都是在函數的棧內存中分配。當在一段代碼塊中定義一個變量時,java就在棧中爲這個變量分配內存空間,當超過變量的作用域後,java會自動釋放掉爲該變量分配的內存空間,該內存空間可以立刻被另作他用。

堆內存用於存放由new創建的對象和數組。在堆中分配的內存,由java虛擬機自動垃圾回收器來管理。在堆中產生了一個數組或者對象後,還可以在棧中定義一個特殊的變量,這個變量的取值等於數組或者對象在堆內存中的首地址,在棧中的這個特殊的變量就變成了數組或者對象的引用變量,以後就可以在程序中使用棧內存中的引用變量來訪問堆中的數組或者對象,引用變量相當於爲數組或者對象起的一個別名,或者代號。

11. 接口

接口中默認修飾變量屬性用:public static final;而默認方法的修飾符是:public abstract

對於外部類來說,只有兩種修飾,public和默認(default),因爲外部類放在包中,只有兩種可能,包可見和包不可見。

對於內部類來說,可以有所有的修飾,因爲內部類放在外部類中,與成員變量的地位一致,所以有四種可能。

12.權限

13

>>爲帶符號右移,右移後左邊的空位被填充爲符號位

>>>爲不帶符號右移,右移後左邊的空位被填充爲0

沒有<<< 因爲<<後右邊總是補0

14.線程

synchronize,lock,condition:http://blog.csdn.net/vking_wang/article/details/9952063

stringbuffer和stringbuilder:https://blog.csdn.net/seu_calvin/article/details/52094905

  • 一個線程只能屬於一個進程,而一個進程可以有多個線程,但至少有一個線程(通常說的主線程)。
  • 資源分配給進程,同一進程的所有線程共享該進程的所有資源。
  • 線程在執行過程中,需要協作同步。不同進程的線程間要利用消息通信的辦法實現同步。
  • 處理機分給線程,即真正在處理機上運行的是線程。
  • 線程是指進程內的一個執行單元,也是進程內的可調度實體。

15 序列化

Java在序列化時不會實例化static變量和transient修飾的變量,因爲static代表類的成員,transient代表對象的臨時數據,被聲明這兩種類型的數據成員不能被序列化。

16 異常

異常分爲運行時異常,非運行時異常和error,其中error是系統異常,只能重啓系統解決。非運行時異常需要我們自己補獲,而運行異常是程序運行時由虛擬機幫助我們補獲,運行時異常包括數組的溢出,內存的溢出空指針,分母爲0等

Error類體系描述了Java運行系統中的內部錯誤以及資源耗盡的情形,Error不需要捕捉

17 IO模型

BIO每一個請求開一個線程,第二個用線程池,第三個NIO是基於通道(Channel)和緩衝區(Buffer)進行操作,數據總是從通道讀取到緩衝區中,或者從緩衝區寫入到通道中,當線程從通道讀取數據到緩衝區時,線程還是可以進行其他事情。當數據被寫入到緩衝區時,線程可以繼續處理它。從緩衝區寫入通道也類似。第四個異步處理(Future),使用信號量,結束時運行回調方法

https://blog.csdn.net/szxiaohe/article/details/81542605

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章