2020年java面試專題答案_第1頁
2020年java面試專題答案_第2頁
2020年java面試專題答案_第3頁
2020年java面試專題答案_第4頁
2020年java面試專題答案_第5頁
已閱讀5頁,還剩20頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、和 JRE 有什么區(qū)別JDK: Java Development Kit 的簡稱, Java 開發(fā)工具包,提供了 Java 的開發(fā)環(huán)境和運(yùn)行環(huán)境。JRE: Java Runtime Environment 的簡稱, Java 運(yùn)行環(huán)境,為 Java 的運(yùn)行提供了所需環(huán)境。具體來說 JDK 其實(shí)包含了JRE ,同時(shí)還包含了編譯Java 源碼的編譯器Javac ,還包含了很多 Java 程序調(diào)試和分析的工具。 簡單來說:如果你需要運(yùn)行Java 程序,只需安裝JRE 就可以了,如果你需要編寫 Java 程序,需要安裝JDK 。2 .= 和 equals 的區(qū)別是什么= 對于基本類型來說是值比較,對于

2、引用類型來說是比較的是引用;而equals 默認(rèn)情況下是引用比較,只是很多類重新了equals 方法,比如 String 、 Integer 等把它變成了值比較,所以一般情況下 equals 比較的是值是否相等。3 . 兩個(gè)對象的 hashCode() 相同,則 equals() 也一定為 true ,對嗎不對,兩個(gè)對象的 hashCode() 相同, equals() 不一定 true 。在 Java 中有什么作用final 修飾的類叫最終類,該類不能被繼承。final 修飾的方法不能被重寫。final 修飾的變量叫常量,常量必須初始化,初始化之后值就不能被修改。中的 Math. round

3、(-1. 5) 等于多少等于 -1 。 round() 是四舍五入,注意負(fù)數(shù)5 是舍的,例如:值是2 ,值是-1 。屬于基礎(chǔ)的數(shù)據(jù)類型嗎String 不屬于基礎(chǔ)類型,基礎(chǔ)類型有8 種: byte 、 boolean 、 char、 short 、 int 、 float 、 long 、 double ,而 String 屬于對象。中操作字符串都有哪些類它們之間有什么區(qū)別操作字符串的類有: String 、 StringBuffer 、 StringBuilder 。String 聲明的是不可變的對象,每次操作都會生成新的 String 對象,然后將指針指向新的 String 對象String

4、Buffer 由于很多方法都被synchronized 修飾了所以線程安全,但是當(dāng)多線程訪問時(shí),加鎖和釋放鎖的過程很平凡,所以效率相比 StringBuilder 要低。 StringBuilder 相反執(zhí)行效率高,但是線程不安全。str="i" 與 St ring str=new String( “ i ” ) 一樣嗎不一樣,因?yàn)閮?nèi)存的分配方式不一樣。 String str= “ i" 的方式, Java 虛擬機(jī)會將其分配到常量池中,如果常量池中有"i ”,就返回 "i" 的地址,如果沒有就創(chuàng)建 "i" ,然后返

5、回 "i" 的地址;而String str=new String( “ i ” ) 則會被分到堆內(nèi)存中新開辟一塊空間。9. 如何將字符串反轉(zhuǎn)使用 StringBuilder 或者 stringBuffer 的 reverse() 方法類的常用方法都有那些indexOf charAt replace toLowerCase toUpperCase substring equals trim split getBytes length11. 抽象類必須要有抽象方法嗎不需要,抽象類不一定非要有抽象方法;但是包含一個(gè)抽象方法的類一定是抽象類。12. 普通類和抽象類有哪些區(qū)別普通類不

6、能包含抽象方法,抽象類可以包含抽象方法。抽象類是不能被實(shí)例化的,就是不能用new調(diào)出構(gòu)造方法創(chuàng)建對象,普通類可以直接實(shí)例化。如果一個(gè)類繼承于抽象類,則該子類必須實(shí)現(xiàn)父類的抽象方法。如果子類沒有實(shí)現(xiàn)父類的抽象方法,則必須將子類也定義為abstract 類。13. 抽象類能使用 final 修飾嗎不能,定義抽象類就是讓其他類繼承的,如果定義為 final 該類就不能被繼承,這樣彼此就會產(chǎn)生矛盾,所以 final 不能修飾抽象類14. 接口和抽象類有什么區(qū)別實(shí)現(xiàn):抽象類的子類使用extends 來繼承;接口必須使用implements 來實(shí)現(xiàn)接口。構(gòu)造函數(shù):抽象類可以有構(gòu)造函數(shù);接口不能有。實(shí)現(xiàn)數(shù)量

7、:類可以實(shí)現(xiàn)很多個(gè)接口;但只能繼承一個(gè)抽象類【 java只支持單繼承】。訪問修飾符:接口中的方法默認(rèn)使用public 修飾;抽象類中的抽象方法可以使用Public和Protected 修飾,如果抽象方法修飾符為 Private ,貝U報(bào)錯(cuò): The abstract method 方法名 in type Test can only set a visibility modifier, one of public or protected 。中IO流分為幾種按功能來分:輸入流(input )、輸出流(output )。按類型來分:字節(jié)流和字符流。字節(jié)流和字符流的區(qū)別是:字節(jié)流按8位傳輸以字節(jié)為單

8、位輸入輸出數(shù)據(jù),字符流按 16位傳輸以字符為單位輸入輸出數(shù)據(jù)。、NIO、AIO有什么區(qū)別BIO: Block IO 同步阻塞式IO ,就是我們平常使用的傳統(tǒng)IO ,它的特點(diǎn)是模式簡單使用方便,并發(fā)處理能力低。NIO: New IO同步非阻塞IO ,是傳統(tǒng)IO的升級,客戶端和服務(wù)器端通過Channel (通道)通訊,實(shí)現(xiàn)了多路復(fù)用。AIO: Asynchronous IO 是NIO的升級,也叫 NIO2 ,實(shí)現(xiàn)了異步非堵塞 IO ,異步IO 的操作基于事件和回調(diào)機(jī)制。的常用方法都有哪些Files. exists。:檢測文件路徑是否存在件夾。Files. delete():刪除一個(gè)文件或目錄Fil

