Java開發工程師面試題
1. 什麼是向上轉型,向下轉型?
向上轉型:父類引用指向子類物件。
向下轉型:子類物件指向父類引用(強轉),先向上轉型,在向下轉型,沒有經過向上轉型,會提示編譯錯誤。
2.什麼是陣列,有什麼特點?
陣列是一種容器,可以同時存放多個型別相同的資料。
陣列是一種引用資料型別,當有多個數據型別必須統一,陣列長度在執行期間不可改變長度在建立時給定。
3.什麼是集合,和陣列的區別?
是Java中提供的一種容器,用來儲存多個數據。
陣列的長度是固定的,集合的長度是可變的;陣列中儲存的是同一型別的元素,集合儲存的型別可以不一致;
4.你所知道的List有哪些,特點分別是什麼?
ArrayList:底層的資料結構是陣列,所以查詢快,增刪慢,執行緒不安全
LinkList:底層的資料結構是連結串列,所以查詢慢,增刪快,執行緒不安全
Vector:底層的資料結構是陣列,查詢快,增刪慢,執行緒安全
5.TreeSet是如何排序的?
實現Comparable介面,覆寫compareTo()方法,只能對該類的物件進行比較
匿名內部類比較器,Comparator重寫compare方法,相當於一個外部比較器
6.Queue有哪些,各有什麼特點?
高效能佇列ConcurrentLinkedQueue:使用於高併發場景的佇列,基於連結結點的無界執行緒安全佇列,先進先出,不允許有null元素
阻塞佇列BlockingQueue分為以下五種:
-
ArrayBlockingQueue:基於陣列的阻塞佇列,也叫有界佇列
-
LinkedBlockingQueue:基於連結串列的阻塞佇列,無界佇列
-
PriorityBlockingQueue:基於優先順序的阻塞佇列,優先順序的判斷通過構造器傳入的比較器來決定,是一個無界佇列
-
DelayQueue:帶有延遲時間的佇列,是一個沒有大小的佇列
-
SynchronousQueue:一種沒有緩衝的佇列
7.Hashtable和HashMap的區別?
HashTable繼承自Dirctionary(一個抽象類,用來儲存鍵值對,作用和map類相似,字典類),HashMap繼承自AbstractMap,兩者均實現了Map介面;
HashTable執行緒安全,key和value都不能為空;,HashMap執行緒不安全,key和value都可以為空;
遍歷:HashTable和HashMap兩者都實現了Iterator,但是HashTable還是用了Enumeration;
雜湊值:HashTable是直接使用物件的hashCode,HashMap是重新計算hash值
8.Vector和ArrayList的區別?
Vector是執行緒安全的,ArrayList是執行緒不安全的;
ArrayList在底層陣列不夠用時在原來的基礎上擴充套件0.5倍,Vector是擴充套件1倍;
9.說出幾個IO流物件,各有什麼特點?
File:檔案類
InputStream:抽象類,位元組輸入流
OutputStream:抽象類,位元組輸出流
Reader:抽象類,字元輸入流
Writer:抽象類,字元輸出流
檔案位元組輸入輸出流:FileInputStream,FileOutputStream
檔案字元輸入輸出流:FileReader,File
位元組輸入輸出緩衝流:BufferedInputStream,BufferedOutputStream
字元輸入輸出緩衝流:BufferedReader,BufferedWriter
10.執行緒和程序的關係和區別?
執行緒是程序的基本執行單元,一個程序的所有任務都線上程中執行,程序如果想要執行任務,必須要有執行緒,程序至少要有一條執行緒,程序是指在系統中正在執行的一個應用程式,每個程序之間是獨立的,同一程序的執行緒共享本程序的地址空間、資源。
11.執行緒池有哪些,各有什麼特點?
newCachedThreadPool:可快取執行緒池,執行緒數量不定
newFixedThreadPool:定長執行緒池,執行緒數量固定,當處於閒置狀態也不會被回收
newScheduledThreadPool:週期性執行任務的執行緒池,核心執行緒數是固定的,非核心執行緒數是沒有限制的,非核心執行緒閒置時會被立即回收
newSingleThreadExecutor:單執行緒化的執行緒池,只有一個核心執行緒,以無界佇列方式來執行該執行緒,這使得這些任務之間不需要處理執行緒同步的問題,它確保所有的任務都在同一個執行緒中按順序中執行,並且可以在任意給定的時間不會有多個執行緒是活動的。
12.為什麼要使用資料庫連線池?
如果沒有用連線池,每次發起SQL查詢時首先通過TCP協議的三次握手和資料庫服務建立連線,然後傳送賬號密碼,驗證過後才提交SQL語句執行,執行完畢後再TCP四次揮手最後完成關閉。如果執行多個SQL就會頻繁的建立連線然後關閉,如果用連線池就是用空間換時間思想,系統啟動預先建立多個數據庫連線物件,雖然會佔用一定的記憶體空間,但是可以省去每次SQL查詢時建立連線和關閉連線所消耗的時間。
常用的資料庫連線池:DBCP,C3P0,阿里的DRUID
13.Socket用的是什麼協議,四層協議分別是什麼?
TCP/IP協議,Socket用於通訊,因此需要可靠的網路協議,UDP是不可靠協議,
應用層:HTTP應用程式間溝通的層
傳輸層:TCP、UDP這一層負責資料格式化,資料確認和丟失重傳(傳送資料,並且確定資料已經被送達並接收)
網際網路絡層:IP負責提供基本的資料封包傳送功能,讓每一塊資料包都能夠到達目的主機(郵件的地址)
網路介面層:接收IP資料包並進行傳輸(送郵件的車)
14.詳細說一下三次握手的過程?
所謂的“三次握手”:為了對每次傳送的資料量進行跟蹤與協商,確保資料段的傳送和接收同步,根據所接收到的資料量而確認資料傳送、接收完畢後何時撤消聯絡,並建立虛連線。
為了提供可靠的傳送,TCP在傳送新的資料之前,以特定的順序將資料包的序號,並需要這些包傳送給目標機之後的確認訊息。TCP總是用來發送大批量的資料。當應用程式在收到資料後要做出確認時也要用到TCP。
15.想要讓SQL查詢效率高,可以做哪些工作?
16.什麼是遊標,有哪些分類?
用來儲存多條查詢資料的一種資料結構(資料集),它有一個指標,從上往下移動,從而能夠遍歷每條記錄。遊標就是位於記憶體中的資料集,加快對資料的操作。犧牲記憶體,提高sql執行效率
系統遊標(隱式遊標):系統定義好的遊標,一般在做DML操作時自動觸發,一般用於看影響行數
使用者遊標(顯式遊標):
- 靜態遊標:建立遊標的SQL語句是固定的
- 動態遊標:建立遊標的SQL語句是動態的,帶有引數或變數
17.GET方式和POST方式有哪些區別?
-
GET在瀏覽器回退時是無害的,POST會在次提交請求
-
GET請求產生的URL地址可以被看到,而POST不可以
-
GET請求會被瀏覽器主動快取,而POST不會,除非主動設定
-
GET請求只能進行url編碼,而POST支援多種編碼方式
-
GET請求引數會被完整保留在瀏覽器歷史記錄裡,而POST中的引數不會被保留
-
GET請求在URL中傳送的引數是有長度限制的,而POST沒有
-
對引數的資料型別,GET只接受ASCII字元,而POST沒有限制
-
GET比POST更不安全,因為引數直接暴露在URL上,所以不能用來傳遞敏感資訊
-
GET引數通過URL傳遞,POST放在Request body中
-
GEt和POST請求是HTTP協議中的兩種請求的方法,底層是TCP/IP。GET產生一個TCP資料包,POST產生兩個TCP資料包。對於GET請求瀏覽器會把http header和data一併傳送出去;POST請求會先發送header,伺服器響應100 continue,瀏覽器在傳送data;注:據研究,在網路環境好的情況下,發一次包的時間和發兩次包的時間差別基本可以無視。而在網路環境差的情況下,兩次包的TCP在驗證資料包完整性上,有非常大的優點。並不是所有瀏覽器都會在POST中傳送兩次包,Firefox就只發送一次。
18.CSS選擇器有哪些?
標籤選擇器
ID選擇器
類選擇器
組選擇器
萬用字元選擇器
後代選擇器
子元素選擇器
兄弟選擇器
相鄰選擇器
屬性選擇器
偽類選擇器
19.什麼是盒子模型的坍塌?
父子坍塌:父親沒有設定padding border內容時,子元素垂直方向的margin會賦給父親,父親最終垂直方向的margin為父子中最大的margin值,並非相加
解決方法:把兒子的margin裝換成父親的padding;或給父元素增加position:absolute
並列元素坍塌:垂直方向相遇的盒子模型,會發生margin坍塌,現象就是元素兩者之間的距離並非之和,而是二者之間最大的
解決方法:給第一個元素只設置margin
20.去掉元素的浮動怎麼做?
-
為父元素新增overflow:hidden
-
clear:both
-
floatfix類
21.介面和抽象類的區別?
-
都不能被例項化,但是抽象類裡可以有構造方法,接口裡不能有構造方法
-
介面只有定義,不能有方法的實現,java1.8中可以定義default方法體,而抽象類可以有定義與實現,方法可以在抽象類中實現
-
介面強調特定功能的實現,而抽象類強調所屬關係
-
介面成員變數預設為public static final,必須賦值,不能被修改,其所有的成員方法都是public abstract的,抽象類中成員變數預設default,可在子類中被重新定義,也可被重新賦值,
抽象方法被abstract修飾,不能被private、static、synchrornized和native等修飾。
22.什麼是DI和IoC?什麼是AOP?
23.什麼是本地執行緒,有什麼好處?
執行緒類Thread有個變數叫做threadLocals,它的型別就是ThreadLocal.ThreadLocalMap型別,key是當前執行緒的ThreadLocal物件,值就是要儲存的資料。每個執行緒自己的本地變數,在每個執行緒裡面對變數單獨記錄儲存。
在多執行緒併發執行時,有時需要進行資料共享,所以有了volatile變數解決多執行緒間的資料可見性,也有了鎖的同步機制,使變數或程式碼在某一時刻,只能被一個執行緒訪問,確保資料共享的正確性。有時不需要資料共享,讓每個執行緒都有自己獨立的變數,ThreadLocal就是用於執行緒間的資料隔離的。
24.資料庫事務有哪些特點?
-
原子性:指事務包含的所有操作要麼全部成功,要麼全部失敗回滾
-
一致性:事務必須使資料庫從一個一致性狀態變換到另一個一致性狀態
-
隔離性:當多個使用者併發訪問資料庫時,不能被其他事務的操作所幹擾
-
永續性:一個事務一旦被提交了,對資料庫中的資料的改變就是永久性的
-
髒讀:一個事務處理過程中,讀取了另一個未提交的事務中的資料
-
不可重複讀:對於資料庫中的某一條資料在一個事務範圍內,多次查詢卻返回了不同的資料值
-
幻讀:事務非獨立執行時發生的一種現象,例如事務T1對一個表中所有的行的某個資料項做了從“1”修改為“2”的操作,這時事務T2又對這個表中插入了一行資料項,而這個資料項的數值還是為“1”並且提交給資料庫。而操作事務T1的使用者如果再檢視剛剛修改的資料,會發現還有一行沒有修改,其實這行是從事務T2中新增的,就好像產生幻覺一樣,這就是發生了幻讀。
25.資料庫有哪些鎖?
為了保證資料的一致性,MySQL各儲存引擎使用了三種類型的鎖機制:表級鎖定,行級鎖定和頁級鎖定
-
表級鎖:一次會將整個表鎖定,可以避免死鎖問題,鎖定力度大,鎖衝突概率高,併發度底,開銷小,獲取鎖和釋放鎖的速度很快,適用於查詢為主,少量更新
-
行級鎖:鎖定物件的力度小,發生鎖衝突概率低,併發度高,但是開銷大,加鎖慢,行級鎖容易發生死鎖。適用於對事務完整性要求較高的系統。
InnoDB行級鎖型別
- 共享鎖:讀鎖,多個事務對同一資料進行共享一把鎖,都能訪問到資料,但是隻能讀不能修改
- 排它鎖:寫鎖,排他鎖指的是一個事務在一行資料加上排他鎖後,其他事務不能再在其上加其他的鎖。但可以直接通過select ...from...查詢資料,因為普通查詢沒有任何鎖機制。
- 意向鎖是InnoDB自動加的,不需使用者干預,意向鎖不會與行級的共享/排它鎖互斥
- 頁面鎖:介於行級鎖和表級鎖之間,會發生死鎖,鎖定的資料資源比行鎖要多,因為一個業種可以有多個行記錄,我們使用頁鎖的時候,會出現資料浪費的現象。
26.什麼是檢視,檢視有什麼作用?
儲存的查詢語句,當呼叫的時候,產生結果集,檢視充當的是虛擬表的角色。
簡單:使用檢視的使用者完全不需要關心後面對應的表的結構,關聯條件和篩選條件對使用者來說已經是過濾好的複合條件的結果集
安全:使用檢視的使用者只能訪問他們被允許查詢的結果集,對錶的許可權管理並不能限制到某個行,某個列,但是通過檢視就可以簡單的實現。
資料獨立:一旦檢視的結構確認了,可以遮蔽表結構變化對使用者的影響,源表增加列對檢視沒有影響,源表修改列名,則可以通過修改檢視來解決,不會造成對訪問者的影響
綜上,使用檢視的大部分情況是為了保障資料安全性,提高查詢效率
27.Servlet是單例還是多例,是否執行緒安全?如何解決安全問題?
servlet是單例的,嚴格地說是一個ServletMapping對應一個單例例項(如果一個Servlet被映射了兩個URL地址,會生成兩個例項)。執行緒不安全。維護Servlet執行緒安全通常是使用同步塊(或方法)來保護共享資料,其次可以是volatile、Lock一些鎖機制,還可以使用ThreadLocal來打通安全通道,另外還有原子操作也是用來保護資料安全
28.Spring是單例還是多例?如何配置?
spring生成的物件預設是單例的,通過scope="prototype"可以更改為多例