9、es. size() :查看文件個(gè)數(shù)Files. createFile() :創(chuàng)建文件。Files. copy():復(fù)制文件Files. read():讀取文件Files. createDirectory() :創(chuàng)建文Files. move():移動文件。Files. write() :寫入文件容器都有哪些Java容器分為Collection 和Map兩大類,其下又有很多子類Collection List ArrayList LinkedList Vector Stack Set HashSet LinkedHashSet TreeSet Map HashMap LinkedHashMap T

10、reeMap ConcurrentHashMap Hashtable和Collections有什么區(qū)別Collection是一個(gè)集合接口,它提供了對集合對象進(jìn)行基本操作的通用接口方法,所有集合都是它的子類,比如List、Set等Collections是一個(gè)包裝類,包含了很多靜態(tài)方法,不能被實(shí)例化,就像一個(gè)工具類,比如提供的排序方法:Collections.sort(list)允許元素重復(fù)是、Set、Map之間的區(qū)別是什么元素有序List是HashSetTiceSet是(用二叉樹排序Ab5+r actJIipHashMapKey值必須惟一value可申復(fù)TreeMap是用二叉樹排序)21. Ha

11、shMap 和 Hashtable 有什么區(qū)別HashMap是非線程安全的 Hashtable線程安全HashMap對象的key、value值均可為nullHahTable對象的key、value值均不可為null 。22. 如何決定使用 HashMap 還是 TreeMap對于在Map中插入、刪除、定位一個(gè)元素這類操作,HashMap是最好的選擇,因?yàn)橄鄬Χ訦ashMap的插入會更快,但如果你要對一個(gè) key 集合進(jìn)行有序的遍歷,那TreeMap 是更好的選擇23. 說一下 HashMap 的實(shí)現(xiàn)原理(數(shù)組+鏈表、紅黑樹)HashMap 基于 Hash 算法實(shí)現(xiàn)的,我們通過put(key,

12、value) 存儲, get(key) 來獲取。當(dāng)傳入 key 時(shí), HashMap 會根據(jù) key.hashCode() 計(jì)算出 hash 值, 根據(jù) hash 值將 value 保存在 bucket 里。 當(dāng)計(jì)算出的 hash 值相同時(shí),我們稱之為 hash 沖突, HashMap 的做法是用鏈表和紅黑樹存儲相同 hash 值的 value 。當(dāng) hash 沖突的個(gè)數(shù)比較少時(shí),使用鏈表否則使用紅黑樹。24. 說一下 HashSet 的實(shí)現(xiàn)原理HashSet 是基于 HashMap 實(shí)現(xiàn)的, HashSet 底層使用 HashMap 來保存所有元素, 因此 HashSet 的實(shí)現(xiàn)比較簡單,相

13、關(guān)HashSet的操作,基本上都是直接調(diào)用底層 HashMap 的相關(guān)方法來完成, HashSet 不允許重復(fù)的值。和 LinkedList 的區(qū)別是什么ArrayList 是動態(tài)數(shù)組的數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn),而LinkedList 是雙向鏈表的數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)頻繁讀取集合中的元素時(shí),更推薦使用 ArrayList ,而在插入和刪除操作較多時(shí),更推薦使用 LinkedList26. 如何實(shí)現(xiàn)數(shù)組和 List 之間的轉(zhuǎn)換數(shù)組轉(zhuǎn) List :使用 Arrays. asList(array) 進(jìn)行轉(zhuǎn)換。 List 轉(zhuǎn)數(shù)組:使用 List 自帶的 toArray() 方法。和 Vector 的區(qū)別是什么線程安全:

14、Vector 使用了 Synchronized 來實(shí)現(xiàn)線程同步,是線程安全的,而ArrayList 是非線程安全的。性能: ArrayList 在性能方面要優(yōu)于Vector 。擴(kuò)容: ArrayList 和 Vector 都會根據(jù)實(shí)際的需要?jiǎng)討B(tài)的調(diào)整容量,只不過在Vector 擴(kuò)容每次會增加1 倍,而 ArrayList 只會增加 50% 。和 ArrayList 有何區(qū)別Array 可以存儲基本數(shù)據(jù)類型和對象, ArrayList 只能存儲對象。Array 是指定固定大小的,而ArrayList 大小是自動擴(kuò)展的。Array 內(nèi)置方法沒有ArrayList 多,比如 addAll 、 rem

15、oveAll 、 iteration 等方法只有ArrayList 有。29. 在 Queue 中 poll() 和 remove() 有什么區(qū)別相同點(diǎn):都是返回第一個(gè)元素,并在隊(duì)列中刪除返回的對象。不同點(diǎn):如果沒有元素remove() 會直接拋出 NoSuchElementException 異常,而 poll() 會返回 null 。30. 哪些集合類是線程安全的Vector 、 Hashtable 、 Stack 都是線程安全的, 而像 HashMap 則是非線程安全的, 不過在 JDK 之后隨著 Java. util. concurrent 并發(fā)包的出現(xiàn),它們也有了自己對應(yīng)的線程安全類

16、,比如 HashMap 對應(yīng)的線程安全類就是ConcurrentHashMap 。31. 迭代器 Iterator 是什么Iterator 接口提供遍歷任何Collection 的接口。 我們可以從一個(gè)Collection 中使用迭代器方法來獲取迭代器實(shí)例。 迭代器取代了 Java 集合框架中的 Enumeration ,迭代器允許調(diào)用者在迭代過程中移除元素。怎么使用有什么特點(diǎn)Iterator的 特 點(diǎn) 是 更 加 安 全 , 因 為 它 可 以 確 保 , 在 當(dāng) 前 遍 歷 的 集 合 元 素 被 更 改 的 時(shí) 候 , 就 會 拋 出ConcurrentModificationExcep

17、tion 異常。和 ListIterator 有什么區(qū)別Iterator 可以遍歷 Set 和 List 集合,而 ListIterator 只能遍歷 List 。Iterator 只能單向遍歷,而ListIterator 可以雙向遍歷(向前/ 后遍歷) 。ListIterator 從 Iterator 接口繼承,然后添加了一些額外的功能,比如添加一個(gè)元素、替換一個(gè)元素、獲取前面或后面元素的 索引位置。34. 怎么確保一個(gè)集合不能被修改可以使用 Collections. unmodifiableCollection(Collectionc) 方法來創(chuàng)建一個(gè)只讀集合,這樣改變集合的任何操作都會拋

18、出Java. lang. UnsupportedOperationException 異常。35. 并行和并發(fā)有什么區(qū)別并行:多個(gè)處理器或多核處理器同時(shí)處理多個(gè)任務(wù)。并發(fā):多個(gè)任務(wù)在同一個(gè)CPU 核上,按細(xì)分的時(shí)間片輪流( 交替 )執(zhí)行,從邏輯上來看那些任務(wù)是同時(shí)執(zhí)行。36. 線程和進(jìn)程的區(qū)別一個(gè)程序下至少有一個(gè)進(jìn)程,一個(gè)進(jìn)程下至少有一個(gè)線程,一個(gè)進(jìn)程下也可以有多個(gè)線程來增加程序的執(zhí)行速度。37. 守護(hù)線程是什么守護(hù)線程是運(yùn)行在后臺的一種特殊進(jìn)程。它獨(dú)立于控制終端并且周期性地執(zhí)行某種任務(wù)或等待處理某些發(fā)生的事件。在 Java 中垃圾回收線程就是特殊的守護(hù)線程。38. 多線程有幾種實(shí)現(xiàn)方式有 4

19、 種,分別是:- -繼承Thread 類- -實(shí)現(xiàn)Runnable接口- -實(shí)現(xiàn)Callable接口通過FutureTask 包裝器來創(chuàng)建Thread線程- - 通過線程池創(chuàng)建線程,使用線程池接口 ExecutorService 結(jié)合 Callable 、 Future 實(shí)現(xiàn)有返回結(jié)果的多線程。前面兩種【無返回值】原因:通過重寫 run 方法, run 方法的返回值是void ,所以沒有辦法返回結(jié)果。后面兩種【有返回值】原因:通過 Callable 接口,就要實(shí)現(xiàn)call 方法,這個(gè)方法的返回值是Object ,所以返回的結(jié)果可以放在Object 對象中。39. 說一下 Runnable 和

20、Callable 有什么區(qū)別Runnable 沒有返回值, Callable 可以拿到有返回值, Callable 可以看作是Runnable 的補(bǔ)充。40. 線程有哪些狀態(tài)初始 (new) 運(yùn)行 (Runnable) 阻塞狀態(tài) (Blocked) 等待 (Waiting) 超時(shí)等待 (TimedWaiting) 終止 (Terminated)() 和 wait() 有什么區(qū)別類的不同: sleep() 來自 Thread , wait() 來自 Object 。釋放鎖: sleep() 不釋放鎖; wait() 釋放鎖。用法不同: sleep() 時(shí)間到會自動恢復(fù); wait() 可以使用

21、notify()/notifyAll() 直接喚醒。() 和 notifyAll() 有什么區(qū)別notifyAll() 會喚醒所有的線程, notify() 之后喚醒一個(gè)線程。 notifyAll() 調(diào)用后,會將全部線程由等待池移到鎖池,然后參與鎖的競爭,競爭成功則繼續(xù)執(zhí)行,如果不成功則留在鎖池等待鎖被釋放后再次參與競爭。而notify() 只會喚醒一個(gè)線程,具體喚醒哪一個(gè)線程由虛擬機(jī)控制。43. 線程的 run() 和 start() 有什么區(qū)別start() 方法用于啟動線程, run() 方法用于執(zhí)行線程的運(yùn)行時(shí)代碼。 run() 可以重復(fù)調(diào)用,而 start() 只能調(diào)用一次。44.

22、 創(chuàng)建線程池有哪幾種方式線程池創(chuàng)建有七種方式,最核心的是最后一種:newSingleThreadExecutor() :它的特點(diǎn)在于工作線程數(shù)目被限制為1 ,操作一個(gè)無界的工作隊(duì)列,newCachedThreadPool() :它是一種用來處理大量短時(shí)間工作任務(wù)的線程池,具有幾個(gè)鮮明特點(diǎn):它會試圖緩存線程并重用,當(dāng)無緩存線程可用時(shí),就會創(chuàng)建新的工作線程;如果線程閑置的時(shí)間超過 60 秒,則被終止并移出緩存;長時(shí)間閑置時(shí),這種線程池,不會消耗什么資源。其內(nèi)部使用 SynchronousQueue 作為工作隊(duì)列;newFixedThreadPool(int nThreads) : 重 用 指 定

23、數(shù) 目 ( nThreads ) 的 線 程 , 其 背 后 使 用 的 是 無 界 的 工 作 隊(duì) 列 ,newSingleThreadScheduledExecutor() :創(chuàng)建單線程池,返回 ScheduledExecutorService ,可以進(jìn)行定時(shí)或周期性的工作調(diào)度;newScheduledThreadPool(int corePoolSize) : 和 newSingleThreadScheduledExecutor() 類 似 , 創(chuàng) 建 的 是 個(gè)ScheduledExecutorService ,可以進(jìn)行定時(shí)或周期性的工作調(diào)度,區(qū)別在于單一工作線程還是多個(gè)工作線程;ne

24、wWorkStealingPool(int parallelism) :這是一個(gè)經(jīng)常被人忽略的線程池, Java 8 才加入這個(gè)創(chuàng)建方法,其內(nèi)部會構(gòu)建ForkJoinPool ,利用 Work-Stealing 算法,并行地處理任務(wù),不保證處理順序;ThreadPoolExecutor() :是最原始的線程池創(chuàng)建,上面1-3 創(chuàng)建方式都是對ThreadPoolExecutor 的封裝。45. 線程池都有哪些狀態(tài)RUNNING這是最正常的狀態(tài),接受新的任務(wù),處理等待隊(duì)列中的任務(wù)。SHUTDOW郵接受新的任務(wù)提交,但是會繼續(xù)處理等待隊(duì)列中的任務(wù)。STOP不接受新的任務(wù)提交,不再處理等待隊(duì)列中的任務(wù)

25、,中斷正在執(zhí)行任務(wù)的線程。TIDYING:所有的任務(wù)都銷毀了,workCount為0,線程池的狀態(tài)在轉(zhuǎn)換為TIDYING狀態(tài)時(shí),會執(zhí)行鉤子方法terminated。TERMINATE:D terminated()方法結(jié)束后,線程池的狀態(tài)就會變成這個(gè)。46. 線程池中 submit() 和 execute() 方法有什么區(qū)別execute() :只能執(zhí)行Runnable 類型的任務(wù)。submit() :可以執(zhí)行Runnable 和 Callable 類型的任務(wù)。Callable 類型的任務(wù)可以獲取執(zhí)行的返回值,而Runnable 執(zhí)行無返回值。47. 在 Java 程序中怎么保證多線程的運(yùn)行安全

26、方法一:使用安全類,比如 Java. util. concurrent 下的類。方法二:使用自動鎖synchronized 。方法三:使用手動鎖Lock 。48. 多線程中synchronized 鎖升級的原理是什么synchronized 鎖升級原理:在鎖對象的對象頭里面有一個(gè)threadid 字段, 在第一次訪問的時(shí)候threadid 為空, jvm 讓其持有偏向鎖, 并將 threadid 設(shè)置為其線程id , 再次進(jìn)入的時(shí)候會先判斷threadid 是否與其線程id 一致,如果一致則可以直接使用此對象,如果不一致,則升級偏向鎖為輕量級鎖,通過自旋循環(huán)一定次數(shù)來獲取鎖,執(zhí)行一定次數(shù)之后,

27、如果還沒有正常獲取到要使用的對象,此時(shí)就會把鎖從輕量級升級為重量級鎖,此過程就構(gòu)成了 synchronized 鎖的升級。鎖的升級的目的:鎖升級是為了減低了鎖帶來的性能消耗。在 Java 6 之后優(yōu)化 synchronized 的實(shí)現(xiàn)方式,使用了偏向鎖升級為輕量級鎖再升級到重量級鎖的方式,從而減低了鎖帶來的性能消耗。49. 什么是死鎖當(dāng)線程A持有獨(dú)占鎖a,并嘗試去獲取獨(dú)占鎖b的同時(shí),線程B持有獨(dú)占鎖b ,并嘗試獲取獨(dú)占鎖 a的情況下,就會發(fā)生AB兩個(gè)線程由于互相持有對方需要的鎖,而發(fā)生的阻塞現(xiàn)象,我們稱為死鎖。50. 怎么防止死鎖盡量使用 tryLock(long timeout, TimeU

28、nit unit)的方法 (ReentrantLock 、 ReentrantReadWriteLock) ,設(shè)置超時(shí)時(shí)間,超時(shí)可以退出防止死鎖。盡量使用 Java. util. concurrent 并發(fā)類代替自己手寫鎖。盡量降低鎖的使用粒度,盡量不要幾個(gè)功能用同一把鎖。盡量減少同步的代碼塊。是什么有哪些使用場景ThreadLocal 為每個(gè)使用該變量的線程提供獨(dú)立的變量副本,所以每一個(gè)線程都可以獨(dú)立地改變自己的副本,而不會影響其它線程所對應(yīng)的副本。ThreadLocal 的經(jīng)典使用場景是數(shù)據(jù)庫連接和session 管理等52. 說一下 synchronized 底層實(shí)現(xiàn)原理synchron

29、ized 是由一對 monitorenter/monitorexit 指令實(shí)現(xiàn)的, monitor 對象是同步的基本實(shí)現(xiàn)單元。在Java 6 之前,monitor 的實(shí)現(xiàn)完全是依靠操作系統(tǒng)內(nèi)部的互斥鎖,因?yàn)樾枰M(jìn)行用戶態(tài)到內(nèi)核態(tài)的切換,所以同步操作是一個(gè)無差別的重量級操作,性能也很低。但在 Java 6 的時(shí)候, Java 虛擬機(jī) 對此進(jìn)行了大刀闊斧地改進(jìn),提供了三種不同的 monitor 實(shí)現(xiàn),也就是常說的三種不同的鎖:偏向鎖( Biased Locking ) 、輕量級鎖和重量級鎖,大大改進(jìn)了其性能。和 volatile 的區(qū)別是什么volatile 是變量修飾符; synchronize

30、d 是修飾類、方法、代碼段。volatile 僅能實(shí)現(xiàn)變量的修改可見性,不能保證原子性;而synchronized 則可以保證變量的修改可見性和原子性。volatile 不會造成線程的阻塞; synchronized 可能會造成線程的阻塞。和 Lock 有什么區(qū)別synchronized 可以給類、方法、代碼塊加鎖;而lock 只能給代碼塊加鎖。synchronized 不需要手動獲取鎖和釋放鎖, 使用簡單, 發(fā)生異常會自動釋放鎖, 不會造成死鎖; 而 lock 需要自己加鎖和釋放鎖,如果使用不當(dāng)沒有unLock() 去釋放鎖就會造成死鎖。通過 Lock 可以知道有沒有成功獲取鎖,而synch

31、ronized 卻無法辦到。和 ReentrantLock 區(qū)別是什么synchronized 早期的實(shí)現(xiàn)比較低效,對比 ReentrantLock ,大多數(shù)場景性能都相差較大,但是在Java 6 中對 synchronized 進(jìn)行了非常多的改進(jìn)。 主要區(qū)別如下: ReentrantLock 使用起來比較靈活,但是必須有釋放鎖的配合動作; ReentrantLock 必須手動獲取與釋放鎖,而synchronized 不需要手動釋放和開啟鎖;ReentrantLock 只適用于代碼塊鎖,而synchronized 可用于修飾方法、代碼塊等。ReentrantLock 標(biāo)記的變量不會被編譯器優(yōu)化

32、; synchronized 標(biāo)記的變量可以被編譯器優(yōu)化。56. 說一下 atomic 的原理atomic 主要利用 CAS (Compare And Swap) 和 volatile 和 native 方法來保證原子操作,從而避免 synchronized 的高開銷,執(zhí)行效率大為提升。57. 什么是反射反射是在運(yùn)行狀態(tài)中,對于任意一個(gè)類,都能夠知道這個(gè)類的所有屬性和方法;對于任意一個(gè)對象,都能夠調(diào)用它的任意一個(gè)方法和屬性;這種動態(tài)獲取的信息以及動態(tài)調(diào)用對象的方法的功能稱為 Java 語言的反射機(jī)制。58. 什么是 Java 序列化什么情況下需要序列化Java 序列化是為了保存各種對象在內(nèi)存中

33、的狀態(tài),并且可以把保存的對象狀態(tài)再讀出來。以下情況需要使用 Java 序列化:想把的內(nèi)存中的對象狀態(tài)保存到一個(gè)文件中或者數(shù)據(jù)庫中時(shí)候;想用套接字在網(wǎng)絡(luò)上傳送對象的時(shí)候;想通過RMI (遠(yuǎn)程方法調(diào)用)傳輸對象的時(shí)候。59. 動態(tài)代理是什么有哪些應(yīng)用動態(tài)代理是運(yùn)行時(shí)動態(tài)生成代理類。動態(tài)代理的應(yīng)用有spring aop 、 hibernate 數(shù)據(jù)查詢、測試框架的后端 mock 、 rpc , Java 注解對象獲取等。60. 怎么實(shí)現(xiàn)動態(tài)代理JDK 原生動態(tài)代理和cglib 動態(tài)代理。 JDK 原生動態(tài)代理是基于接口實(shí)現(xiàn)的,而 cglib 是基于繼承當(dāng)前類的子類實(shí)現(xiàn)的。61. 為什么要使用克隆克隆

34、的對象可能包含一些已經(jīng)修改過的屬性, 而 new 出來的對象的屬性都還是初始化時(shí)候的值, 所以當(dāng)需要一個(gè)新的對象來保存當(dāng)前對象的“狀態(tài)”就靠克隆方法了。62. 如何實(shí)現(xiàn)對象克隆實(shí)現(xiàn) Cloneable 接口并重寫 Object 類中的 clone() 方法。實(shí)現(xiàn) Serializable 接口,通過對象的序列化和反序列化實(shí)現(xiàn)克隆,可以實(shí)現(xiàn)真正的深度克隆。63. 深拷貝和淺拷貝區(qū)別是什么淺拷貝:當(dāng)對象被復(fù)制時(shí)只復(fù)制它本身和其中包含的值類型的成員變量,而引用類型的成員對象并沒有復(fù)制。深拷貝:除了對象本身被復(fù)制外,對象所包含的所有成員變量也將復(fù)制。和 servlet 有什么區(qū)別JSP 是 servl

35、et 技術(shù)的擴(kuò)展, 本質(zhì)上就是servlet 的簡易方式。 servlet 和 JSP 最主要的不同點(diǎn)在于, servlet 的應(yīng)用邏輯是在 Java 文件中,并且完全從表示層中的 html 里分離開來,而JSP 的情況是 Java 和 html 可以組合成一個(gè)擴(kuò)展名為 JSP 的文件。 JSP 側(cè)重于視圖, servlet 主要用于控制邏輯。有哪些內(nèi)置對象作用分別是什么JSP 有 9 大內(nèi)置對象:request :封裝客戶端的請求,其中包含來自 get 或 post 請求的參數(shù);response :封裝服務(wù)器對客戶端的響應(yīng);pageContext :通過該對象可以獲取其他對象;session

36、 :封裝用戶會話的對象;application :封裝服務(wù)器運(yùn)行環(huán)境的對象;out :輸出服務(wù)器響應(yīng)的輸出流對象;config : Web 應(yīng)用的配置對象;page : JSP 頁面本身(相當(dāng)于Java 程序中的 this ) ;exception :封裝頁面拋出異常的對象。66. 說一下 JSP 的 4 種作用域page:代表與一個(gè)頁面相關(guān)的對象和屬性。request :代表與客戶端發(fā)出的一個(gè)請求相關(guān)的對象和屬性。一個(gè)請求可能跨越多個(gè)頁面,涉及多個(gè)Web 組件;需要在頁面顯示的臨時(shí)數(shù)據(jù)可以置于此作用域。session : 代表與某個(gè)用戶與服務(wù)器建立的一次會話相關(guān)的對象和屬性。 跟某個(gè)用戶相關(guān)

37、的數(shù)據(jù)應(yīng)該放在用戶自己的 session 中。application :代表與整個(gè)Web 應(yīng)用程序相關(guān)的對象和屬性,它實(shí)質(zhì)上是跨越整個(gè)Web 應(yīng)用程序,包括多個(gè)頁面、請求和會話的一個(gè)全局作用域。和 cookie 有什么區(qū)別session :是一種將會話狀態(tài)保存在服務(wù)器端的技術(shù)。Cookie :是在 HTTP 協(xié)議下, Web 服務(wù)器保存在用戶瀏覽器(客戶端)上的小文本文件,它可以包含有關(guān)用戶的信息。無論何時(shí)用戶鏈接到服務(wù)器, Web 站點(diǎn)都可以訪問Cookie 信息 。存儲位置不同: session 存儲在服務(wù)器端; cookie 存儲在瀏覽器端。安全性不同: cookie 安全性一般,在瀏覽

38、器存儲,可以被偽造和修改。容量和個(gè)數(shù)限制: cookie 有容量限制,每個(gè)站點(diǎn)下的 cookie 也有個(gè)數(shù)限制。存儲的多樣性: session 可以存儲在 Redis 中、數(shù)據(jù)庫中、應(yīng)用程序中;而 cookie 只能存儲在瀏覽器中。68. 說一下 session 的工作原理session 的工作原理是客戶端登錄完成之后,服務(wù)器會創(chuàng)建對應(yīng)的 session , session 創(chuàng)建完之后, 會把 session 的 id 發(fā)送給客戶端,客戶端再存儲到瀏覽器中。這樣客戶端每次訪問服務(wù)器時(shí),都會帶著sessionid ,服務(wù)器拿到 sessionid 之后,在內(nèi)存找到與之對應(yīng)的 session 這樣

39、就可以正常工作了。69. 如果客戶端禁止cookie 能實(shí)現(xiàn) session 還能用嗎可以用, session 只是依賴 cookie 存儲 sessionid ,如果 cookie 被禁用了,可以使用 url 中添加 sessionid 的方式保證 session 能正常使用。mvc 和 struts 的區(qū)別是什么攔截級別: struts2 是類級別的攔截; spring mvc 是方法級別的攔截。數(shù)據(jù)獨(dú)立性: spring mvc 的方法之間基本上獨(dú)立的,獨(dú)享request 和 response 數(shù)據(jù),請求數(shù)據(jù)通過參數(shù)獲取,處理結(jié)果通過ModelMap 交回給框架,方法之間不共享變量;而s

40、truts2 雖然方法之間也是獨(dú)立的,但其所有action 變量是共享的,這不會影響程序運(yùn)行,卻給我們編碼和讀程序時(shí)帶來了一定的麻煩。攔截機(jī)制: struts2 有以自己的 interceptor 機(jī)制, spring mvc 用的是獨(dú)立的 aop 方式,這樣導(dǎo)致struts2 的配置文件量比spring mvc 大。對 ajax 的支持: spring mvc 集成了 ajax , 所有 ajax 使用很方便, 只需要一個(gè)注解ResponseBody 就可以實(shí)現(xiàn)了; 而 struts2一般需要安裝插件或者自己寫代碼才行。71. 如何避免 SQL 注入使用預(yù)處理PreparedStatemen

41、t 。使用正則表達(dá)式過濾掉字符中的特殊字符。72. 什么是 XSS 攻擊,如何避免XSS 攻擊:即跨站腳本攻擊,它是Web 程序中常見的漏洞。原理是攻擊者往Web 頁面里插入惡意的腳本代碼( css 代碼、Javascript 代碼等) , 當(dāng)用戶瀏覽該頁面時(shí), 嵌入其中的腳本代碼會被執(zhí)行, 從而達(dá)到惡意攻擊用戶的目的, 如盜取用戶 cookie 、 破壞頁面結(jié)構(gòu)、重定向到其他網(wǎng)站等。 預(yù)防 XSS 的核心是必須對輸入的數(shù)據(jù)做過濾處理。73. 什么是 CSRF 攻擊,如何避免CSRF: Cross-Site Request Forgery (中文:跨站請求偽造) ,可以理解為攻擊者盜用了你的身

42、份,以你的名義發(fā)送惡意請求,比如:以你名義發(fā)送郵件、發(fā)消息、購買商品,虛擬貨幣轉(zhuǎn)賬等。防御手段:驗(yàn)證請求來源地址;關(guān)鍵操作添加驗(yàn)證碼;在請求地址添加token 并驗(yàn)證。和 throws 的區(qū)別throw :是真實(shí)拋出一個(gè)異常。 throws :是聲明可能會拋出一個(gè)異常。、 finally 、 finalize 有什么區(qū)別 final :是修飾符,如果修飾類,此類不能被繼承;如果修飾方法和變量,則表示此方法和此變量不能在被改變,只能使用。finally :是 try catch finally 最后一部分,表示不論發(fā)生任何情況都會執(zhí)行, finally 部分可以省略,但如果finally部分存在

43、,則一定會執(zhí)行finally 里面的代碼。finalize :是Object的protected 方法,子類可以覆蓋該方法以實(shí)現(xiàn)資源清理工作,G%回收對象之前調(diào)用該方法。中哪個(gè)部分可以省略try-catch-finally 其中 catch 和 finally 都可以被省略, 但是不能同時(shí)省略, 也就是說有try 的時(shí)候, 必須后面跟一個(gè)catch或者 finally 。中,如果 catch 中 return 了, finally 還會執(zhí)行嗎finally 一定會執(zhí)行,即使是catch 中 return 了, catch 中的 return 會等 finally 中的代碼執(zhí)行完之后,才會執(zhí)行。

44、78. 常見的異常類有哪些NullPointerException 空指針異常ClassNotFoundException 指定類不存在NumberFormatException 字符串轉(zhuǎn)換為數(shù)字異常IndexOutOfBoundsException 數(shù)組下標(biāo)越界異常ClassCastException 數(shù)據(jù)類型轉(zhuǎn)換異常FileNotFoundException 文件未找到異常NoSuchMethodException 方法不存在異常IOException IO 異常SocketException Socket 異常響應(yīng)碼 301 和 302 代表的是什么有什么區(qū)別301 :永久重定向;302

45、:暫時(shí)重定向。它們的區(qū)別是,301對搜索引擎優(yōu)化(SEO更加有利;302有被提示為網(wǎng)絡(luò)攔截的風(fēng)險(xiǎn)。和 redirect 的區(qū)別forward 是轉(zhuǎn)發(fā) 和 redirect 是重定向:地址欄 url 顯示: foward url 不會發(fā)生改變, redirect url 會發(fā)生改變;數(shù)據(jù)共享: forward 可以共享 request 里的數(shù)據(jù), redirect 不能共享; 效率: forward 比 redirect 效率高。81. 簡述 tcp 和 udp 的區(qū)別tcp 和 udp 是 OSI 模型中的運(yùn)輸層中的協(xié)議。 tcp 提供可靠的通信傳輸, 而 udp 則常被用于讓廣播和細(xì)節(jié)控制交

46、給應(yīng)用的通信傳輸。兩者的區(qū)別大致如下:tcp 面向連接, udp 面向非連接即發(fā)送數(shù)據(jù)前不需要建立鏈接;tcp 提供可靠的服務(wù)(數(shù)據(jù)傳輸) , udp 無法保證;tcp 面向字節(jié)流,udp 面向報(bào)文;tcp 數(shù)據(jù)傳輸慢,udp 數(shù)據(jù)傳輸快;為什么要三次握手,兩次不行嗎為什么我們假設(shè) A 和 B 是通信的雙方。我理解的握手實(shí)際上就是通信,發(fā)一次信息就是進(jìn)行一次握手。第一次握手:A 給 B 打電話說,你可以聽到我說話嗎第二次握手: B 收到了 A 的信息,然后對A 說:我可以聽得到你說話啊,你能聽得到我說話嗎第三次握手:A收到了 B的信息,然后說可以的,我要給你發(fā)信息啦!在三次握手之后,A和B都能

47、確定這么一件事:我說的話,你能聽到;你說的話,我也能聽到。這樣,就可以開始正常通信了。注意:HTTP是基于TCP議的,所以每次都是客戶端發(fā)送請求,服務(wù)器應(yīng)答,但是TCP還可以給其他應(yīng)用層提供服務(wù),即可能 AB 在建立鏈接之后,誰都可能先開始通信。如果采用兩次握手,那么只要服務(wù)器發(fā)出確認(rèn)數(shù)據(jù)包就會建立連接,但由于客戶端此時(shí)并未響應(yīng)服務(wù)器端的請求,那此時(shí)服務(wù)器端就會一直在等待客戶端,這樣服務(wù)器端就白白浪費(fèi)了一定的資源。 若采用三次握手,服務(wù)器端沒有收到來自客戶端的再此確認(rèn),則就會知道客戶端并沒有要求建立請求,就不會浪費(fèi)服務(wù)器的資源。83. 說一下 tcp 粘包是怎么產(chǎn)生的tcp 粘包可能發(fā)生在發(fā)送

48、端或者接收端,分別來看兩端各種產(chǎn)生粘包的原因:發(fā)送端粘包:發(fā)送端需要等緩沖區(qū)滿才發(fā)送出去,造成粘包;接收方粘包:接收方不及時(shí)接收緩沖區(qū)的包,造成多個(gè)包接收。的七層模型都有哪些物理層:利用傳輸介質(zhì)為數(shù)據(jù)鏈路層提供物理連接,實(shí)現(xiàn)比特流的透明傳輸。數(shù)據(jù)鏈路層:負(fù)責(zé)建立和管理節(jié)點(diǎn)間的鏈路。網(wǎng)絡(luò)層:通過路由選擇算法,為報(bào)文或分組通過通信子網(wǎng)選擇最適當(dāng)?shù)穆窂?。傳輸層:向用戶提供可靠的端到端的差錯(cuò)和流量控制,保證報(bào)文的正確傳輸。會話層:向兩個(gè)實(shí)體的表示層提供建立和使用連接的方法。表示層:處理用戶信息的表示問題,如編碼、數(shù)據(jù)格式轉(zhuǎn)換和加密解密等。應(yīng)用層:直接向用戶提供服務(wù),完成用戶希望在網(wǎng)絡(luò)上完成的各種工作。

49、和 post 請求有哪些區(qū)別get 請求會被瀏覽器主動緩存,而 post 不會。get 傳遞參數(shù)有大小限制,而post 沒有。post 參數(shù)傳輸更安全, get 的參數(shù)會明文限制在 url 上, post 不會。86. 如何實(shí)現(xiàn)跨域?qū)崿F(xiàn)跨域有以下幾種方案:服務(wù)器端運(yùn)行跨域 設(shè)置 CORS 等于 * ;在單個(gè)接口使用注解CrossOrigin 運(yùn)行跨域;使用 jsonp 跨域;87. 說一下 JSONP 實(shí)現(xiàn)原理jsonp : JSON with Padding ,它是利用 script 標(biāo)簽的 src 連接可以訪問不同源的特性,加載遠(yuǎn)程返回的“ JS 函數(shù)”來執(zhí)行的。88. 說一下你熟悉的設(shè)計(jì)

50、模式單例模式:保證被創(chuàng)建一次,節(jié)省系統(tǒng)開銷。工廠模式(簡單工廠、抽象工廠) :解耦代碼。觀察者模式:定義了對象之間的一對多的依賴,這樣一來,當(dāng)一個(gè)對象改變時(shí),它的所有的依賴者都會收到通知并自動更新。外觀模式:提供一個(gè)統(tǒng)一的接口,用來訪問子系統(tǒng)中的一群接口,外觀定義了一個(gè)高層的接口,讓子系統(tǒng)更容易使用。模版方法模式:定義了一個(gè)算法的骨架,而將一些步驟延遲到子類中,模版方法使得子類可以在不改變算法結(jié)構(gòu)的情況下,重新定義算法的步驟。狀態(tài)模式:允許對象在內(nèi)部狀態(tài)改變時(shí)改變它的行為,對象看起來好像修改了它的類。89. 簡單工廠和抽象工廠有什么區(qū)別簡單工廠:用來生產(chǎn)同一等級結(jié)構(gòu)中的任意產(chǎn)品,對于增加新的產(chǎn)

51、品,無能為力。工廠方法:用來生產(chǎn)同一等級結(jié)構(gòu)中的固定產(chǎn)品,支持增加任意產(chǎn)品。抽象工廠:用來生產(chǎn)不同產(chǎn)品族的全部產(chǎn)品,對于增加新的產(chǎn)品,無能為力;支持增加產(chǎn)品族。90. 為什么要使用 springspring 提供 ioc 技術(shù),容器會幫你管理依賴的對象,從而不需要自己創(chuàng)建和管理依賴對象了,更輕松的實(shí)現(xiàn)了程序的解耦。spring 提供了事務(wù)支持,使得事務(wù)操作變的更加方便。spring 提供了面向切片編程,這樣可以更方便的處理某一類的問題。更方便的框架集成, spring 可以很方便的集成其他框架,比如 MyBatis 、 hibernate 等。91. 解釋一下什么是aopaop 是面向切面編程

52、,通過預(yù)編譯方式和運(yùn)行期動態(tài)代理實(shí)現(xiàn)程序功能的統(tǒng)一維護(hù)的一種技術(shù)。簡單來說就是統(tǒng)一處理某一“切面” (類)的問題的編程思想,比如統(tǒng)一處理日志、異常等。92. 解釋一下什么是iocioc : Inversionof Control (中文:控制反轉(zhuǎn))是spring 的核心,對于 spring 框架來說,就是由 spring 來負(fù)責(zé)控制對象的生命周期和對象間的關(guān)系。簡單來說,控制指的是當(dāng)前對象對內(nèi)部成員的控制權(quán);控制反轉(zhuǎn)指的是,這種控制權(quán)不由當(dāng)前對象管理了,由其他(類 , 第三方容器)來管理。有哪些主要模塊spring core :框架的最基礎(chǔ)部分,提供ioc 和依賴注入特性。spring con

53、text :構(gòu)建于 core 封裝包基礎(chǔ)上的 context 封裝包,提供了一種框架式的對象訪問方法。spring dao : Data Access Object 提供了 JDBC的抽象層。spring aop :提供了面向切面的編程實(shí)現(xiàn),讓你可以自定義攔截器、切點(diǎn)等。spring Web :提供了針對 Web 開發(fā)的集成特性,例如文件上傳,利用 servlet listeners 進(jìn)行 ioc 容器初始化和針對Web 的ApplicationContext 。spring Web mvc : spring 中的 mvc 封裝包提供了 Web 應(yīng)用的 Model-View-Controlle

54、r (MVC 的實(shí)現(xiàn)。常用的注入方式有哪些setter 屬性注入構(gòu)造方法注入注解方式注入中的 bean 是線程安全的嗎spring 中的 bean 默認(rèn)是單例模式, spring 框架并沒有對單例 bean 進(jìn)行多線程的封裝處理。實(shí)際上大部分時(shí)候 spring bean 無狀態(tài)的 (比如 dao 類) , 所有某種程度上來說 bean 也是安全的, 但如果 bean 有狀態(tài)的話 (比如 view model 對象) ,那就要開發(fā)者自己去保證線程安全了,最簡單的就是改變bean 的作用域,把“ singleton ”變更為“ prototype ”,這樣請求bean 相當(dāng)于 new Bean()

55、 了,所以就可以保證線程安全了。有狀態(tài)就是有數(shù)據(jù)存儲功能。無狀態(tài)就是不會保存數(shù)據(jù)。支持幾種 bean 的作用域spring 支持 5 種作用域,如下:singleton : spring ioc 容器中只存在一個(gè)bean 實(shí)例, bean 以單例模式存在,是系統(tǒng)默認(rèn)值;prototype :每次從容器調(diào)用 bean 時(shí)都會創(chuàng)建一個(gè)新的示例,既每次getBean() 相當(dāng)于執(zhí)行new Bean() 操作;request :每次 http 請求都會創(chuàng)建一個(gè)bean ;session :同一個(gè) http session 共享一個(gè) bean 實(shí)例;global-session : 用于 portlet

56、 容器, 因?yàn)槊總€(gè) portlet 有單獨(dú)的 session , globalsession 提供一個(gè)全局性的 http session 。注意:使用 prototype 作用域需要慎重的思考,因?yàn)轭l繁創(chuàng)建和銷毀bean 會帶來很大的性能開銷。自動裝配 bean 有哪些方式no:默認(rèn)值,表示沒有自動裝配,應(yīng)使用顯式bean引用進(jìn)行裝配。byName它根據(jù)bean的名稱注入對象依賴項(xiàng)。byType:它根據(jù)類型注入對象依賴項(xiàng)。構(gòu)造函數(shù):通過構(gòu)造函數(shù)來注入依賴項(xiàng),需要設(shè)置大量的參數(shù)。autodetect :容器首先通過構(gòu)造函數(shù)使用 autowire 裝配,如果不能,則通過byType 自動裝配。事務(wù)實(shí)現(xiàn)方式有哪些聲明式事務(wù):聲明式事務(wù)也有兩種實(shí)現(xiàn)方式,基于 xml 配置文件的方式和注解方式(在類上添加Transaction 注解) 。編碼方式:提供編碼的形式管理和維護(hù)事務(wù)。99. 說一下 spring 的事務(wù)隔離spring 有五大隔離級別,默認(rèn)值為ISOLATION_DEFAULT(使用數(shù)據(jù)庫的設(shè)置),其他四個(gè)隔離級

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論