BAT 常問的 Java基礎(chǔ)39道常見面試題
1.八種基本數(shù)據(jù)類型的大小谤饭,以及他們的封裝類
2.引用數(shù)據(jù)類型
3.Switch能否用string做參數(shù)
4.equals與==的區(qū)別
5.自動(dòng)裝箱骚灸,常量池
6.Object有哪些公用方法
7.Java的四種引用向瓷,強(qiáng)弱軟虛庐船,用到的場(chǎng)景
8.Hashcode的作用
9.HashMap的hashcode的作用
10.為什么重載hashCode方法?
11.ArrayList畅哑、LinkedList仇轻、Vector的區(qū)別
12.String、StringBuffer與StringBuilder的區(qū)別
13.Map焦人、Set挥吵、List诅愚、Queue扁瓢、Stack的特點(diǎn)與用法
14.HashMap和HashTable的區(qū)別
15.JDK7與JDK8中HashMap的實(shí)現(xiàn)
16.HashMap和ConcurrentHashMap的區(qū)別,HashMap的底層源碼
17.ConcurrentHashMap能完全替代HashTable嗎
18.為什么HashMap是線程不安全的
19.如何線程安全的使用HashMap
20.多并發(fā)情況下HashMap是否還會(huì)產(chǎn)生死循環(huán)
21.TreeMap吭产、HashMap个从、LindedHashMap的區(qū)別
22.Collection包結(jié)構(gòu)脉幢,與Collections的區(qū)別
23.try?catch?finally,try里有return嗦锐,finally還執(zhí)行么
24.Excption與Error包結(jié)構(gòu)嫌松,OOM你遇到過哪些情況,SOF你遇到過哪些情況
25.Java(OOP)面向?qū)ο蟮娜齻€(gè)特征與含義
26.Override和Overload的含義去區(qū)別
27.Interface與abstract類的區(qū)別
28.Static?class?與non?static?class的區(qū)別
29.foreach與正常for循環(huán)效率對(duì)比
30.Java?IO與NIO
31.java反射的作用于原理
32.泛型常用特點(diǎn)
33.解析XML的幾種方式的原理與特點(diǎn):DOM奕污、SAX
34.Java1.7與1.8,1.9,10 新特性
35.設(shè)計(jì)模式:?jiǎn)卫帷⒐S、適配器碳默、責(zé)任鏈贾陷、觀察者等等
36.JNI的使用
37.AOP是什么
38.OOP是什么
39.AOP與OOP的區(qū)別
Java 多線程面試題
1、多線程有什么用嘱根?
2髓废、創(chuàng)建線程的方式
3、start()方法和run()方法的區(qū)別
4该抒、Runnable接口和Callable接口的區(qū)別
5慌洪、CyclicBarrier和CountDownLatch的區(qū)別
6、volatile關(guān)鍵字的作用
7凑保、什么是線程安全
8冈爹、Java中如何獲取到線程dump文件
9、一個(gè)線程如果出現(xiàn)了運(yùn)行時(shí)異常會(huì)怎么樣
10欧引、如何在兩個(gè)線程之間共享數(shù)據(jù)
11频伤、sleep方法和wait方法有什么區(qū)別
12、生產(chǎn)者消費(fèi)者模型的作用是什么
13芝此、ThreadLocal有什么用
14憋肖、為什么wait()方法和notify()/notifyAll()方法要在同步塊中被調(diào)用
15因痛、wait()方法和notify()/notifyAll()方法在放棄對(duì)象監(jiān)視器時(shí)有什么區(qū)別
16、為什么要使用線程池
17瞬哼、怎么檢測(cè)一個(gè)線程是否持有對(duì)象監(jiān)視器
18、synchronized和ReentrantLock的區(qū)別
19租副、ConcurrentHashMap的并發(fā)度是什么
20坐慰、ReadWriteLock是什么
21、FutureTask是什么
22用僧、Linux環(huán)境下如何查找哪個(gè)線程使用CPU最長(zhǎng)
23结胀、Java編程寫一個(gè)會(huì)導(dǎo)致死鎖的程序
24、怎么喚醒一個(gè)阻塞的線程
25责循、不可變對(duì)象對(duì)多線程有什么幫助
26糟港、什么是多線程的上下文切換
27、如果你提交任務(wù)時(shí)院仿,線程池隊(duì)列已滿秸抚,這時(shí)會(huì)發(fā)生什么
28、Java中用到的線程調(diào)度算法是什么
29歹垫、Thread.sleep(0)的作用是什么
30剥汤、什么是自旋
31、什么是Java內(nèi)存模型
32排惨、什么是CAS
33吭敢、什么是樂觀鎖和悲觀鎖
34、什么是AQS
35暮芭、單例模式的線程安全性
36鹿驼、Semaphore有什么作用
37、Hashtable的size()方法中明明只有一條語句"return count"辕宏,為什么還要做同步畜晰?
38、線程類的構(gòu)造方法瑞筐、靜態(tài)塊是被哪個(gè)線程調(diào)用的
39舷蟀、同步方法和同步塊,哪個(gè)是更好的選擇
40面哼、高并發(fā)野宜、任務(wù)執(zhí)行時(shí)間短的業(yè)務(wù)怎樣使用線程池?并發(fā)不高魔策、任務(wù)執(zhí)行時(shí)間長(zhǎng)的業(yè)務(wù)怎樣使用線程池匈子?并發(fā)高、業(yè)務(wù)執(zhí)行時(shí)間長(zhǎng)的業(yè)務(wù)怎樣使用線程池闯袒?
跳槽必備的100道 Java 面試題
多線程虎敦、并發(fā)及線程的基礎(chǔ)問題
1)Java 中能創(chuàng)建 volatile 數(shù)組嗎游岳?
2)volatile 能使得一個(gè)非原子操作變成原子操作嗎?
3)volatile 修飾符的有過什么實(shí)踐其徙?
4)volatile 類型變量提供什么保證胚迫?
- 10 個(gè)線程和 2 個(gè)線程的同步代碼,哪個(gè)更容易寫唾那?
6)你是如何調(diào)用 wait()方法的访锻?使用 if 塊還是循環(huán)?為什么闹获?
7)什么是多線程環(huán)境下的偽共享(false sharing)期犬?
有經(jīng)驗(yàn)程序員的 Java 面試題
8)什么是 Busy spin?我們?yōu)槭裁匆褂盟?/p>
9)Java 中怎么獲取一份線程 dump 文件避诽?
10)Swing 是線程安全的龟虎?
11)什么是線程局部變量?
12)Java 中 sleep 方法和 wait 方法的區(qū)別沙庐?
13)什么是不可變對(duì)象(immutable object)鲤妥?Java 中怎么創(chuàng)建一個(gè)不可變對(duì)象?
14)我們能創(chuàng)建一個(gè)包含可變對(duì)象的不可變對(duì)象嗎拱雏?
15)Java 中應(yīng)該使用什么數(shù)據(jù)類型來代表價(jià)格旭斥?
16)怎么將 byte 轉(zhuǎn)換為 String?
17)Java 中怎樣將 bytes 轉(zhuǎn)換為 long 類型古涧?
18)我們能將 int 強(qiáng)制轉(zhuǎn)換為 byte 類型的變量嗎垂券?如果該值大于 byte 類型的范圍,將會(huì)出現(xiàn)什么現(xiàn)象羡滑?
19)哪個(gè)類包含 clone 方法菇爪?是 Cloneable 還是 Object?
20)Java 中 ++ 操作符是線程安全的嗎柒昏?
21)不是線程安全的操作凳宙。它涉及到多個(gè)指令,如讀取變量值职祷,增加氏涩,
22)a = a + b 與 a += b 的區(qū)別
23)我能在不進(jìn)行強(qiáng)制轉(zhuǎn)換的情況下將一個(gè) double 值賦值給 long 類型的變量嗎?
24)3*0.1 == 0.3 將會(huì)返回什么有梆?true 還是 false是尖?
25)int 和 Integer 哪個(gè)會(huì)占用更多的內(nèi)存?
26)為什么 Java 中的 String 是不可變的(Immutable)泥耀?
27)我們能在 Switch 中使用 String 嗎饺汹?
28)Java 中的構(gòu)造器鏈?zhǔn)鞘裁矗?/p>
JVM 底層 與 GC(Garbage Collection) 的面試問題
29)64 位 JVM 中,int 的長(zhǎng)度是多數(shù)痰催?
30)Serial 與 Parallel GC之間的不同之處兜辞?
31)32 位和 64 位的 JVM迎瞧,int 類型變量的長(zhǎng)度是多數(shù)?
32)Java 中 WeakReference 與 SoftReference的區(qū)別逸吵?
33)WeakHashMap 是怎么工作的凶硅?
34)JVM 選項(xiàng) -XX:+UseCompressedOops 有什么作用?為什么要使
35)怎樣通過 Java 程序來判斷 JVM 是 32 位 還是 64 位扫皱?
36)32 位 JVM 和 64 位 JVM 的最大堆內(nèi)存分別是多數(shù)足绅?
37)JRE、JDK啸罢、JVM 及 JIT 之間有什么不同编检?
3 年工作經(jīng)驗(yàn)的 Java 面試題
38)解釋 Java 堆空間及 GC胎食?
39)你能保證 GC 執(zhí)行嗎扰才?
40)怎么獲取 Java 程序使用的內(nèi)存?堆使用的百分比厕怜?
41)Java 中堆和棧有什么區(qū)別衩匣?
Java 基本概念面試題
42)“a==b”和”a.equals(b)”有什么區(qū)別?
43)a.hashCode() 有什么用粥航?與 a.equals(b) 有什么關(guān)系琅捏?
44)final、finalize 和 finally 的不同之處递雀?
45)Java 中的編譯期常量是什么柄延?使用它又什么風(fēng)險(xiǎn)?
Java 集合框架的面試題
46)List缀程、Set搜吧、Map 和 Queue 之間的區(qū)別(答案)
47)poll() 方法和 remove() 方法的區(qū)別?
48)Java 中 LinkedHashMap 和 PriorityQueue 的區(qū)別是什么杨凑?
49)ArrayList 與 LinkedList 的不區(qū)別滤奈?
50)用哪兩種方式來實(shí)現(xiàn)集合的排序?
51)Java 中怎么打印數(shù)組撩满?
52)Java 中的 LinkedList 是單向鏈表還是雙向鏈表蜒程?
53)Java 中的 TreeMap 是采用什么樹實(shí)現(xiàn)的?(答案)
54)Hashtable 與 HashMap 有什么不同之處伺帘?
55)Java 中的 HashSet昭躺,內(nèi)部是如何工作的?
56)寫一段代碼在遍歷 ArrayList 時(shí)移除一個(gè)元素伪嫁?
57)我們能自己寫一個(gè)容器類窍仰,然后使用 for-each 循環(huán)碼?
58)ArrayList 和 HashMap 的默認(rèn)大小是多數(shù)礼殊?
59)有沒有可能兩個(gè)不相等的對(duì)象有有相同的 hashcode驹吮?
60)兩個(gè)相同的對(duì)象會(huì)有不同的的 hash code 嗎针史?
61)Java 中,Comparator 與 Comparable 有什么不同碟狞?
62)為什么在重寫 equals 方法的時(shí)候需要重寫 hashCode 方法啄枕?
Java IO 和 NIO 的面試題
63)Java 中怎么創(chuàng)建 ByteBuffer?
Java 最佳實(shí)踐的面試問題
64)Java 中族沃,編寫多線程程序的時(shí)候你會(huì)遵循哪些最佳實(shí)踐频祝?
65)說出幾點(diǎn) Java 中使用 Collections 的最佳實(shí)踐
66)說出 5 條 IO 的最佳實(shí)踐(答案)
67)說出幾條 Java 中方法重載的最佳實(shí)踐?
Date脆淹、Time 及 Calendar 的面試題
68)在多線程環(huán)境下常空,SimpleDateFormat 是線程安全的嗎?
單元測(cè)試 JUnit 面試題
69)如何測(cè)試靜態(tài)方法盖溺?
70)Java 中如何將字符串轉(zhuǎn)換為整數(shù)漓糙?
關(guān)于 OOP 和設(shè)計(jì)模式的面試題
71)接口是什么?為什么要使用接口而不是直接使用具體類烘嘱?
72)Java 中昆禽,抽象類與接口之間有什么不同?
73)除了單例模式蝇庭,你在生產(chǎn)環(huán)境中還用過什么設(shè)計(jì)模式醉鳖?
74)什么情況下會(huì)違反迪米特法則?為什么會(huì)有這個(gè)問題哮内?
75)適配器模式是什么盗棵?什么時(shí)候使用?
76)什么是“依賴注入”和“控制反轉(zhuǎn)”北发?為什么有人使用纹因?
77)抽象類是什么?它與接口有什么區(qū)別鲫竞?你為什么要使用過抽象類辐怕?
78)構(gòu)造器注入和 setter 依賴注入,那種方式更好从绘?
79)依賴注入和工程模式之間有什么不同寄疏?
80)適配器模式和裝飾器模式有什么區(qū)別?
81)適配器模式和代理模式之前有什么不同僵井?
82)什么是模板方法模式陕截?
83)什么時(shí)候使用訪問者模式?
84)什么時(shí)候使用組合模式批什?
85)繼承和組合之間有什么不同农曲?
86)描述 Java 中的重載和重寫?
87)Java 中,嵌套公共靜態(tài)類與頂級(jí)類有什么不同乳规?
88)OOP 中的 組合形葬、聚合和關(guān)聯(lián)有什么區(qū)別?
89)給我一個(gè)符合開閉原則的設(shè)計(jì)模式的例子暮的?
90)抽象工廠模式和原型模式之間的區(qū)別笙以?
91)什么時(shí)候使用享元模式?
Java 面試中其他各式各樣的問題
92)嵌套靜態(tài)類與頂級(jí)類有什么區(qū)別冻辩?
93)你能寫出一個(gè)正則表達(dá)式來判斷一個(gè)字符串是否是一個(gè)數(shù)字嗎猖腕?
94)Java 中,受檢查異常 和 不受檢查異常的區(qū)別恨闪?
95)Java 中倘感,throw 和 throws 有什么區(qū)別
96)Java 中,Serializable 與 Externalizable 的區(qū)別咙咽?
97)Java 中老玛,DOM 和 SAX 解析器有什么不同?
98)說出 JDK 1.7 中的三個(gè)新特性犁珠?
99)說出 5 個(gè) JDK 1.8 引入的新特性逻炊?
100)Java 中互亮,Maven 和 ANT 有什么區(qū)別犁享?
115道Java經(jīng)典面試題(面中率高、全)
Java是一個(gè)支持并發(fā)豹休、基于類和面向?qū)ο蟮挠?jì)算機(jī)編程語言炊昆。下面列出了面向?qū)ο筌浖_發(fā)的優(yōu)點(diǎn):
- 代碼開發(fā)模塊化,更易維護(hù)和修改威根。
- 代碼復(fù)用凤巨。
- 增強(qiáng)代碼的可靠性和靈活性。
- 增加代碼的可理解性洛搀。
面向?qū)ο缶幊逃泻芏嘀匾奶匦愿易拢热纾悍庋b,繼承留美,多態(tài)和抽象彰檬。下面的章節(jié)我們會(huì)逐個(gè)分析這些特性。
封裝
封裝給對(duì)象提供了隱藏內(nèi)部特性和行為的能力谎砾。對(duì)象提供一些能被其他對(duì)象訪問的方法來改變它內(nèi)部的數(shù)據(jù)逢倍。在Java當(dāng)中,有3種修飾符:public景图,private和protected较雕。每一種修飾符給其他的位于同一個(gè)包或者不同包下面對(duì)象賦予了不同的訪問權(quán)限。
下面列出了使用封裝的一些好處:
- 通過隱藏對(duì)象的屬性來保護(hù)對(duì)象內(nèi)部的狀態(tài)挚币。
- 提高了代碼的可用性和可維護(hù)性,因?yàn)閷?duì)象的行為可以被單獨(dú)的改變或者是擴(kuò)展。
- 禁止對(duì)象之間的不良交互提高模塊化婿脸。
參考這個(gè)文檔獲取更多關(guān)于封裝的細(xì)節(jié)和示例寒矿。
多態(tài)
多態(tài)是編程語言給不同的底層數(shù)據(jù)類型做相同的接口展示的一種能力。一個(gè)多態(tài)類型上的操作可以應(yīng)用到其他類型的值上面喇闸。
繼承
繼承給對(duì)象提供了從基類獲取字段和方法的能力。繼承提供了代碼的重用行,也可以在不修改類的情況下給現(xiàn)存的類添加新特性远舅。
抽象
抽象是把想法從具體的實(shí)例中分離出來的步驟,因此痕钢,要根據(jù)他們的功能而不是實(shí)現(xiàn)細(xì)節(jié)來創(chuàng)建類图柏。Java支持創(chuàng)建只暴漏接口而不包含方法實(shí)現(xiàn)的抽象的類。這種抽象技術(shù)的主要目的是把類的行為和實(shí)現(xiàn)細(xì)節(jié)分離開任连。
抽象和封裝的不同點(diǎn)
抽象和封裝是互補(bǔ)的概念蚤吹。一方面,抽象關(guān)注對(duì)象的行為随抠。另一方面裁着,封裝關(guān)注對(duì)象行為的細(xì)節(jié)。一般是通過隱藏對(duì)象內(nèi)部狀態(tài)信息做到封裝拱她,因此二驰,封裝可以看成是用來提供抽象的一種策略。
常見的Java問題
1.什么是Java虛擬機(jī)秉沼?為什么Java被稱作是“平臺(tái)無關(guān)的編程語言”桶雀?
Java虛擬機(jī)是一個(gè)可以執(zhí)行Java字節(jié)碼的虛擬機(jī)進(jìn)程。Java源文件被編譯成能被Java虛擬機(jī)執(zhí)行的字節(jié)碼文件唬复。
Java被設(shè)計(jì)成允許應(yīng)用程序可以運(yùn)行在任意的平臺(tái)矗积,而不需要程序員為每一個(gè)平臺(tái)單獨(dú)重寫或者是重新編譯。Java虛擬機(jī)讓這個(gè)變?yōu)榭赡艹ㄟ郑驗(yàn)樗赖讓佑布脚_(tái)的指令長(zhǎng)度和其他特性棘捣。
2.JDK和JRE的區(qū)別是什么?
Java運(yùn)行時(shí)環(huán)境(JRE)是將要執(zhí)行Java程序的Java虛擬機(jī)休建。它同時(shí)也包含了執(zhí)行applet需要的瀏覽器插件乍恐。Java開發(fā)工具包(JDK)是完整的Java軟件開發(fā)包,包含了JRE丰包,編譯器和其他的工具(比如:JavaDoc禁熏,Java調(diào)試器),可以讓開發(fā)者開發(fā)邑彪、編譯瞧毙、執(zhí)行Java應(yīng)用程序。
3.”static”關(guān)鍵字是什么意思?Java中是否可以覆蓋(override)一個(gè)private或者是static的方法宙彪?
“static”關(guān)鍵字表明一個(gè)成員變量或者是成員方法可以在沒有所屬的類的實(shí)例變量的情況下被訪問矩动。
Java中static方法不能被覆蓋,因?yàn)榉椒ǜ采w是基于運(yùn)行時(shí)動(dòng)態(tài)綁定的释漆,而static方法是編譯時(shí)靜態(tài)綁定的悲没。static方法跟類的任何實(shí)例都不相關(guān),所以概念上不適用男图。
4.是否可以在static環(huán)境中訪問非static變量示姿?
static變量在Java中是屬于類的,它在所有的實(shí)例中的值是一樣的逊笆。當(dāng)類被Java虛擬機(jī)載入的時(shí)候栈戳,會(huì)對(duì)static變量進(jìn)行初始化。如果你的代碼嘗試不用實(shí)例來訪問非static的變量难裆,編譯器會(huì)報(bào)錯(cuò)子檀,因?yàn)檫@些變量還沒有被創(chuàng)建出來,還沒有跟任何實(shí)例關(guān)聯(lián)上乃戈。
5.Java支持的數(shù)據(jù)類型有哪些褂痰?什么是自動(dòng)拆裝箱?
Java語言支持的8中基本數(shù)據(jù)類型是:
- byte
- short
- int
- long
- float
- double
- boolean
- char
自動(dòng)裝箱是Java編譯器在基本數(shù)據(jù)類型和對(duì)應(yīng)的對(duì)象包裝類型之間做的一個(gè)轉(zhuǎn)化症虑。比如:把int轉(zhuǎn)化成Integer缩歪,double轉(zhuǎn)化成double,等等侦讨。反之就是自動(dòng)拆箱驶冒。
6.Java中的方法覆蓋(Overriding)和方法重載(Overloading)是什么意思苟翻?
Java中的方法重載發(fā)生在同一個(gè)類里面兩個(gè)或者是多個(gè)方法的方法名相同但是參數(shù)不同的情況韵卤。與此相對(duì),方法覆蓋是說子類重新定義了父類的方法崇猫。方法覆蓋必須有相同的方法名沈条,參數(shù)列表和返回類型。覆蓋者可能不會(huì)限制它所覆蓋的方法的訪問诅炉。
7.Java中蜡歹,什么是構(gòu)造函數(shù)?什么是構(gòu)造函數(shù)重載涕烧?什么是復(fù)制構(gòu)造函數(shù)月而?
當(dāng)新對(duì)象被創(chuàng)建的時(shí)候,構(gòu)造函數(shù)會(huì)被調(diào)用议纯。每一個(gè)類都有構(gòu)造函數(shù)父款。在程序員沒有給類提供構(gòu)造函數(shù)的情況下,Java編譯器會(huì)為這個(gè)類創(chuàng)建一個(gè)默認(rèn)的構(gòu)造函數(shù)。
Java中構(gòu)造函數(shù)重載和方法重載很相似憨攒∈郎保可以為一個(gè)類創(chuàng)建多個(gè)構(gòu)造函數(shù)。每一個(gè)構(gòu)造函數(shù)必須有它自己唯一的參數(shù)列表肝集。
Java不支持像C++中那樣的復(fù)制構(gòu)造函數(shù)瞻坝,這個(gè)不同點(diǎn)是因?yàn)槿绻悴蛔约簩憳?gòu)造函數(shù)的情況下,Java不會(huì)創(chuàng)建默認(rèn)的復(fù)制構(gòu)造函數(shù)杏瞻。
8.Java支持多繼承么所刀?
不支持,Java不支持多繼承捞挥。每個(gè)類都只能繼承一個(gè)類勉痴,但是可以實(shí)現(xiàn)多個(gè)接口。
9.接口和抽象類的區(qū)別是什么树肃?
Java提供和支持創(chuàng)建抽象類和接口蒸矛。它們的實(shí)現(xiàn)有共同點(diǎn),不同點(diǎn)在于:
- 接口中所有的方法隱含的都是抽象的胸嘴。而抽象類則可以同時(shí)包含抽象和非抽象的方法雏掠。
- 類可以實(shí)現(xiàn)很多個(gè)接口,但是只能繼承一個(gè)抽象類
- 類如果要實(shí)現(xiàn)一個(gè)接口劣像,它必須要實(shí)現(xiàn)接口聲明的所有方法乡话。但是,類可以不實(shí)現(xiàn)抽象類聲明的所有方法耳奕,當(dāng)然绑青,在這種情況下,類也必須得聲明成是抽象的屋群。
- 抽象類可以在不提供接口方法實(shí)現(xiàn)的情況下實(shí)現(xiàn)接口闸婴。
- Java接口中聲明的變量默認(rèn)都是final的。抽象類可以包含非final的變量芍躏。
- Java接口中的成員函數(shù)默認(rèn)是public的邪乍。抽象類的成員函數(shù)可以是private,protected或者是public对竣。
- 接口是絕對(duì)抽象的庇楞,不可以被實(shí)例化。抽象類也不可以被實(shí)例化否纬,但是吕晌,如果它包含main方法的話是可以被調(diào)用的。
也可以參考JDK8中抽象類和接口的區(qū)別
10.什么是值傳遞和引用傳遞临燃?
對(duì)象被值傳遞睛驳,意味著傳遞了對(duì)象的一個(gè)副本壁拉。因此,就算是改變了對(duì)象副本柏靶,也不會(huì)影響源對(duì)象的值弃理。
對(duì)象被引用傳遞,意味著傳遞的并不是實(shí)際的對(duì)象屎蜓,而是對(duì)象的引用痘昌。因此,外部對(duì)引用對(duì)象所做的改變會(huì)反映到所有的對(duì)象上炬转。
Java線程
11.進(jìn)程和線程的區(qū)別是什么辆苔?
進(jìn)程是執(zhí)行著的應(yīng)用程序,而線程是進(jìn)程內(nèi)部的一個(gè)執(zhí)行序列扼劈。一個(gè)進(jìn)程可以有多個(gè)線程驻啤。線程又叫做輕量級(jí)進(jìn)程。
12.創(chuàng)建線程有幾種不同的方式荐吵?你喜歡哪一種骑冗?為什么?
有三種方式可以用來創(chuàng)建線程:
- 繼承Thread類
- 實(shí)現(xiàn)Runnable接口
- 應(yīng)用程序可以使用Executor框架來創(chuàng)建線程池
實(shí)現(xiàn)Runnable接口這種方式更受歡迎先煎,因?yàn)檫@不需要繼承Thread類贼涩。在應(yīng)用設(shè)計(jì)中已經(jīng)繼承了別的對(duì)象的情況下,這需要多繼承(而Java不支持多繼承)薯蝎,只能實(shí)現(xiàn)接口遥倦。同時(shí),線程池也是非常高效的占锯,很容易實(shí)現(xiàn)和使用袒哥。
13.概括的解釋下線程的幾種可用狀態(tài)。
線程在執(zhí)行過程中消略,可以處于下面幾種狀態(tài):
- 就緒(Runnable):線程準(zhǔn)備運(yùn)行堡称,不一定立馬就能開始執(zhí)行。
- 運(yùn)行中(Running):進(jìn)程正在執(zhí)行線程的代碼疑俭。
- 等待中(Waiting):線程處于阻塞的狀態(tài)粮呢,等待外部的處理結(jié)束。
- 睡眠中(Sleeping):線程被強(qiáng)制睡眠钞艇。
- I/O阻塞(Blocked on I/O):等待I/O操作完成。
- 同步阻塞(Blocked on Synchronization):等待獲取鎖豪硅。
- 死亡(Dead):線程完成了執(zhí)行哩照。
14.同步方法和同步代碼塊的區(qū)別是什么?
在Java語言中懒浮,每一個(gè)對(duì)象有一把鎖飘弧。線程可以使用synchronized關(guān)鍵字來獲取對(duì)象上的鎖识藤。synchronized關(guān)鍵字可應(yīng)用在方法級(jí)別(粗粒度鎖)或者是代碼塊級(jí)別(細(xì)粒度鎖)。
15.在監(jiān)視器(Monitor)內(nèi)部次伶,是如何做線程同步的痴昧?程序應(yīng)該做哪種級(jí)別的同步?
監(jiān)視器和鎖在Java虛擬機(jī)中是一塊使用的冠王。監(jiān)視器監(jiān)視一塊同步代碼塊赶撰,確保一次只有一個(gè)線程執(zhí)行同步代碼塊。每一個(gè)監(jiān)視器都和一個(gè)對(duì)象引用相關(guān)聯(lián)柱彻。線程在獲取鎖之前不允許執(zhí)行同步代碼豪娜。
16.什么是死鎖(deadlock)?
兩個(gè)進(jìn)程都在等待對(duì)方執(zhí)行完畢才能繼續(xù)往下執(zhí)行的時(shí)候就發(fā)生了死鎖哟楷。結(jié)果就是兩個(gè)進(jìn)程都陷入了無限的等待中瘤载。
17.如何確保N個(gè)線程可以訪問N個(gè)資源同時(shí)又不導(dǎo)致死鎖?
使用多線程的時(shí)候卖擅,一種非常簡(jiǎn)單的避免死鎖的方式就是:指定獲取鎖的順序鸣奔,并強(qiáng)制線程按照指定的順序獲取鎖。因此惩阶,如果所有的線程都是以同樣的順序加鎖和釋放鎖溃蔫,就不會(huì)出現(xiàn)死鎖了。
Java集合類
18.Java集合類框架的基本接口有哪些琳猫?
集合類接口指定了一組叫做元素的對(duì)象伟叛。集合類接口的每一種具體的實(shí)現(xiàn)類都可以選擇以它自己的方式對(duì)元素進(jìn)行保存和排序。有的集合類允許重復(fù)的鍵脐嫂,有些不允許统刮。
Java集合類提供了一套設(shè)計(jì)良好的支持對(duì)一組對(duì)象進(jìn)行操作的接口和類。Java集合類里面最基本的接口有:
- Collection:代表一組對(duì)象账千,每一個(gè)對(duì)象都是它的子元素侥蒙。
- Set:不包含重復(fù)元素的Collection。
- List:有順序的collection匀奏,并且可以包含重復(fù)元素鞭衩。
- Map:可以把鍵(key)映射到值(value)的對(duì)象,鍵不能重復(fù)娃善。
19.為什么集合類沒有實(shí)現(xiàn)Cloneable和Serializable接口论衍?
克隆(cloning)或者是序列化(serialization)的語義和含義是跟具體的實(shí)現(xiàn)相關(guān)的。因此聚磺,應(yīng)該由集合類的具體實(shí)現(xiàn)來決定如何被克隆或者是序列化坯台。
20.什么是迭代器(Iterator)?
Iterator接口提供了很多對(duì)集合元素進(jìn)行迭代的方法瘫寝。每一個(gè)集合類都包含了可以返回迭代器實(shí)例的
迭代方法蜒蕾。迭代器可以在迭代的過程中刪除底層集合的元素稠炬。
21.Iterator和ListIterator的區(qū)別是什么?
下面列出了他們的區(qū)別:
- Iterator可用來遍歷Set和List集合咪啡,但是ListIterator只能用來遍歷List首启。
- Iterator對(duì)集合只能是前向遍歷,ListIterator既可以前向也可以后向撤摸。
- ListIterator實(shí)現(xiàn)了Iterator接口毅桃,并包含其他的功能,比如:增加元素愁溜,替換元素疾嗅,獲取前一個(gè)和后一個(gè)元素的索引,等等冕象。
22.快速失敗(fail-fast)和安全失敗(fail-safe)的區(qū)別是什么代承?
Iterator的安全失敗是基于對(duì)底層集合做拷貝,因此渐扮,它不受源集合上修改的影響论悴。java.util包下面的所有的集合類都是快速失敗的,而java.util.concurrent包下面的所有的類都是安全失敗的墓律“蚬溃快速失敗的迭代器會(huì)拋出
ConcurrentModificationException異常,而安全失敗的迭代器永遠(yuǎn)不會(huì)拋出這樣的異常耻讽。
23.Java中的HashMap的工作原理是什么察纯?
Java中的HashMap是以鍵值對(duì)(key-value)的形式存儲(chǔ)元素的。HashMap需要一個(gè)hash函數(shù)针肥,它使用hashCode()和equals()方法來向集合/從集合添加和檢索元素饼记。當(dāng)調(diào)用put()方法的時(shí)候,HashMap會(huì)計(jì)算key的hash值慰枕,然后把鍵值對(duì)存儲(chǔ)在集合中合適的索引上具则。如果key已經(jīng)存在了,value會(huì)被更新成新值具帮。
HashMap的一些重要的特性是它的容量(capacity)博肋,負(fù)載因子(load factor)和擴(kuò)容極限(threshold resizing)。
24.hashCode()和equals()方法的重要性體現(xiàn)在什么地方蜂厅?
Java中的HashMap使用hashCode()和equals()方法來確定鍵值對(duì)的索引匪凡,當(dāng)根據(jù)鍵獲取值的時(shí)候也會(huì)用到這兩個(gè)方法。如果沒有正確的實(shí)現(xiàn)這兩個(gè)方法葛峻,兩個(gè)不同的鍵可能會(huì)有相同的hash值锹雏,因此,可能會(huì)被集合認(rèn)為是相等的术奖。而且礁遵,這兩個(gè)方法也用來發(fā)現(xiàn)重復(fù)元素。所以這兩個(gè)方法的實(shí)現(xiàn)對(duì)HashMap的精確性和正確性是至關(guān)重要的采记。
25.HashMap和Hashtable有什么區(qū)別?
HashMap和Hashtable都實(shí)現(xiàn)了Map接口,因此很多特性非常相似鸽疾。但是蔚润,他們有以下不同點(diǎn):
- HashMap允許鍵和值是null,而Hashtable不允許鍵或者值是null既棺。
- Hashtable是同步的讽挟,而HashMap不是。因此丸冕,HashMap更適合于單線程環(huán)境耽梅,而Hashtable適合于多線程環(huán)境。
- HashMap提供了可供應(yīng)用迭代的鍵的集合胖烛,因此眼姐,HashMap是快速失敗的。另一方面佩番,Hashtable提供了對(duì)鍵的列舉(Enumeration)众旗。
- 一般認(rèn)為Hashtable是一個(gè)遺留的類。
26.數(shù)組(Array)和列表(ArrayList)有什么區(qū)別趟畏?什么時(shí)候應(yīng)該使用Array而不是ArrayList贡歧?
下面列出了Array和ArrayList的不同點(diǎn):
- Array可以包含基本類型和對(duì)象類型,ArrayList只能包含對(duì)象類型赋秀。
- Array大小是固定的利朵,ArrayList的大小是動(dòng)態(tài)變化的。
- ArrayList提供了更多的方法和特性沃琅,比如:addAll()哗咆,removeAll(),iterator()等等益眉。
- 對(duì)于基本類型數(shù)據(jù)晌柬,集合使用自動(dòng)裝箱來減少編碼工作量。但是郭脂,當(dāng)處理固定大小的基本數(shù)據(jù)類型的時(shí)候年碘,這種方式相對(duì)比較慢。
27.ArrayList和LinkedList有什么區(qū)別展鸡?
ArrayList和LinkedList都實(shí)現(xiàn)了List接口屿衅,他們有以下的不同點(diǎn):
ArrayList是基于索引的數(shù)據(jù)接口,它的底層是數(shù)組莹弊。它可以以O(shè)(1)時(shí)間復(fù)雜度對(duì)元素進(jìn)行隨機(jī)訪問涤久。與此對(duì)應(yīng)涡尘,LinkedList是以元素列表的形式存儲(chǔ)它的數(shù)據(jù),每一個(gè)元素都和它的前一個(gè)和后一個(gè)元素鏈接在一起响迂,在這種情況下考抄,查找某個(gè)元素的時(shí)間復(fù)雜度是O(n)。
相對(duì)于ArrayList蔗彤,LinkedList的插入川梅,添加,刪除操作速度更快然遏,因?yàn)楫?dāng)元素被添加到集合任意位置的時(shí)候贫途,不需要像數(shù)組那樣重新計(jì)算大小或者是更新索引。
LinkedList比ArrayList更占內(nèi)存待侵,因?yàn)長(zhǎng)inkedList為每一個(gè)節(jié)點(diǎn)存儲(chǔ)了兩個(gè)引用丢早,一個(gè)指向前一個(gè)元素,一個(gè)指向下一個(gè)元素诫给。
也可以參考ArrayList vs. LinkedList香拉。
28.Comparable和Comparator接口是干什么的?列出它們的區(qū)別中狂。
Java提供了只包含一個(gè)compareTo()方法的Comparable接口凫碌。這個(gè)方法可以個(gè)給兩個(gè)對(duì)象排序。具體來說胃榕,它返回負(fù)數(shù)盛险,0,正數(shù)來表明輸入對(duì)象小于勋又,等于苦掘,大于已經(jīng)存在的對(duì)象。
Java提供了包含compare()和equals()兩個(gè)方法的Comparator接口楔壤。compare()方法用來給兩個(gè)輸入?yún)?shù)排序鹤啡,返回負(fù)數(shù),0蹲嚣,正數(shù)表明第一個(gè)參數(shù)是小于递瑰,等于,大于第二個(gè)參數(shù)隙畜。equals()方法需要一個(gè)對(duì)象作為參數(shù)抖部,它用來決定輸入?yún)?shù)是否和comparator相等。只有當(dāng)輸入?yún)?shù)也是一個(gè)comparator并且輸入?yún)?shù)和當(dāng)前comparator的排序結(jié)果是相同的時(shí)候议惰,這個(gè)方法才返回true慎颗。
29.什么是Java優(yōu)先級(jí)隊(duì)列(Priority Queue)?
PriorityQueue是一個(gè)基于優(yōu)先級(jí)堆的無界隊(duì)列,它的元素是按照自然順序(natural order)排序的俯萎。在創(chuàng)建的時(shí)候傲宜,我們可以給它提供一個(gè)負(fù)責(zé)給元素排序的比較器。PriorityQueue不允許null值讯屈,因?yàn)樗麄儧]有自然順序蛋哭,或者說他們沒有任何的相關(guān)聯(lián)的比較器县习。最后涮母,PriorityQueue不是線程安全的,入隊(duì)和出隊(duì)的時(shí)間復(fù)雜度是O(log(n))躁愿。
30.你了解大O符號(hào)(big-O notation)么叛本?你能給出不同數(shù)據(jù)結(jié)構(gòu)的例子么?
大O符號(hào)描述了當(dāng)數(shù)據(jù)結(jié)構(gòu)里面的元素增加的時(shí)候彤钟,算法的規(guī)睦春颍或者是性能在最壞的場(chǎng)景下有多么好。
大O符號(hào)也可用來描述其他的行為逸雹,比如:內(nèi)存消耗营搅。因?yàn)榧项悓?shí)際上是數(shù)據(jù)結(jié)構(gòu),我們一般使用大O符號(hào)基于時(shí)間梆砸,內(nèi)存和性能來選擇最好的實(shí)現(xiàn)转质。大O符號(hào)可以對(duì)大量數(shù)據(jù)的性能給出一個(gè)很好的說明。
31.如何權(quán)衡是使用無序的數(shù)組還是有序的數(shù)組帖世?
有序數(shù)組最大的好處在于查找的時(shí)間復(fù)雜度是O(log n)休蟹,而無序數(shù)組是O(n)。有序數(shù)組的缺點(diǎn)是插入操作的時(shí)間復(fù)雜度是O(n)日矫,因?yàn)橹荡蟮脑匦枰笠苿?dòng)來給新元素騰位置赂弓。相反,無序數(shù)組的插入時(shí)間復(fù)雜度是常量O(1)哪轿。
32.Java集合類框架的最佳實(shí)踐有哪些盈魁?
根據(jù)應(yīng)用的需要正確選擇要使用的集合的類型對(duì)性能非常重要,比如:假如元素的大小是固定的窃诉,而且能事先知道杨耙,我們就應(yīng)該用Array而不是ArrayList。
有些集合類允許指定初始容量褐奴。因此按脚,如果我們能估計(jì)出存儲(chǔ)的元素的數(shù)目,我們可以設(shè)置初始容量來避免重新計(jì)算hash值或者是擴(kuò)容敦冬。
為了類型安全辅搬,可讀性和健壯性的原因總是要使用泛型。同時(shí),使用泛型還可以避免運(yùn)行時(shí)的ClassCastException堪遂。
使用JDK提供的不變類(immutable class)作為Map的鍵可以避免為我們自己的類實(shí)現(xiàn)hashCode()和equals()方法介蛉。
編程的時(shí)候接口優(yōu)于實(shí)現(xiàn)。
底層的集合實(shí)際上是空的情況下溶褪,返回長(zhǎng)度是0的集合或者是數(shù)組币旧,不要返回null。
33.Enumeration接口和Iterator接口的區(qū)別有哪些猿妈?
Enumeration速度是Iterator的2倍吹菱,同時(shí)占用更少的內(nèi)存。但是彭则,Iterator遠(yuǎn)遠(yuǎn)比Enumeration安全鳍刷,因?yàn)槠渌€程不能夠修改正在被iterator遍歷的集合里面的對(duì)象。同時(shí)俯抖,Iterator允許調(diào)用者刪除底層集合里面的元素输瓜,這對(duì)Enumeration來說是不可能的。
34.HashSet和TreeSet有什么區(qū)別芬萍?
HashSet是由一個(gè)hash表來實(shí)現(xiàn)的尤揣,因此,它的元素是無序的柬祠。add()北戏,remove(),contains()方法的時(shí)間復(fù)雜度是O(1)瓶盛。
另一方面最欠,TreeSet是由一個(gè)樹形的結(jié)構(gòu)來實(shí)現(xiàn)的,它里面的元素是有序的惩猫。因此芝硬,add(),remove()轧房,contains()方法的時(shí)間復(fù)雜度是O(logn)拌阴。
垃圾收集器(Garbage Collectors)
35.Java中垃圾回收有什么目的?什么時(shí)候進(jìn)行垃圾回收奶镶?
垃圾回收的目的是識(shí)別并且丟棄應(yīng)用不再使用的對(duì)象來釋放和重用資源迟赃。
36.System.gc()和Runtime.gc()會(huì)做什么事情?
這兩個(gè)方法用來提示JVM要進(jìn)行垃圾回收厂镇。但是纤壁,立即開始還是延遲進(jìn)行垃圾回收是取決于JVM的。
37.finalize()方法什么時(shí)候被調(diào)用捺信?析構(gòu)函數(shù)(finalization)的目的是什么酌媒?
在釋放對(duì)象占用的內(nèi)存之前,垃圾收集器會(huì)調(diào)用對(duì)象的finalize()方法。一般建議在該方法中釋放對(duì)象持有的資源秒咨。
38.如果對(duì)象的引用被置為null喇辽,垃圾收集器是否會(huì)立即釋放對(duì)象占用的內(nèi)存?
不會(huì)雨席,在下一個(gè)垃圾回收周期中菩咨,這個(gè)對(duì)象將是可被回收的。
39.Java堆的結(jié)構(gòu)是什么樣子的陡厘?什么是堆中的永久代(Perm Gen space)?
JVM的堆是運(yùn)行時(shí)數(shù)據(jù)區(qū)抽米,所有類的實(shí)例和數(shù)組都是在堆上分配內(nèi)存。它在JVM啟動(dòng)的時(shí)候被創(chuàng)建雏亚。對(duì)象所占的堆內(nèi)存是由自動(dòng)內(nèi)存管理系統(tǒng)也就是垃圾收集器回收缨硝。
堆內(nèi)存是由存活和死亡的對(duì)象組成的。存活的對(duì)象是應(yīng)用可以訪問的罢低,不會(huì)被垃圾回收。死亡的對(duì)象是應(yīng)用不可訪問尚且還沒有被垃圾收集器回收掉的對(duì)象胖笛。一直到垃圾收集器把這些對(duì)象回收掉之前网持,他們會(huì)一直占據(jù)堆內(nèi)存空間。
40.串行(serial)收集器和吞吐量(throughput)收集器的區(qū)別是什么长踊?
吞吐量收集器使用并行版本的新生代垃圾收集器功舀,它用于中等規(guī)模和大規(guī)模數(shù)據(jù)的應(yīng)用程序。而串行收集器對(duì)大多數(shù)的小應(yīng)用(在現(xiàn)代處理器上需要大概100M左右的內(nèi)存)就足夠了身弊。
41.在Java中辟汰,對(duì)象什么時(shí)候可以被垃圾回收?
當(dāng)對(duì)象對(duì)當(dāng)前使用這個(gè)對(duì)象的應(yīng)用程序變得不可觸及的時(shí)候阱佛,這個(gè)對(duì)象就可以被回收了帖汞。
42.JVM的永久代中會(huì)發(fā)生垃圾回收么?
垃圾回收不會(huì)發(fā)生在永久代凑术,如果永久代滿了或者是超過了臨界值翩蘸,會(huì)觸發(fā)完全垃圾回收(Full GC)。如果你仔細(xì)查看垃圾收集器的輸出信息淮逊,就會(huì)發(fā)現(xiàn)永久代也是被回收的催首。這就是為什么正確的永久代大小對(duì)避免Full GC是非常重要的原因。請(qǐng)參考下Java8:從永久代到元數(shù)據(jù)區(qū)
(譯者注:Java8中已經(jīng)移除了永久代泄鹏,新加了一個(gè)叫做元數(shù)據(jù)區(qū)的native內(nèi)存區(qū))
異常處理
43.Java中的兩種異常類型是什么郎任?他們有什么區(qū)別?
Java中有兩種異常:受檢查的(checked)異常和不受檢查的(unchecked)異常备籽。不受檢查的異常不需要在方法或者是構(gòu)造函數(shù)上聲明舶治,就算方法或者是構(gòu)造函數(shù)的執(zhí)行可能會(huì)拋出這樣的異常,并且不受檢查的異常可以傳播到方法或者是構(gòu)造函數(shù)的外面歼疮。相反杂抽,受檢查的異常必須要用throws語句在方法或者是構(gòu)造函數(shù)上聲明。這里有Java異常處理的一些小建議韩脏。
44.Java中Exception和Error有什么區(qū)別缩麸?
Exception和Error都是Throwable的子類。Exception用于用戶程序可以捕獲的異常情況赡矢。Error定義了不期望被用戶程序捕獲的異常杭朱。
45.throw和throws有什么區(qū)別?
throw關(guān)鍵字用來在程序中明確的拋出異常吹散,相反弧械,throws語句用來表明方法不能處理的異常。每一個(gè)方法都必須要指定哪些異常不能處理空民,所以方法的調(diào)用者才能夠確保處理可能發(fā)生的異常刃唐,多個(gè)異常是用逗號(hào)分隔的。
45.異常處理的時(shí)候界轩,finally代碼塊的重要性是什么画饥?(譯者注:作者標(biāo)題的序號(hào)弄錯(cuò)了)
無論是否拋出異常,finally代碼塊總是會(huì)被執(zhí)行浊猾。就算是沒有catch語句同時(shí)又拋出異常的情況下抖甘,finally代碼塊仍然會(huì)被執(zhí)行。最后要說的是葫慎,finally代碼塊主要用來釋放資源衔彻,比如:I/O緩沖區(qū),數(shù)據(jù)庫連接偷办。
46.異常處理完成以后艰额,Exception對(duì)象會(huì)發(fā)生什么變化?
Exception對(duì)象會(huì)在下一個(gè)垃圾回收過程中被回收掉爽篷。
47.finally代碼塊和finalize()方法有什么區(qū)別悴晰?
無論是否拋出異常,finally代碼塊都會(huì)執(zhí)行逐工,它主要是用來釋放應(yīng)用占用的資源铡溪。finalize()方法是Object類的一個(gè)protected方法,它是在對(duì)象被垃圾回收之前由Java虛擬機(jī)來調(diào)用的泪喊。
Java小應(yīng)用程序(Applet)
48.什么是Applet棕硫?
java applet是能夠被包含在HTML頁面中并且能被啟用了java的客戶端瀏覽器執(zhí)行的程序。Applet主要用來創(chuàng)建動(dòng)態(tài)交互的web應(yīng)用程序袒啼。
49.解釋一下Applet的生命周期
applet可以經(jīng)歷下面的狀態(tài):
- Init:每次被載入的時(shí)候都會(huì)被初始化哈扮。
- Start:開始執(zhí)行applet纬纪。
- Stop:結(jié)束執(zhí)行applet。
- Destroy:卸載applet之前滑肉,做最后的清理工作包各。
50.當(dāng)applet被載入的時(shí)候會(huì)發(fā)生什么?
首先靶庙,創(chuàng)建applet控制類的實(shí)例问畅,然后初始化applet,最后開始運(yùn)行六荒。
51.Applet和普通的Java應(yīng)用程序有什么區(qū)別护姆?
applet是運(yùn)行在啟用了java的瀏覽器中,Java應(yīng)用程序是可以在瀏覽器之外運(yùn)行的獨(dú)立的Java程序掏击。但是卵皂,它們都需要有Java虛擬機(jī)。
進(jìn)一步來說砚亭,Java應(yīng)用程序需要一個(gè)有特定方法簽名的main函數(shù)來開始執(zhí)行灯变。Java applet不需要這樣的函數(shù)來開始執(zhí)行。
最后钠惩,Java applet一般會(huì)使用很嚴(yán)格的安全策略柒凉,Java應(yīng)用一般使用比較寬松的安全策略著隆。
52.Java applet有哪些限制條件隐砸?
主要是由于安全的原因鸣哀,給applet施加了以下的限制:
- applet不能夠載入類庫或者定義本地方法。
- applet不能在宿主機(jī)上讀寫文件愧沟。
- applet不能讀取特定的系統(tǒng)屬性。
- applet不能發(fā)起網(wǎng)絡(luò)連接鲤遥,除非是跟宿主機(jī)沐寺。
- applet不能夠開啟宿主機(jī)上其他任何的程序。
53.什么是不受信任的applet盖奈?
不受信任的applet是不能訪問或是執(zhí)行本地系統(tǒng)文件的Java applet混坞,默認(rèn)情況下,所有下載的applet都是不受信任的钢坦。
54.從網(wǎng)絡(luò)上加載的applet和從本地文件系統(tǒng)加載的applet有什么區(qū)別究孕?
當(dāng)applet是從網(wǎng)絡(luò)上加載的時(shí)候,applet是由applet類加載器載入的爹凹,它受applet安全管理器的限制厨诸。
當(dāng)applet是從客戶端的本地磁盤載入的時(shí)候,applet是由文件系統(tǒng)加載器載入的禾酱。
從文件系統(tǒng)載入的applet允許在客戶端讀文件微酬,寫文件绘趋,加載類庫,并且也允許執(zhí)行其他程序颗管,但是陷遮,卻通不過字節(jié)碼校驗(yàn)。
55.applet類加載器是什么垦江?它會(huì)做哪些工作帽馋?
當(dāng)applet是從網(wǎng)絡(luò)上加載的時(shí)候,它是由applet類加載器載入的疫粥。類加載器有自己的java名稱空間等級(jí)結(jié)構(gòu)茬斧。類加載器會(huì)保證來自文件系統(tǒng)的類有唯一的名稱空間,來自網(wǎng)絡(luò)資源的類有唯一的名稱空間梗逮。
當(dāng)瀏覽器通過網(wǎng)絡(luò)載入applet的時(shí)候项秉,applet的類被放置于和applet的源相關(guān)聯(lián)的私有的名稱空間中。然后慷彤,那些被類加載器載入進(jìn)來的類都是通過了驗(yàn)證器驗(yàn)證的娄蔼。驗(yàn)證器會(huì)檢查類文件格式是否遵守Java語言規(guī)范,確保不會(huì)出現(xiàn)堆棧溢出(stack overflow)或者下溢(underflow)底哗,傳遞給字節(jié)碼指令的參數(shù)是正確的岁诉。
56.applet安全管理器是什么?它會(huì)做哪些工作跋选?
applet安全管理器是給applet施加限制條件的一種機(jī)制涕癣。瀏覽器可以只有一個(gè)安全管理器。安全管理器在啟動(dòng)的時(shí)候被創(chuàng)建前标,之后不能被替換覆蓋或者是擴(kuò)展坠韩。
Swing
57.彈出式選擇菜單(Choice)和列表(List)有什么區(qū)別
Choice是以一種緊湊的形式展示的,需要下拉才能看到所有的選項(xiàng)炼列。Choice中一次只能選中一個(gè)選項(xiàng)只搁。List同時(shí)可以有多個(gè)元素可見,支持選中一個(gè)或者多個(gè)元素俭尖。
58.什么是布局管理器氢惋?
布局管理器用來在容器中組織組件。
59.滾動(dòng)條(Scrollbar)和滾動(dòng)面板(JScrollPane)有什么區(qū)別稽犁?
Scrollbar是一個(gè)組件焰望,不是容器。而ScrollPane是容器缭付。ScrollPane自己處理滾動(dòng)事件柿估。
60.哪些Swing的方法是線程安全的?
只有3個(gè)線程安全的方法:repaint(), revalidate(), and invalidate()陷猫。
61.說出三種支持重繪(painting)的組件秫舌。
Canvas, Frame, Panel,和Applet支持重繪的妖。
62.什么是裁剪(clipping)?
限制在一個(gè)給定的區(qū)域或者形狀的繪圖操作就做裁剪足陨。
63.MenuItem和CheckboxMenuItem的區(qū)別是什么嫂粟?
CheckboxMenuItem類繼承自MenuItem類,支持菜單選項(xiàng)可以選中或者不選中墨缘。
64.邊緣布局(BorderLayout)里面的元素是如何布局的星虹?
BorderLayout里面的元素是按照容器的東西南北中進(jìn)行布局的。
65.網(wǎng)格包布局(GridBagLayout)里面的元素是如何布局的镊讼?
GridBagLayout里面的元素是按照網(wǎng)格進(jìn)行布局的宽涌。不同大小的元素可能會(huì)占據(jù)網(wǎng)格的多于1行或一列。因此蝶棋,行數(shù)和列數(shù)可以有不同的大小卸亮。
66.Window和Frame有什么區(qū)別?
Frame類繼承了Window類玩裙,它定義了一個(gè)可以有菜單欄的主應(yīng)用窗口兼贸。
67.裁剪(clipping)和重繪(repainting)有什么聯(lián)系?
當(dāng)窗口被AWT重繪線程進(jìn)行重繪的時(shí)候吃溅,它會(huì)把裁剪區(qū)域設(shè)置成需要重繪的窗口的區(qū)域溶诞。
68.事件監(jiān)聽器接口(event-listener interface)和事件適配器(event-adapter)有什么關(guān)系?
事件監(jiān)聽器接口定義了對(duì)特定的事件决侈,事件處理器必須要實(shí)現(xiàn)的方法螺垢。事件適配器給事件監(jiān)聽器接口提供了默認(rèn)的實(shí)現(xiàn)。
69.GUI組件如何來處理它自己的事件赖歌?
GUI組件可以處理它自己的事件甩苛,只要它實(shí)現(xiàn)相對(duì)應(yīng)的事件監(jiān)聽器接口,并且把自己作為事件監(jiān)聽器俏站。
70.Java的布局管理器比傳統(tǒng)的窗口系統(tǒng)有哪些優(yōu)勢(shì)?
Java使用布局管理器以一種一致的方式在所有的窗口平臺(tái)上擺放組件痊土。因?yàn)椴季止芾砥鞑粫?huì)和組件的絕對(duì)大小和位置相綁定肄扎,所以他們能夠適應(yīng)跨窗口系統(tǒng)的特定平臺(tái)的不同。
71.Java的Swing組件使用了哪種設(shè)計(jì)模式赁酝?
Java中的Swing組件使用了MVC(視圖-模型-控制器)設(shè)計(jì)模式犯祠。
JDBC
72.什么是JDBC?
JDBC是允許用戶在不同數(shù)據(jù)庫之間做選擇的一個(gè)抽象層酌呆。JDBC允許開發(fā)者用JAVA寫數(shù)據(jù)庫應(yīng)用程序衡载,而不需要關(guān)心底層特定數(shù)據(jù)庫的細(xì)節(jié)。
73.解釋下驅(qū)動(dòng)(Driver)在JDBC中的角色隙袁。
JDBC驅(qū)動(dòng)提供了特定廠商對(duì)JDBC API接口類的實(shí)現(xiàn)痰娱,驅(qū)動(dòng)必須要提供java.sql包下面這些類的實(shí)現(xiàn):Connection, Statement, PreparedStatement,CallableStatement, ResultSet和Driver弃榨。
74.Class.forName()方法有什么作用?
這個(gè)方法用來載入跟數(shù)據(jù)庫建立連接的驅(qū)動(dòng)梨睁。
75.PreparedStatement比Statement有什么優(yōu)勢(shì)鲸睛?
PreparedStatements是預(yù)編譯的,因此坡贺,性能會(huì)更好官辈。同時(shí),不同的查詢參數(shù)值遍坟,PreparedStatement可以重用拳亿。
76.什么時(shí)候使用CallableStatement?用來準(zhǔn)備CallableStatement的方法是什么愿伴?
CallableStatement用來執(zhí)行存儲(chǔ)過程肺魁。存儲(chǔ)過程是由數(shù)據(jù)庫存儲(chǔ)和提供的。存儲(chǔ)過程可以接受輸入?yún)?shù)公般,也可以有返回結(jié)果万搔。非常鼓勵(lì)使用存儲(chǔ)過程,因?yàn)樗峁┝税踩院湍K化官帘。準(zhǔn)備一個(gè)CallableStatement的方法是:
1CallableStament.prepareCall();
77.數(shù)據(jù)庫連接池是什么意思瞬雹?
像打開關(guān)閉數(shù)據(jù)庫連接這種和數(shù)據(jù)庫的交互可能是很費(fèi)時(shí)的,尤其是當(dāng)客戶端數(shù)量增加的時(shí)候刽虹,會(huì)消耗大量的資源酗捌,成本是非常高的∮空埽可以在應(yīng)用服務(wù)器啟動(dòng)的時(shí)候建立很多個(gè)數(shù)據(jù)庫連接并維護(hù)在一個(gè)池中胖缤。連接請(qǐng)求由池中的連接提供。在連接使用完畢以后阀圾,把連接歸還到池中哪廓,以用于滿足將來更多的請(qǐng)求。
遠(yuǎn)程方法調(diào)用(RMI)
78.什么是RMI初烘?
Java遠(yuǎn)程方法調(diào)用(Java RMI)是Java API對(duì)遠(yuǎn)程過程調(diào)用(RPC)提供的面向?qū)ο蟮牡葍r(jià)形式涡真,支持直接傳輸序列化的Java對(duì)象和分布式垃圾回收。遠(yuǎn)程方法調(diào)用可以看做是激活遠(yuǎn)程正在運(yùn)行的對(duì)象上的方法的步驟肾筐。RMI對(duì)調(diào)用者是位置透明的哆料,因?yàn)檎{(diào)用者感覺方法是執(zhí)行在本地運(yùn)行的對(duì)象上的÷痤恚看下RMI的一些注意事項(xiàng)东亦。
79.RMI體系結(jié)構(gòu)的基本原則是什么?
RMI體系結(jié)構(gòu)是基于一個(gè)非常重要的行為定義和行為實(shí)現(xiàn)相分離的原則唬渗。RMI允許定義行為的代碼和實(shí)現(xiàn)行為的代碼相分離典阵,并且運(yùn)行在不同的JVM上奋渔。
80.RMI體系結(jié)構(gòu)分哪幾層?
RMI體系結(jié)構(gòu)分以下幾層:
存根和骨架層(Stub and Skeleton layer):這一層對(duì)程序員是透明的萄喳,它主要負(fù)責(zé)攔截客戶端發(fā)出的方法調(diào)用請(qǐng)求卒稳,然后把請(qǐng)求重定向給遠(yuǎn)程的RMI服務(wù)。
遠(yuǎn)程引用層(Remote Reference Layer):RMI體系結(jié)構(gòu)的第二層用來解析客戶端對(duì)服務(wù)端遠(yuǎn)程對(duì)象的引用他巨。這一層解析并管理客戶端對(duì)服務(wù)端遠(yuǎn)程對(duì)象的引用充坑。連接是點(diǎn)到點(diǎn)的。
傳輸層(Transport layer):這一層負(fù)責(zé)連接參與服務(wù)的兩個(gè)JVM染突。這一層是建立在網(wǎng)絡(luò)上機(jī)器間的TCP/IP連接之上的捻爷。它提供了基本的連接服務(wù),還有一些防火墻穿透策略份企。
81.RMI中的遠(yuǎn)程接口(Remote Interface)扮演了什么樣的角色也榄?
遠(yuǎn)程接口用來標(biāo)識(shí)哪些方法是可以被非本地虛擬機(jī)調(diào)用的接口。遠(yuǎn)程對(duì)象必須要直接或者是間接實(shí)現(xiàn)遠(yuǎn)程接口司志。實(shí)現(xiàn)了遠(yuǎn)程接口的類應(yīng)該聲明被實(shí)現(xiàn)的遠(yuǎn)程接口甜紫,給每一個(gè)遠(yuǎn)程對(duì)象定義構(gòu)造函數(shù),給所有遠(yuǎn)程接口的方法提供實(shí)現(xiàn)骂远。
82.java.rmi.Naming類扮演了什么樣的角色囚霸?
java.rmi.Naming類用來存儲(chǔ)和獲取在遠(yuǎn)程對(duì)象注冊(cè)表里面的遠(yuǎn)程對(duì)象的引用。Naming類的每一個(gè)方法接收一個(gè)URL格式的String對(duì)象作為它的參數(shù)激才。
83.RMI的綁定(Binding)是什么意思拓型?
綁定是為了查詢找遠(yuǎn)程對(duì)象而給遠(yuǎn)程對(duì)象關(guān)聯(lián)或者是注冊(cè)以后會(huì)用到的名稱的過程。遠(yuǎn)程對(duì)象可以使用Naming類的bind()或者rebind()方法跟名稱相關(guān)聯(lián)瘸恼。
84.Naming類的bind()和rebind()方法有什么區(qū)別劣挫?
bind()方法負(fù)責(zé)把指定名稱綁定給遠(yuǎn)程對(duì)象,rebind()方法負(fù)責(zé)把指定名稱重新綁定到一個(gè)新的遠(yuǎn)程對(duì)象东帅。如果那個(gè)名稱已經(jīng)綁定過了压固,先前的綁定會(huì)被替換掉。
85.讓RMI程序能正確運(yùn)行有哪些步驟靠闭?
為了讓RMI程序能正確運(yùn)行必須要包含以下幾個(gè)步驟:
- 編譯所有的源文件邓夕。
- 使用rmic生成stub。
- 啟動(dòng)rmiregistry阎毅。
- 啟動(dòng)RMI服務(wù)器。
- 運(yùn)行客戶端程序点弯。
86.RMI的stub扮演了什么樣的角色扇调?
遠(yuǎn)程對(duì)象的stub扮演了遠(yuǎn)程對(duì)象的代表或者代理的角色。調(diào)用者在本地stub上調(diào)用方法抢肛,它負(fù)責(zé)在遠(yuǎn)程對(duì)象上執(zhí)行方法狼钮。當(dāng)stub的方法被調(diào)用的時(shí)候碳柱,會(huì)經(jīng)歷以下幾個(gè)步驟:
- 初始化到包含了遠(yuǎn)程對(duì)象的JVM的連接。
- 序列化參數(shù)到遠(yuǎn)程的JVM熬芜。
- 等待方法調(diào)用和執(zhí)行的結(jié)果莲镣。
- 反序列化返回的值或者是方法沒有執(zhí)行成功情況下的異常。
- 把值返回給調(diào)用者涎拉。
87.什么是分布式垃圾回收(DGC)瑞侮?它是如何工作的?
DGC叫做分布式垃圾回收鼓拧。RMI使用DGC來做自動(dòng)垃圾回收半火。因?yàn)镽MI包含了跨虛擬機(jī)的遠(yuǎn)程對(duì)象的引用,垃圾回收是很困難的季俩。DGC使用引用計(jì)數(shù)算法來給遠(yuǎn)程對(duì)象提供自動(dòng)內(nèi)存管理钮糖。
88.RMI中使用RMI安全管理器(RMISecurityManager)的目的是什么?
RMISecurityManager使用下載好的代碼提供可被RMI應(yīng)用程序使用的安全管理器酌住。如果沒有設(shè)置安全管理器店归,RMI的類加載器就不會(huì)從遠(yuǎn)程下載任何的類。
89.解釋下Marshalling和demarshalling酪我。
當(dāng)應(yīng)用程序希望把內(nèi)存對(duì)象跨網(wǎng)絡(luò)傳遞到另一臺(tái)主機(jī)或者是持久化到存儲(chǔ)的時(shí)候消痛,就必須要把對(duì)象在內(nèi)存里面的表示轉(zhuǎn)化成合適的格式。這個(gè)過程就叫做Marshalling祭示,反之就是demarshalling肄满。
90.解釋下Serialization和Deserialization。
Java提供了一種叫做對(duì)象序列化的機(jī)制质涛,他把對(duì)象表示成一連串的字節(jié)稠歉,里面包含了對(duì)象的數(shù)據(jù),對(duì)象的類型信息汇陆,對(duì)象內(nèi)部的數(shù)據(jù)的類型信息等等怒炸。因此,序列化可以看成是為了把對(duì)象存儲(chǔ)在磁盤上或者是從磁盤上讀出來并重建對(duì)象而把對(duì)象扁平化的一種方式毡代。反序列化是把對(duì)象從扁平狀態(tài)轉(zhuǎn)化成活動(dòng)對(duì)象的相反的步驟阅羹。
Servlet
91.什么是Servlet?
Servlet是用來處理客戶端請(qǐng)求并產(chǎn)生動(dòng)態(tài)網(wǎng)頁內(nèi)容的Java類教寂。Servlet主要是用來處理或者是存儲(chǔ)HTML表單提交的數(shù)據(jù)捏鱼,產(chǎn)生動(dòng)態(tài)內(nèi)容,在無狀態(tài)的HTTP協(xié)議下管理狀態(tài)信息酪耕。
92.說一下Servlet的體系結(jié)構(gòu)导梆。
所有的Servlet都必須要實(shí)現(xiàn)的核心的接口是javax.servlet.Servlet。每一個(gè)Servlet都必須要直接或者是間接實(shí)現(xiàn)這個(gè)接口,或者是繼承javax.servlet.GenericServlet或者javax.servlet.http.HTTPServlet看尼。最后递鹉,Servlet使用多線程可以并行的為多個(gè)請(qǐng)求服務(wù)。
93.Applet和Servlet有什么區(qū)別藏斩?
Applet是運(yùn)行在客戶端主機(jī)的瀏覽器上的客戶端Java程序躏结。而Servlet是運(yùn)行在web服務(wù)器上的服務(wù)端的組件。applet可以使用用戶界面類狰域,而Servlet沒有用戶界面媳拴,相反,Servlet是等待客戶端的HTTP請(qǐng)求北专,然后為請(qǐng)求產(chǎn)生響應(yīng)禀挫。
94.GenericServlet和HttpServlet有什么區(qū)別?
GenericServlet是一個(gè)通用的協(xié)議無關(guān)的Servlet拓颓,它實(shí)現(xiàn)了Servlet和ServletConfig接口语婴。繼承自GenericServlet的Servlet應(yīng)該要覆蓋service()方法。最后驶睦,為了開發(fā)一個(gè)能用在網(wǎng)頁上服務(wù)于使用HTTP協(xié)議請(qǐng)求的Servlet砰左,你的Servlet必須要繼承自HttpServlet。這里有Servlet的例子场航。
95.解釋下Servlet的生命周期缠导。
對(duì)每一個(gè)客戶端的請(qǐng)求,Servlet引擎載入Servlet溉痢,調(diào)用它的init()方法僻造,完成Servlet的初始化。然后孩饼,Servlet對(duì)象通過為每一個(gè)請(qǐng)求單獨(dú)調(diào)用service()方法來處理所有隨后來自客戶端的請(qǐng)求髓削,最后,調(diào)用Servlet(譯者注:這里應(yīng)該是Servlet而不是server)的destroy()方法把Servlet刪除掉镀娶。
96.doGet()方法和doPost()方法有什么區(qū)別立膛?
doGet:GET方法會(huì)把名值對(duì)追加在請(qǐng)求的URL后面。因?yàn)閁RL對(duì)字符數(shù)目有限制梯码,進(jìn)而限制了用在客戶端請(qǐng)求的參數(shù)值的數(shù)目宝泵。并且請(qǐng)求中的參數(shù)值是可見的,因此轩娶,敏感信息不能用這種方式傳遞儿奶。
doPOST:POST方法通過把請(qǐng)求參數(shù)值放在請(qǐng)求體中來克服GET方法的限制,因此鳄抒,可以發(fā)送的參數(shù)的數(shù)目是沒有限制的廓握。最后搅窿,通過POST請(qǐng)求傳遞的敏感信息對(duì)外部客戶端是不可見的。
97.什么是Web應(yīng)用程序隙券?
Web應(yīng)用程序是對(duì)Web或者是應(yīng)用服務(wù)器的動(dòng)態(tài)擴(kuò)展。有兩種類型的Web應(yīng)用:面向表現(xiàn)的和面向服務(wù)的闹司。面向表現(xiàn)的Web應(yīng)用程序會(huì)產(chǎn)生包含了很多種標(biāo)記語言和動(dòng)態(tài)內(nèi)容的交互的web頁面作為對(duì)請(qǐng)求的響應(yīng)娱仔。而面向服務(wù)的Web應(yīng)用實(shí)現(xiàn)了Web服務(wù)的端點(diǎn)(endpoint)询枚。一般來說立磁,一個(gè)Web應(yīng)用可以看成是一組安裝在服務(wù)器URL名稱空間的特定子集下面的Servlet的集合雀彼。
98.什么是服務(wù)端包含(Server Side Include)漏麦?
服務(wù)端包含(SSI)是一種簡(jiǎn)單的解釋型服務(wù)端腳本語言颊咬,大多數(shù)時(shí)候僅用在Web上职员,用servlet標(biāo)簽嵌入進(jìn)來拒贱。SSI最常用的場(chǎng)景把一個(gè)或多個(gè)文件包含到Web服務(wù)器的一個(gè)Web頁面中瘾境。當(dāng)瀏覽器訪問Web頁面的時(shí)候铐刘,Web服務(wù)器會(huì)用對(duì)應(yīng)的servlet產(chǎn)生的文本來替換Web頁面中的servlet標(biāo)簽陪每。
99.什么是Servlet鏈(Servlet Chaining)?
Servlet鏈?zhǔn)前岩粋€(gè)Servlet的輸出發(fā)送給另一個(gè)Servlet的方法镰吵。第二個(gè)Servlet的輸出可以發(fā)送給第三個(gè)Servlet檩禾,依次類推。鏈條上最后一個(gè)Servlet負(fù)責(zé)把響應(yīng)發(fā)送給客戶端疤祭。
100.如何知道是哪一個(gè)客戶端的機(jī)器正在請(qǐng)求你的Servlet盼产?
ServletRequest類可以找出客戶端機(jī)器的IP地址或者是主機(jī)名。getRemoteAddr()方法獲取客戶端主機(jī)的IP地址勺馆,getRemoteHost()可以獲取主機(jī)名戏售。看下這里的例子草穆。
101.HTTP響應(yīng)的結(jié)構(gòu)是怎么樣的灌灾?
HTTP響應(yīng)由三個(gè)部分組成:
狀態(tài)碼(Status Code):描述了響應(yīng)的狀態(tài)⌒可以用來檢查是否成功的完成了請(qǐng)求紧卒。請(qǐng)求失敗的情況下,狀態(tài)碼可用來找出失敗的原因诗祸。如果Servlet沒有返回狀態(tài)碼跑芳,默認(rèn)會(huì)返回成功的狀態(tài)碼HttpServletResponse.SC_OK。
HTTP頭部(HTTP Header):它們包含了更多關(guān)于響應(yīng)的信息直颅。比如:頭部可以指定認(rèn)為響應(yīng)過期的過期日期博个,或者是指定用來給用戶安全的傳輸實(shí)體內(nèi)容的編碼格式。如何在Serlet中檢索HTTP的頭部看這里功偿。
主體(Body):它包含了響應(yīng)的內(nèi)容盆佣。它可以包含HTML代碼往堡,圖片,等等共耍。主體是由傳輸在HTTP消息中緊跟在頭部后面的數(shù)據(jù)字節(jié)組成的虑灰。
102.什么是cookie?session和cookie有什么區(qū)別痹兜?
cookie是Web服務(wù)器發(fā)送給瀏覽器的一塊信息穆咐。瀏覽器會(huì)在本地文件中給每一個(gè)Web服務(wù)器存儲(chǔ)cookie。以后瀏覽器在給特定的Web服務(wù)器發(fā)請(qǐng)求的時(shí)候字旭,同時(shí)會(huì)發(fā)送所有為該服務(wù)器存儲(chǔ)的cookie对湃。下面列出了session和cookie的區(qū)別:
- 無論客戶端瀏覽器做怎么樣的設(shè)置,session都應(yīng)該能正常工作遗淳∨钠猓客戶端可以選擇禁用cookie,但是屈暗,session仍然是能夠工作的拆讯,因?yàn)榭蛻舳藷o法禁用服務(wù)端的session。
- 在存儲(chǔ)的數(shù)據(jù)量方面session和cookies也是不一樣的恐锦。session能夠存儲(chǔ)任意的Java對(duì)象往果,cookie只能存儲(chǔ)String類型的對(duì)象。
103.瀏覽器和Servlet通信使用的是什么協(xié)議一铅?
瀏覽器和Servlet通信使用的是HTTP協(xié)議陕贮。
104.什么是HTTP隧道?
HTTP隧道是一種利用HTTP或者是HTTPS把多種網(wǎng)絡(luò)協(xié)議封裝起來進(jìn)行通信的技術(shù)潘飘。因此肮之,HTTP協(xié)議扮演了一個(gè)打通用于通信的網(wǎng)絡(luò)協(xié)議的管道的包裝器的角色。把其他協(xié)議的請(qǐng)求掩蓋成HTTP的請(qǐng)求就是HTTP隧道卜录。
105.sendRedirect()和forward()方法有什么區(qū)別戈擒?
sendRedirect()方法會(huì)創(chuàng)建一個(gè)新的請(qǐng)求,而forward()方法只是把請(qǐng)求轉(zhuǎn)發(fā)到一個(gè)新的目標(biāo)上艰毒。重定向(redirect)以后筐高,之前請(qǐng)求作用域范圍以內(nèi)的對(duì)象就失效了,因?yàn)闀?huì)產(chǎn)生一個(gè)新的請(qǐng)求丑瞧,而轉(zhuǎn)發(fā)(forwarding)以后柑土,之前請(qǐng)求作用域范圍以內(nèi)的對(duì)象還是能訪問的。一般認(rèn)為sendRedirect()比forward()要慢绊汹。
106.什么是URL編碼和URL解碼稽屏?
URL編碼是負(fù)責(zé)把URL里面的空格和其他的特殊字符替換成對(duì)應(yīng)的十六進(jìn)制表示,反之就是解碼西乖。
JSP
107.什么是JSP頁面狐榔?
JSP頁面是一種包含了靜態(tài)數(shù)據(jù)和JSP元素兩種類型的文本的文本文檔坛增。靜態(tài)數(shù)據(jù)可以用任何基于文本的格式來表示,比如:HTML或者XML薄腻。JSP是一種混合了靜態(tài)內(nèi)容和動(dòng)態(tài)產(chǎn)生的內(nèi)容的技術(shù)收捣。這里看下JSP的例子。
108.JSP請(qǐng)求是如何被處理的庵楷?
瀏覽器首先要請(qǐng)求一個(gè)以.jsp擴(kuò)展名結(jié)尾的頁面坏晦,發(fā)起JSP請(qǐng)求,然后嫁乘,Web服務(wù)器讀取這個(gè)請(qǐng)求,使用JSP編譯器把JSP頁面轉(zhuǎn)化成一個(gè)Servlet類球碉。需要注意的是蜓斧,只有當(dāng)?shù)谝淮握?qǐng)求頁面或者是JSP文件發(fā)生改變的時(shí)候JSP文件才會(huì)被編譯,然后服務(wù)器調(diào)用servlet類睁冬,處理瀏覽器的請(qǐng)求挎春。一旦請(qǐng)求執(zhí)行結(jié)束,servlet會(huì)把響應(yīng)發(fā)送給客戶端豆拨。這里看下如何在JSP中獲取請(qǐng)求參數(shù)直奋。
109.JSP有什么優(yōu)點(diǎn)?
下面列出了使用JSP的優(yōu)點(diǎn):
- JSP頁面是被動(dòng)態(tài)編譯成Servlet的施禾,因此脚线,開發(fā)者可以很容易的更新展現(xiàn)代碼。
- JSP頁面可以被預(yù)編譯弥搞。
- JSP頁面可以很容易的和靜態(tài)模板結(jié)合邮绿,包括:HTML或者XML,也可以很容易的和產(chǎn)生動(dòng)態(tài)內(nèi)容的代碼結(jié)合起來攀例。
- 開發(fā)者可以提供讓頁面設(shè)計(jì)者以類XML格式來訪問的自定義的JSP標(biāo)簽庫船逮。
- 開發(fā)者可以在組件層做邏輯上的改變,而不需要編輯單獨(dú)使用了應(yīng)用層邏輯的頁面粤铭。
110.什么是JSP指令(Directive)挖胃?JSP中有哪些不同類型的指令?
Directive是當(dāng)JSP頁面被編譯成Servlet的時(shí)候梆惯,JSP引擎要處理的指令酱鸭。Directive用來設(shè)置頁面級(jí)別的指令,從外部文件插入數(shù)據(jù)加袋,指定自定義的標(biāo)簽庫凛辣。Directive是定義在 <%@ 和 %>之間的。下面列出了不同類型的Directive:
- 包含指令(Include directive):用來包含文件和合并文件內(nèi)容到當(dāng)前的頁面职烧。
- 頁面指令(Page directive):用來定義JSP頁面中特定的屬性扁誓,比如錯(cuò)誤頁面和緩沖區(qū)防泵。
- Taglib指令:用來聲明頁面中使用的自定義的標(biāo)簽庫。
111.什么是JSP動(dòng)作(JSP action)蝗敢?
JSP動(dòng)作以XML語法的結(jié)構(gòu)來控制Servlet引擎的行為捷泞。當(dāng)JSP頁面被請(qǐng)求的時(shí)候,JSP動(dòng)作會(huì)被執(zhí)行寿谴。它們可以被動(dòng)態(tài)的插入到文件中锁右,重用JavaBean組件,轉(zhuǎn)發(fā)用戶到其他的頁面讶泰,或者是給Java插件產(chǎn)生HTML代碼咏瑟。下面列出了可用的動(dòng)作:
- jsp:include-當(dāng)JSP頁面被請(qǐng)求的時(shí)候包含一個(gè)文件。
- jsp:useBean-找出或者是初始化Javabean痪署。
- jsp:setProperty-設(shè)置JavaBean的屬性码泞。
- jsp:getProperty-獲取JavaBean的屬性。
- jsp:forward-把請(qǐng)求轉(zhuǎn)發(fā)到新的頁面狼犯。
- jsp:plugin-產(chǎn)生特定瀏覽器的代碼余寥。
112.什么是Scriptlets?
JSP技術(shù)中悯森,scriptlet是嵌入在JSP頁面中的一段Java代碼宋舷。scriptlet是位于標(biāo)簽內(nèi)部的所有的東西,在標(biāo)簽與標(biāo)簽之間瓢姻,用戶可以添加任意有效的scriplet祝蝠。
113.聲明(Decalaration)在哪里?
聲明跟Java中的變量聲明很相似汹来,它用來聲明隨后要被表達(dá)式或者scriptlet使用的變量续膳。添加的聲明必須要用開始和結(jié)束標(biāo)簽包起來。
114.什么是表達(dá)式(Expression)收班?
【列表很長(zhǎng)坟岔,可以分上、中摔桦、下發(fā)布】
JSP表達(dá)式是Web服務(wù)器把腳本語言表達(dá)式的值轉(zhuǎn)化成一個(gè)String對(duì)象社付,插入到返回給客戶端的數(shù)據(jù)流中。表達(dá)式是在<%=和%>這兩個(gè)標(biāo)簽之間定義的邻耕。
115.隱含對(duì)象是什么意思鸥咖?有哪些隱含對(duì)象?
JSP隱含對(duì)象是頁面中的一些Java對(duì)象兄世,JSP容器讓這些Java對(duì)象可以為開發(fā)者所使用啼辣。開發(fā)者不用明確的聲明就可以直接使用他們。JSP隱含對(duì)象也叫做預(yù)定義變量御滩。下面列出了JSP頁面中的隱含對(duì)象:
- application
- page
- request
- response
- session
- exception
- out
- config
- pageContext
Java開發(fā)崗位面試題歸類匯總
一鸥拧、Java基礎(chǔ)
String類為什么是final的
HashMap的源碼党远,實(shí)現(xiàn)原理,底層結(jié)構(gòu)富弦。
說說你知道的幾個(gè)Java集合類:list沟娱、set、queue腕柜、map實(shí)現(xiàn)類济似。
描述一下ArrayList和LinkedList各自實(shí)現(xiàn)和區(qū)別
Java中的隊(duì)列都有哪些,有什么區(qū)別盏缤。
反射中砰蠢,Class.forName和classloader的區(qū)別。
Java7唉铜、Java8的新特性
Java數(shù)組和鏈表兩種結(jié)構(gòu)的操作效率娩脾,在哪些情況下(從開頭開始,從結(jié)尾開始打毛,從中間開始),哪些操作(插入俩功,查找幻枉,刪除)的效率高。
Java內(nèi)存泄露的問題調(diào)查定位:jmap诡蜓,jstack的使用等等熬甫。
string、stringbuilder蔓罚、stringbuffer區(qū)別
hashtable和hashmap的區(qū)別
13 .異常的結(jié)構(gòu)椿肩,運(yùn)行時(shí)異常和非運(yùn)行時(shí)異常,各舉個(gè)例子豺谈。
String 類的常用方法
Java 的引用類型有哪幾種
抽象類和接口的區(qū)別
java的基礎(chǔ)類型和字節(jié)大小
Hashtable,HashMap,ConcurrentHashMap底層實(shí)現(xiàn)原理與線程安全問題郑象。
如果不讓你用Java Jdk提供的工具,你自己實(shí)現(xiàn)一個(gè)Map茬末,你怎么做厂榛。說了好久,說了HashMap源代碼丽惭,如果我做击奶,就會(huì)借鑒HashMap的原理,說了一通HashMap實(shí)現(xiàn)责掏。
Hash沖突怎么辦柜砾?哪些解決散列沖突的方法?
HashMap沖突很厲害换衬,最差性能痰驱,你會(huì)怎么解決?從O(n)提升到log(n)证芭。
rehash
hashCode() 與 equals() 生成算法、方法怎么重寫萄唇。
二檩帐、Java IO
講講IO里面的常見類,字節(jié)流另萤、字符流湃密、接口、實(shí)現(xiàn)類四敞、方法阻塞泛源。
講講NIO
String 編碼UTF-8 和GBK的區(qū)別?
什么時(shí)候使用字節(jié)流忿危、什么時(shí)候使用字符流达箍?
遞歸讀取文件夾下的文件,代碼怎么實(shí)現(xiàn)铺厨?
三缎玫、Java Web
session和cookie的區(qū)別和聯(lián)系,session的生命周期解滓,多個(gè)服務(wù)部署時(shí)session管理赃磨。
servlet的一些相關(guān)問題
webservice相關(guān)問題
jdbc連接,forname方式的步驟洼裤,怎么聲明使用一個(gè)事務(wù)邻辉。
無框架下配置web.xml的主要配置內(nèi)容
jsp和servlet的區(qū)別
四、JVM
Java的內(nèi)存模型以及GC算法
jvm性能調(diào)優(yōu)都做了什么
介紹JVM中7個(gè)區(qū)域腮鞍,然后把每個(gè)區(qū)域可能造成內(nèi)存的溢出的情況說明值骇。
介紹GC 和GC Root不正常引用
自己從classload 加載方式,加載機(jī)制說開去移国,從程序運(yùn)行時(shí)數(shù)據(jù)區(qū)吱瘩,講到內(nèi)存分配,講到String常量池迹缀,講到JVM垃圾回收機(jī)制搅裙,算法,hotspot裹芝。
jvm 如何分配直接內(nèi)存部逮, new 對(duì)象如何不分配在堆而是棧上,常量池解析嫂易。
數(shù)組多大放在JVM老年代
老年代中數(shù)組的訪問方式
GC 算法兄朋,永久代對(duì)象如何 GC , GC 有環(huán)怎么處理。
誰會(huì)被 GC 颅和,什么時(shí)候 GC傅事。
如果想不被 GC 怎么辦
如果想在 GC 中生存 1 次怎么辦
五、開源框架
hibernate和ibatis的區(qū)別
講講mybatis的連接池
spring框架中需要引用哪些jar包峡扩,以及這些jar包的用途
springMVC的原理
springMVC注解的意思
spring中beanFactory和ApplicationContext的聯(lián)系和區(qū)別
spring注入的幾種方式
spring如何實(shí)現(xiàn)事物管理的
springIOC
spring AOP的原理
hibernate中的1級(jí)和2級(jí)緩存的使用方式以及區(qū)別原理(Lazy-Load的理解)
Hibernate的原理體系架構(gòu)蹭越,五大核心接口,Hibernate對(duì)象的三種狀態(tài)轉(zhuǎn)換教届,事務(wù)管理响鹃。
六、多線程
Java創(chuàng)建線程之后案训,直接調(diào)用start()方法和run()的區(qū)別
常用的線程池模式以及不同線程池的使用場(chǎng)景
newFixedThreadPool此種線程池如果線程數(shù)達(dá)到最大值后會(huì)怎么辦买置,底層原理。
多線程之間通信的同步問題强霎,synchronized鎖的是對(duì)象忿项,衍伸出和synchronized相關(guān)很多的具體問題,例如同一個(gè)類不同方法都有synchronized鎖城舞,一個(gè)對(duì)象是否可以同時(shí)訪問轩触。或者一個(gè)類的static構(gòu)造方法加上synchronized之后的鎖的影響家夺。
了解可重入鎖的含義怕膛,以及ReentrantLock 和synchronized的區(qū)別
同步的數(shù)據(jù)結(jié)構(gòu),例如concurrentHashMap的源碼理解以及內(nèi)部實(shí)現(xiàn)原理秦踪,為什么他是同步的且效率高。
atomicinteger和Volatile等線程安全操作的關(guān)鍵字的理解和使用
線程間通信掸茅,wait和notify
定時(shí)線程的使用
場(chǎng)景:在一個(gè)主線程中椅邓,要求有大量(很多很多)子線程執(zhí)行完之后,主線程才執(zhí)行完成昧狮。多種方式景馁,考慮效率。
進(jìn)程和線程的區(qū)別
什么叫線程安全逗鸣?
線程的幾種狀態(tài)
并發(fā)合住、同步的接口或方法
HashMap 是否線程安全,為何不安全撒璧。ConcurrentHashMap透葛,線程安全,為何安全卿樱。底層實(shí)現(xiàn)是怎么樣的僚害。
J.U.C下的常見類的使用。ThreadPool的深入考察繁调;BlockingQueue的使用萨蚕。(take靶草,poll的區(qū)別,put岳遥,offer的區(qū)別)奕翔;原子類的實(shí)現(xiàn)。
簡(jiǎn)單介紹下多線程的情況,從建立一個(gè)線程開始闸与。然后怎么控制同步過程难述,多線程常用的方法和結(jié)構(gòu)
volatile的理解
實(shí)現(xiàn)多線程有幾種方式,多線程同步怎么做互艾,說說幾個(gè)線程里常用的方法。
七讯泣、網(wǎng)絡(luò)通信
http是無狀態(tài)通信纫普,http的請(qǐng)求方式有哪些,可以自己定義新的請(qǐng)求方式么好渠。
socket通信昨稼,以及長(zhǎng)連接,分包拳锚,連接異常斷開的處理假栓。
socket通信模型的使用,AIO和NIO霍掺。
socket框架netty的使用匾荆,以及NIO的實(shí)現(xiàn)原理,為什么是異步非阻塞杆烁。
同步和異步牙丽,阻塞和非阻塞。
OSI七層模型兔魂,包括TCP,IP的一些基本知識(shí)
http中烤芦,get post的區(qū)別
說說http,tcp,udp之間關(guān)系和區(qū)別。
說說瀏覽器訪問www.taobao.com析校,經(jīng)歷了怎樣的過程构罗。
HTTP協(xié)議、 HTTPS協(xié)議智玻,SSL協(xié)議及完整交互過程遂唧;
tcp的擁塞,快回傳吊奢,ip的報(bào)文丟棄
https處理的一個(gè)過程蠢箩,對(duì)稱加密和非對(duì)稱加密
head各個(gè)特點(diǎn)和區(qū)別
說說瀏覽器訪問www.taobao.com,經(jīng)歷了怎樣的過程。
八谬泌、數(shù)據(jù)庫MySql
MySql的存儲(chǔ)引擎的不同
單個(gè)索引滔韵、聯(lián)合索引、主鍵索引
Mysql怎么分表掌实,以及分表后如果想按條件分頁查詢?cè)趺崔k
分表之后想讓一個(gè)id多個(gè)表是自增的陪蜻,效率實(shí)現(xiàn)
MySql的主從實(shí)時(shí)備份同步的配置,以及原理(從庫讀主庫的binlog)贱鼻,讀寫分離宴卖。
寫SQL語句和SQL優(yōu)化
索引的數(shù)據(jù)結(jié)構(gòu),B+樹
事務(wù)的四個(gè)特性邻悬,以及各自的特點(diǎn)(原子症昏、隔離)等等,項(xiàng)目怎么解決這些問題父丰。
數(shù)據(jù)庫的鎖:行鎖肝谭,表鎖;樂觀鎖蛾扇,悲觀鎖
數(shù)據(jù)庫事務(wù)的幾種粒度
關(guān)系型和非關(guān)系型數(shù)據(jù)庫區(qū)別
九攘烛、設(shè)計(jì)模式
單例模式:飽漢、餓漢镀首。以及餓漢中的延遲加載坟漱,雙重檢查。
工廠模式更哄、裝飾者模式芋齿、觀察者模式。
工廠方法模式的優(yōu)點(diǎn)(低耦合成翩、高內(nèi)聚觅捆,開放封閉原則)
十、算法
使用隨機(jī)算法產(chǎn)生一個(gè)數(shù)捕传,要求把1-1000W之間這些數(shù)全部生成。
兩個(gè)有序數(shù)組的合并排序
一個(gè)數(shù)組的倒序
計(jì)算一個(gè)正整數(shù)的正平方根
說白了就是常見的那些查找扩劝、排序算法以及各自的時(shí)間復(fù)雜度庸论。
二叉樹的遍歷算法
DFS,BFS算法
比較重要的數(shù)據(jù)結(jié)構(gòu),如鏈表棒呛,隊(duì)列聂示,棧的基本理解及大致實(shí)現(xiàn)。
排序算法與時(shí)空復(fù)雜度(快排為什么不穩(wěn)定簇秒,為什么你的項(xiàng)目還在用)
逆波蘭計(jì)算器
Hoffman 編碼
查找樹與紅黑樹
十一鱼喉、并發(fā)與性能調(diào)優(yōu)
有個(gè)每秒鐘5k個(gè)請(qǐng)求,查詢手機(jī)號(hào)所屬地的筆試題,如何設(shè)計(jì)算法?請(qǐng)求再多扛禽,比如5w锋边,如何設(shè)計(jì)整個(gè)系統(tǒng)?
高并發(fā)情況下,我們系統(tǒng)是如何支撐大量的請(qǐng)求的
集群如何同步會(huì)話狀態(tài)
負(fù)載均衡的原理
5 .如果有一個(gè)特別大的訪問量编曼,到數(shù)據(jù)庫上豆巨,怎么做優(yōu)化(DB設(shè)計(jì),DBIO掐场,SQL優(yōu)化往扔,Java優(yōu)化)
如果出現(xiàn)大面積并發(fā),在不增加服務(wù)器的基礎(chǔ)上熊户,如何解決服務(wù)器響應(yīng)不及時(shí)問題“萍膛。
假如你的項(xiàng)目出現(xiàn)性能瓶頸了,你覺得可能會(huì)是哪些方面嚷堡,怎么解決問題蝗罗。
如何查找 造成 性能瓶頸出現(xiàn)的位置,是哪個(gè)位置照成性能瓶頸麦到。
你的項(xiàng)目中使用過緩存機(jī)制嗎绿饵?有沒用用戶非本地緩存
十二、其他
Linux 基本操作命令
文件和目錄管理
創(chuàng)建和刪除
創(chuàng)建:mkdir
刪除:rm
刪除非空目錄:rm -rf file 目錄
刪除日志 rm log (等價(jià): $find ./-name “l(fā)og” -exec rm {} ; )
移動(dòng):mv
復(fù)制:cp (復(fù)制目錄:cp -r)
創(chuàng)建文件 touch
查看
顯示當(dāng)前目錄下的文件 ls
按時(shí)間排序瓶颠,以列表的方式顯示目錄項(xiàng) ls -lrt
ls -l
查看文件內(nèi)容 cat 可以加 more 拟赊、less 控制輸出的內(nèi)容的大小
cat a.text
cat a.text | more
cat a.text| less
權(quán)限
改變文件的擁有者 chown
改變文件讀、寫粹淋、執(zhí)行等屬性 chmod
遞歸子目錄修改:chown -R tuxapp source/
增加腳本可執(zhí)行權(quán)限:chmod a+x myscript
管道和重定向
把前一個(gè)命令的執(zhí)行結(jié)果當(dāng)做后一個(gè)命令的輸入 |
串聯(lián):使用分號(hào) ;
前面成功吸祟,則執(zhí)行后面一條,否則桃移,不執(zhí)行: &&
前面失敗屋匕,則后一條執(zhí)行: ||
ls /proc && echo suss! || echo failed.
文本處理
文件查找 find
find 參數(shù)很多,本文只介紹幾個(gè)常用的
-name 按名字查找
-type 按類型
-atime 訪問時(shí)間
find . -atime 7 -type f -print
find . -type d -print //只列出所有目錄
find / -name "hello.c" 查找hello.c文件
文本查找 grep
grep match_patten file // 默認(rèn)訪問匹配行
常用參數(shù)
-o 只輸出匹配的文本行 VS -v 只輸出沒有匹配的文本行
-c 統(tǒng)計(jì)文件中包含文本的次數(shù)
grep -c “text” filename
-n 打印匹配的行號(hào)
-i 搜索時(shí)忽略大小寫
-l 只打印文件名
grep "class" . -R -n # 在多級(jí)目錄中對(duì)文本遞歸搜索(程序員搜代碼的最愛)
cat LOG.* | tr a-z A-Z | grep "FROM " | grep "WHERE" > b #將日志中的所有帶where條件的sql查找查找出來
文本替換 sed
sed [options] 'command' file(s)
首處替換
sed 's/text/replace_text/' file //替換每一行的第一處匹配的text
全局替換
sed 's/text/replace_text/g' file
默認(rèn)替換后借杰,輸出替換后的內(nèi)容过吻,如果需要直接替換原文件,使用 -i:
sed -i 's/text/repalce_text/g' file
移除空白行
sed '/^$/d' file
sed 's/book/books/' file #替換文本中的字符串:
sed 's/book/books/g' file
sed '/^$/d' file #刪除空白行
數(shù)據(jù)流處理 awk
詳細(xì)教程可以查看 http://awk.readthedocs.io/en/latest/chapte...
awk ' BEGIN{ statements } statements2 END{ statements } '
工作流程
執(zhí)行 begin 中語句塊蔗衡;
從文件或 stdin 中讀入一行纤虽,然后執(zhí)行 statements2,重復(fù)這個(gè)過程绞惦,直到文件全部被讀取完畢逼纸;
執(zhí)行 end 語句塊;
特殊變量
NR: 表示記錄數(shù)量济蝉,在執(zhí)行過程中對(duì)應(yīng)當(dāng)前行號(hào)杰刽;
NF: 表示字段數(shù)量菠发,在執(zhí)行過程總對(duì)應(yīng)當(dāng)前行的字段數(shù);
$0: 這個(gè)變量包含執(zhí)行過程中當(dāng)前行的文本內(nèi)容贺嫂;
$1: 第一個(gè)字段的文本內(nèi)容滓鸠;
$2: 第二個(gè)字段的文本內(nèi)容;
awk '{print 3}' file
日志格式:'remote_user [
request"
body_bytes_sent "
http_user_agent" "$http_x_forwarded_for"'
統(tǒng)計(jì)日志中訪問最多的10個(gè)IP
awk '{a[$1]++}END{for(i in a)print a[i],i|"sort -k1 -nr|head -n10"}' access.log
排序 sort
-n 按數(shù)字進(jìn)行排序 VS -d 按字典序進(jìn)行排序
-r 逆序排序
-k N 指定按第 N 列排序
sort -nrk 1 data.txt
sort -bd data // 忽略像空格之類的前導(dǎo)空白字符
去重 uniq
消除重復(fù)行
sort unsort.txt | uniq
統(tǒng)計(jì) wc
wc -l file // 統(tǒng)計(jì)行數(shù)
wc -w file // 統(tǒng)計(jì)單詞數(shù)
wc -c file // 統(tǒng)計(jì)字符數(shù)
Java 知識(shí)點(diǎn)
Java 基礎(chǔ)
1涝婉、HashMap的源碼哥力,實(shí)現(xiàn)原理,JDK8中對(duì)HashMap做了怎樣的優(yōu)化墩弯。
2吩跋、HaspMap擴(kuò)容是怎樣擴(kuò)容的,為什么都是2的N次冪的大小渔工。
3锌钮、HashMap,HashTable引矩,ConcurrentHashMap的區(qū)別梁丘。
4、極高并發(fā)下HashTable和ConcurrentHashMap哪個(gè)性能更好旺韭,為什么氛谜,如何實(shí)現(xiàn)的。
5区端、HashMap在高并發(fā)下如果沒有處理線程安全會(huì)有怎樣的安全隱患值漫,具體表現(xiàn)是什么。
6织盼、java中四種修飾符的限制范圍杨何。
7、Object類中的方法沥邻。
8危虱、接口和抽象類的區(qū)別,注意JDK8的接口可以有實(shí)現(xiàn)唐全。
9埃跷、動(dòng)態(tài)代理的兩種方式,以及區(qū)別邮利。
10弥雹、Java序列化的方式。
11近弟、傳值和傳引用的區(qū)別缅糟,Java是怎么樣的挺智,有沒有傳值引用祷愉。
12窗宦、一個(gè)ArrayList在循環(huán)過程中刪除,會(huì)不會(huì)出問題二鳄,為什么赴涵。
JVM
1、JVM的內(nèi)存結(jié)構(gòu)订讼。
2髓窜、JVM方法棧的工作過程,方法棧和本地方法棧有什么區(qū)別欺殿。
3寄纵、JVM的棧中引用如何和堆中的對(duì)象產(chǎn)生關(guān)聯(lián)。
4脖苏、可以了解一下逃逸分析技術(shù)程拭。
5、GC的常見算法棍潘,CMS以及G1的垃圾回收過程恃鞋,CMS的各個(gè)階段哪兩個(gè)是Stop the world的,CMS會(huì)不會(huì)產(chǎn)生碎片亦歉,G1的優(yōu)勢(shì)恤浪。
6、標(biāo)記清除和標(biāo)記整理算法的理解以及優(yōu)缺點(diǎn)肴楷。
7水由、eden survivor區(qū)的比例,為什么是這個(gè)比例阶祭,eden survivor的工作過程绷杜。
8、JVM如何判斷一個(gè)對(duì)象是否該被GC濒募,可以視為root的都有哪幾種類型鞭盟。
9、強(qiáng)軟弱虛引用的區(qū)別以及GC對(duì)他們執(zhí)行怎樣的操作瑰剃。
10齿诉、Java是否可以GC直接內(nèi)存。
11晌姚、Java類加載的過程粤剧。
12、雙親委派模型的過程以及優(yōu)勢(shì)挥唠。
13抵恋、常用的JVM調(diào)優(yōu)參數(shù)。
14宝磨、dump文件的分析弧关。
15盅安、Java有沒有主動(dòng)觸發(fā)GC的方式(沒有)。
數(shù)據(jù)結(jié)構(gòu)與算法
1世囊、B+樹
2别瞭、快速排序,堆排序株憾,插入排序(八大排序算法)
3蝙寨、一致性Hash算法,一致性Hash算法的應(yīng)用
多線程
1嗤瞎、Java實(shí)現(xiàn)多線程有哪幾種方式墙歪。
2、Callable和Future的了解贝奇。
3箱亿、線程池的參數(shù)有哪些,在線程池創(chuàng)建一個(gè)線程的過程弃秆。
4届惋、volitile關(guān)鍵字的作用,原理菠赚。
5脑豹、synchronized關(guān)鍵字的用法,優(yōu)缺點(diǎn)衡查。
6瘩欺、Lock接口有哪些實(shí)現(xiàn)類,使用場(chǎng)景是什么拌牲。
7俱饿、可重入鎖的用處及實(shí)現(xiàn)原理,寫時(shí)復(fù)制的過程塌忽,讀寫鎖拍埠,分段鎖(ConcurrentHashMap中的segment)。
8土居、悲觀鎖枣购,樂觀鎖,優(yōu)缺點(diǎn)擦耀,CAS有什么缺陷棉圈,該如何解決。
9眷蜓、ABC三個(gè)線程如何保證順序執(zhí)行分瘾。
10、線程的狀態(tài)都有哪些吁系。
11德召、sleep和wait的區(qū)別痊远。
12、notify和notifyall的區(qū)別氏捞。
13、ThreadLocal的了解冒版,實(shí)現(xiàn)原理液茎。
分布式
1、分布式事務(wù)的控制辞嗡。分布式鎖如何設(shè)計(jì)捆等。
2、分布式session如何設(shè)計(jì)续室。
3栋烤、dubbo的組件有哪些,各有什么作用挺狰。
4明郭、zookeeper的負(fù)載均衡算法有哪些。
5丰泊、dubbo是如何利用接口就可以通信的薯定。
框架相關(guān)
1、SpringMVC的Controller是如何將參數(shù)和前端傳來的數(shù)據(jù)一一對(duì)應(yīng)的瞳购。
2话侄、Mybatis如何找到指定的Mapper的,如何完成查詢的学赛。
3年堆、Quartz是如何完成定時(shí)任務(wù)的。自定義注解的實(shí)現(xiàn)盏浇。
4变丧、Spring使用了哪些設(shè)計(jì)模式。Spring的IOC有什么優(yōu)勢(shì)绢掰。
5锄贷、Spring如何維護(hù)它擁有的bean。
6曼月、一些較新的東西JDK8的新特性谊却,流的概念及優(yōu)勢(shì),為什么有這種優(yōu)勢(shì)哑芹。
7炎辨、區(qū)塊鏈了解如何設(shè)計(jì)雙11交易總額面板,要做到高并發(fā)高可用
Java面試題之:Java中的幾種線程池
Java 通過 Executors 提供四種線程池
- CachedThreadPool():可緩存線程池聪姿。
- FixedThreadPool():定長(zhǎng)線程池碴萧。
- ScheduledThreadPool():定時(shí)線程池乙嘀。
- SingleThreadExecutor():?jiǎn)尉€程化的線程池。
ThreadPoolExecutor 的執(zhí)行流程
- 線程數(shù)量未達(dá)到 corePoolSize破喻,則新建一個(gè)線程 (核心線程) 執(zhí)行任務(wù)虎谢。
- 線程數(shù)量達(dá)到了 corePools,則將任務(wù)移入隊(duì)列等待曹质。
- 隊(duì)列已滿婴噩,新建線程 (非核心線程) 執(zhí)行任務(wù)。
- 隊(duì)列已滿羽德,總線程數(shù)又達(dá)到了 maximumPoolSize几莽,就會(huì)由 (RejectedExecutionHandler) 拋出異常 (拒絕策略)
建線程 -> 達(dá)到核心數(shù) -> 加入隊(duì)列 -> 新建線程(非核心) -> 達(dá)到最大數(shù) -> 觸發(fā)拒絕策略
ThreadPoolExecutor 的幾個(gè)參數(shù)
corePoolSize:核心池的大小,這個(gè)參數(shù)跟后面講述的線程池的實(shí)現(xiàn)原理有非常大的關(guān)系宅静。在創(chuàng)建了線程池后章蚣,默認(rèn)情況下,線程池中并沒有任何線程姨夹,而是等待有任務(wù)到來才創(chuàng)建線程去執(zhí)行任務(wù)纤垂,除非調(diào)用了 prestartAllCoreThreads () 或者 prestartCoreThread () 方法,從這 2 個(gè)方法的名字就可以看出磷账,是預(yù)創(chuàng)建線程的意思洒忧,即在沒有任務(wù)到來之前就創(chuàng)建 corePoolSize 個(gè)線程或者一個(gè)線程。默認(rèn)情況下够颠,在創(chuàng)建了線程池后熙侍,線程池中的線程數(shù)為 0,當(dāng)有任務(wù)來之后履磨,就會(huì)創(chuàng)建一個(gè)線程去執(zhí)行任務(wù)蛉抓,當(dāng)線程池中的線程數(shù)目達(dá)到 corePoolSize 后,就會(huì)把到達(dá)的任務(wù)放到緩存隊(duì)列當(dāng)中剃诅。
maximumPoolSize:線程池最大線程數(shù)巷送,這個(gè)參數(shù)也是一個(gè)非常重要的參數(shù),它表示在線程池中最多能創(chuàng)建多少個(gè)線程矛辕;如果當(dāng)前阻塞隊(duì)列滿了笑跛,且繼續(xù)提交任務(wù),則創(chuàng)建新的線程執(zhí)行任務(wù),前提是當(dāng)前線程數(shù)小于 maximumPoolSize;當(dāng)阻塞隊(duì)列是無界隊(duì)列悲雳, 則 maximumPoolSize 不起作用,因?yàn)闊o法提交至核心線程池的線程會(huì)一直持續(xù)地放入 workQueue (工作隊(duì)列) 中陈哑。
keepAliveTime:表示線程沒有任務(wù)執(zhí)行時(shí)最多保持多久時(shí)間會(huì)終止。默認(rèn)情況下,只有當(dāng)線程池中的線程數(shù)大于 corePoolSize 時(shí)惊窖,keepAliveTime 才會(huì)起作用刽宪,直到線程池中的線程數(shù)不大于 corePoolSize,即當(dāng)線程池中線程數(shù)大于 corePoolSize 時(shí)界酒, 如果一個(gè)線程空閑的時(shí)間達(dá)到 keepAliveTime圣拄,則會(huì)終止,直到線程池中的線程數(shù)不超過 corePoolSize毁欣。但是如果調(diào)用了 allowCoreThreadTimeOut (boolean) 方法庇谆,在線程池中的線程數(shù)不大于 corePoolSize 時(shí),keepAliveTime 參數(shù)也會(huì)起作用署辉, 直到線程池中的線程數(shù)為 0。
allowCoreThreadTimeout:默認(rèn)情況下超過 keepAliveTime 的時(shí)候岩四,核心線程不會(huì)退出哭尝,可通過將該參數(shù)設(shè)置為 true,讓核心線程也退出剖煌。
unit:可以指定 keepAliveTime 的時(shí)間單位材鹦。
workQueue
ArrayBlockingQueue 有界隊(duì)列,需要指定隊(duì)列大小耕姊。
LinkedBlockingQueue 若指定大小則和 ArrayBlockingQueue 類似桶唐,若不指定大小則默認(rèn)能存儲(chǔ) Integer.MAX_VALUE 個(gè)任務(wù),相當(dāng)于無界隊(duì)列茉兰,此時(shí) maximumPoolSize 值其實(shí)是無意義的尤泽。
SynchronousQueue 同步阻塞隊(duì)列,當(dāng)有任務(wù)添加進(jìn)來后规脸,必須有線程從隊(duì)列中取出坯约,當(dāng)前線程才會(huì)被釋放,newCachedThreadPool 就使用這種隊(duì)列莫鸭。
RejectedExecutionHandler:線程數(shù)和隊(duì)列都滿的情況下闹丐,線程池會(huì)執(zhí)行的拒絕策略,有四個(gè) (也可以使用自定義的策略)被因。
線程池的四種拒絕策略
- AbortPolicy:不執(zhí)行新任務(wù)卿拴,直接拋出異常,提示線程池已滿梨与,線程池默認(rèn)策略堕花。
- DiscardPolicy:不執(zhí)行新任務(wù),也不拋出異常粥鞋,基本上為靜默模式航徙。
- DisCardOldSetPolicy:將消息隊(duì)列中的第一個(gè)任務(wù)替換為當(dāng)前新進(jìn)來的任務(wù)執(zhí)行。
- CallerRunPolicy:拒絕新任務(wù)進(jìn)入,如果該線程池還沒被關(guān)閉到踏,那么這個(gè)新的任務(wù)在執(zhí)行線程中被調(diào)用杠袱。
Executors 和 ThreadPoolExecutor 創(chuàng)建線程的區(qū)別
- Executors
- newFixedThreadPool 和 newSingleThreadExecutor: 主要問題是堆積的請(qǐng)求處理隊(duì)列可能會(huì)耗費(fèi)非常大的內(nèi)存,甚至 OOM窝稿。
- newCachedThreadPool 和 newScheduledThreadPool: 主要問題是線程數(shù)最大數(shù)是 Integer.MAX_VALUE (2 的 31 次方 - 1楣富,int 類型最大值),可能會(huì)創(chuàng)建數(shù)量非常多的線程伴榔,甚至 OOM纹蝴。
- ThreadPoolExecutor
- 創(chuàng)建線程池方式只有一種,就是走它的構(gòu)造函數(shù)踪少,參數(shù)自己指定塘安。
為什么使用線程池
- 減少了創(chuàng)建和銷毀線程的次數(shù),每個(gè)工作線程都可以被重復(fù)利用援奢,可執(zhí)行多個(gè)任務(wù)兼犯。
- 運(yùn)用線程池能有效的控制線程最大并發(fā)數(shù),可以根據(jù)系統(tǒng)的承受能力集漾,調(diào)整線程池中工作線線程的數(shù)目切黔,防止因?yàn)橄倪^多的內(nèi)存,而把服務(wù)器累趴下 (每個(gè)線程需要大約 1MB 內(nèi)存具篇,線程開的越多纬霞,消耗的內(nèi)存也就越大,最后死機(jī))驱显。
- 對(duì)線程進(jìn)行一些簡(jiǎn)單的管理诗芜,比如:延時(shí)執(zhí)行、定時(shí)循環(huán)執(zhí)行的策略等埃疫,運(yùn)用線程池都能進(jìn)行很好的實(shí)現(xiàn)绢陌。
如何向線程池中提交任務(wù)
可以通過 execute () 或 submit () 兩個(gè)方法向線程池提交任務(wù)。
- execute () 方法沒有返回值熔恢,所以無法判斷任務(wù)知否被線程池執(zhí)行成功脐湾。
- submit () 方法返回一個(gè) future, 那么我們可以通過這個(gè) future 來判斷任務(wù)是否執(zhí)行成功,通過 future 的 get 方法來獲取返回值叙淌。
如何關(guān)閉線程池
可以通過 shutdown () 或 shutdownNow () 方法來關(guān)閉線程池秤掌。
- shutdown 的原理是只是將線程池的狀態(tài)設(shè)置成 SHUTDOWN 狀態(tài),然后中斷所有沒有正在執(zhí)行任務(wù)的線程鹰霍。
- shutdownNow 的原理是遍歷線程池中的工作線程闻鉴,然后逐個(gè)調(diào)用線程的 interrupt 方法來中斷線程,所以無法響應(yīng)中斷的任務(wù)可能永遠(yuǎn)無法終止茂洒。shutdownNow 會(huì)首先將線程池的狀態(tài)設(shè)置成 STOP孟岛,然后嘗試停止所有的正在執(zhí)行或暫停任務(wù)的線程,并返回等待執(zhí)行任務(wù)的列表。
萬萬沒想到渠羞,JVM內(nèi)存結(jié)構(gòu)的面試題可以問的這么難斤贰?
大家嘗試著回答一下以下問題:
1、JVM管理的內(nèi)存結(jié)構(gòu)是怎樣的次询?
2荧恍、不同的虛擬機(jī)在實(shí)現(xiàn)運(yùn)行時(shí)內(nèi)存的時(shí)候有什么區(qū)別?
3屯吊、運(yùn)行時(shí)數(shù)據(jù)區(qū)中哪些區(qū)域是線程共享的送巡?哪些是獨(dú)享的?
4盒卸、除了JVM運(yùn)行時(shí)內(nèi)存以外骗爆,還有什么區(qū)域可以用嗎?
5蔽介、堆和棧的區(qū)別是什么摘投?
6、Java中的數(shù)組是存儲(chǔ)在堆上還是棧上的屉佳?
7谷朝、Java中的對(duì)象創(chuàng)建有多少種方式洲押?
8武花、Java中對(duì)象創(chuàng)建的過程是怎么樣的?
9杈帐、Java中的對(duì)象一定在堆上分配內(nèi)存嗎体箕?
10、如何獲取堆和棧的dump文件挑童?
以上10道題累铅,如果您可以全部準(zhǔn)確無誤的回答的話,那說明你真的很了解JVM的內(nèi)存結(jié)構(gòu)以及內(nèi)存分配相關(guān)的知識(shí)了站叼,如果有哪些知識(shí)點(diǎn)是不了解的娃兽,那么本文正好可以幫你答疑解惑。
JVM管理的內(nèi)存結(jié)構(gòu)是怎樣的尽楔?
Java虛擬機(jī)在執(zhí)行Java程序的過程中會(huì)把他所管理的內(nèi)存劃分為若干個(gè)不同的數(shù)據(jù)區(qū)域投储。《Java虛擬機(jī)規(guī)范》中規(guī)定了JVM所管理的內(nèi)存需要包括一下幾個(gè)運(yùn)行時(shí)區(qū)域:
主要包含了PC寄存器(程序計(jì)數(shù)器)阔馋、Java虛擬機(jī)棧呕寝、本地方法棧、Java堆、方法區(qū)以及運(yùn)行時(shí)常量池塞蹭。
各個(gè)區(qū)域有各自不同的作用嚼酝,關(guān)于各個(gè)區(qū)域的作用就不在本文中相信介紹了。
但是钧舌,需要注意的是,上面的區(qū)域劃分只是邏輯區(qū)域撞牢,對(duì)于有些區(qū)域的限制是比較松的,所以不同的虛擬機(jī)廠商在實(shí)現(xiàn)上畜挥,甚至是同一款虛擬機(jī)的不同版本也是不盡相同的。
不同的虛擬機(jī)在實(shí)現(xiàn)運(yùn)行時(shí)內(nèi)存的時(shí)候有什么區(qū)別华糖?
前面提到過《Java虛擬機(jī)規(guī)范》定義的JVM運(yùn)行時(shí)所需的內(nèi)存區(qū)域客叉,不同的虛擬機(jī)實(shí)現(xiàn)上有所不同,而在這么多區(qū)域中向族,規(guī)范對(duì)于方法區(qū)的管理是最寬松的再扭,規(guī)范中關(guān)于這部分的描述如下:
方法區(qū)在虛擬機(jī)啟動(dòng)的時(shí)候創(chuàng)建,雖然方法區(qū)是堆的邏輯組成部分,但是簡(jiǎn)單的虛擬機(jī)實(shí)現(xiàn)可以選擇在這個(gè)區(qū)域不實(shí)現(xiàn)垃圾收集與壓縮区赵。本版本的規(guī)范也不限定實(shí)現(xiàn)方法區(qū)的內(nèi)存位置和代碼編譯的管理策略。方法區(qū)的容量可以是固定的,也可以隨著程序執(zhí)行的需求動(dòng)態(tài)擴(kuò)展摔踱,并在不需要過多的空間時(shí)自行收縮。方法區(qū)在實(shí)際內(nèi)存空間站可以是不連續(xù)的般眉。
這一規(guī)定柿汛,可以說是給了虛擬機(jī)廠商很大的自由。
虛擬機(jī)規(guī)范對(duì)方法區(qū)實(shí)現(xiàn)的位置并沒有明確要求貌笨,在最著名的HotSopt虛擬機(jī)實(shí)現(xiàn)中(在Java 8 之前)昌腰,方法區(qū)僅是邏輯上的獨(dú)立區(qū)域,在物理上并沒有獨(dú)立于堆而存在,而是位于永久代中祠汇。所以,這時(shí)候方法區(qū)也是可以被垃圾回收的。
實(shí)踐證明屿良,JVM中存在著大量的聲明短暫的對(duì)象,還有一些生命周期比較長(zhǎng)的對(duì)象。為了對(duì)他們采用不同的收集策略贰逾,采用了分代收集算法,所以HotSpot虛擬機(jī)把的根據(jù)對(duì)象的年齡不同,把堆分位新生代、老年代和永久代僻孝。
在Java 8中 舟扎,HotSpot虛擬機(jī)移除了永久代,使用本地內(nèi)存來存儲(chǔ)類元數(shù)據(jù)信息并稱之為:元空間(Metaspace)
運(yùn)行時(shí)數(shù)據(jù)區(qū)中哪些區(qū)域是線程共享的?哪些是獨(dú)享的?
在JVM運(yùn)行時(shí)內(nèi)存區(qū)域中痒钝,PC寄存器哪替、虛擬機(jī)棧和本地方法棧是線程獨(dú)享的晌块。
而Java堆、方法區(qū)是線程共享的靠汁。但是值得注意的是兄墅,Java堆其實(shí)還未每一個(gè)線程單獨(dú)分配了一塊TLAB空間沐悦,這部分空間在分配時(shí)是線程獨(dú)享的,在使用時(shí)是線程共享的。
除了JVM運(yùn)行時(shí)內(nèi)存以外淆储,還有什么區(qū)域可以用嗎?
除了我們前面介紹的虛擬機(jī)運(yùn)行時(shí)數(shù)據(jù)區(qū)以外,還有一部分內(nèi)存也被頻繁使用,他不是運(yùn)行時(shí)數(shù)據(jù)區(qū)的一部分,也不是Java虛擬機(jī)規(guī)范中定義的內(nèi)存區(qū)域珠十,他就是——直接內(nèi)存。
直接內(nèi)存的分配不受Java堆大小的限制,但是他還是會(huì)收到服務(wù)器總內(nèi)存的影響。
在JDK 1.4中引入的NIO中污桦,引入了一種基于Channel和Buffer的I/O方式,他可以使用Native函數(shù)直接分配堆外內(nèi)存顾稀,然后通過一個(gè)存儲(chǔ)在Java堆中的DirectByteBuffer對(duì)象作為這塊內(nèi)存的應(yīng)用進(jìn)行操作绍载。
堆和棧的區(qū)別是什么?
堆和棧(虛擬機(jī)棧)是完全不同的兩塊內(nèi)存區(qū)域蛀柴,一個(gè)是線程獨(dú)享的训貌,一個(gè)是線程共享的豺鼻,二者之間最大的區(qū)別就是存儲(chǔ)的內(nèi)容不同:
堆中主要存放對(duì)象實(shí)例。
棧(局部變量表)中主要存放各種基本數(shù)據(jù)類型、對(duì)象的引用。
Java中的數(shù)組是存儲(chǔ)在堆上還是棧上的?
在Java中欠啤,數(shù)組同樣是一個(gè)對(duì)象共郭,所以對(duì)象在內(nèi)存中如何存放同樣適用于數(shù)組写半;
所以年缎,數(shù)組的實(shí)例是保存在堆中蜕该,而數(shù)組的引用是保存在棧上的。
Java中的對(duì)象創(chuàng)建有多少種方式袜匿?
Java中有很多方式可以創(chuàng)建一個(gè)對(duì)象祭务,最簡(jiǎn)單的方式就是使用new關(guān)鍵字岩灭。
User user = new User();復(fù)制代碼
除此以外柱恤,還可以使用反射機(jī)制創(chuàng)建對(duì)象:
User user = User.class.newInstance();復(fù)制代碼
或者使用Constructor類的newInstance:
Constructor<User> constructor = User.class.getConstructor();User user = constructor.newInstance();復(fù)制代碼
除此之外還可以使用clone方法和反序列化的方式,這兩種方式不常用并且代碼比較復(fù)雜,就不在這里展示了,感興趣的可以自行了解下。
Java中對(duì)象創(chuàng)建的過程是怎么樣的获列?
對(duì)于一個(gè)普通的Java對(duì)象的創(chuàng)建鹏漆,大致過程如下:
1、虛擬機(jī)遇到new指令,到常量池定位到這個(gè)類的符號(hào)引用。
2朋譬、檢查符號(hào)引用代表的類是否被加載、解析、初始化過节槐。
3、虛擬機(jī)為對(duì)象分配內(nèi)存咆蒿。
4食茎、虛擬機(jī)將分配到的內(nèi)存空間都初始化為零值。
5、虛擬機(jī)對(duì)對(duì)象進(jìn)行必要的設(shè)置。
6买喧、執(zhí)行方法捻悯,成員變量進(jìn)行初始化。
Java中的對(duì)象一定在堆上分配內(nèi)存嗎岗喉?
前面我們說過,Java堆中主要保存了對(duì)象實(shí)例钱床,但是荚斯,隨著JIT編譯期的發(fā)展與逃逸分析技術(shù)逐漸成熟,棧上分配、標(biāo)量替換優(yōu)化技術(shù)將會(huì)導(dǎo)致一些微妙的變化事期,所有的對(duì)象都分配到堆上也漸漸變得不那么“絕對(duì)”了滥壕。
其實(shí),在編譯期間兽泣,JIT會(huì)對(duì)代碼做很多優(yōu)化绎橘。其中有一部分優(yōu)化的目的就是減少內(nèi)存堆分配壓力,其中一種重要的技術(shù)叫做逃逸分析唠倦。
如果JIT經(jīng)過逃逸分析称鳞,發(fā)現(xiàn)有些對(duì)象沒有逃逸出方法,那么有可能堆內(nèi)存分配會(huì)被優(yōu)化成棧內(nèi)存分配稠鼻。
10冈止、如何獲取堆和棧的dump文件?
Java Dump候齿,Java虛擬機(jī)的運(yùn)行時(shí)快照熙暴。將Java虛擬機(jī)運(yùn)行時(shí)的狀態(tài)和信息保存到文件。
可以使用在服務(wù)器上使用jmap命令來獲取堆dump慌盯,使用jstack命令來獲取線程的調(diào)用棧dump周霉。
來自:【https://juejin.im/post/5d4789afe51d453b386a62ac】
10 道基礎(chǔ)面試題
1.什么是B/S架構(gòu)?C/S架構(gòu)亚皂?
- B/S(Browser/Server)俱箱,瀏覽器/服務(wù)器程序;
- C/S(Client/Server)孕讳,客戶端/服務(wù)端匠楚,桌面應(yīng)用程序。
2.網(wǎng)絡(luò)協(xié)議有哪些厂财?
- HTTP:超文本傳輸協(xié)議芋簿;
- SMPT:簡(jiǎn)單郵件協(xié)議;
- TELNET:遠(yuǎn)程終端協(xié)議璃饱;
- POP3:郵件讀取協(xié)議 与斤;
- FTP:文件傳輸協(xié)議;
3. Java的四種引用及應(yīng)用場(chǎng)景荚恶?
- 強(qiáng)引用: 通常我們使用new操作符創(chuàng)建一個(gè)對(duì)象時(shí)所返回的引用即為強(qiáng)引用撩穿;
- 軟引用: 若一個(gè)對(duì)象只能通過軟引用到達(dá),那么這個(gè)對(duì)象在內(nèi)存不足時(shí)會(huì)被回收谒撼,可用于圖片緩存中食寡,內(nèi)存不足時(shí)系統(tǒng)會(huì)自動(dòng)回收不再使用的Bitmap;
- 弱引用: 若一個(gè)對(duì)象只能通過弱引用到達(dá)廓潜,那么它就會(huì)被回收(即使內(nèi)存充足)抵皱,同樣可用于圖片緩存中善榛,這時(shí)候只要Bitmap不再使用就會(huì)被回收;
- 虛引用: 虛引用是Java中最“弱”的引用呻畸,通過它甚至無法獲取被引用的對(duì)象移盆,它存在的唯一作用就是當(dāng)它指向的對(duì)象回收時(shí),本身會(huì)被加入到引用隊(duì)列中伤为,這樣我們可以知道它指向的對(duì)象何時(shí)被銷毀咒循。
4.Java是否需要開發(fā)人員回收內(nèi)存垃圾嗎?
多情況下是不需要绞愚。Java提供了一個(gè)系統(tǒng)級(jí)的線程來跟蹤內(nèi)存分配叙甸,不再使用的內(nèi)存區(qū)將會(huì)自動(dòng)回收。
5. ArrayList, Vector爽醋,LinkedList,的區(qū)別是什么蚁署?
- ArrayList: 內(nèi)部采用數(shù)組存儲(chǔ)元素便脊,支持高效隨機(jī)訪問蚂四,支持動(dòng)態(tài)調(diào)整大小哪痰;
- Vector: 可以看作線程安全版的ArrayList遂赠;
- LinkedList: 內(nèi)部采用鏈表來存儲(chǔ)元素,支持快速插入/刪除元素晌杰,但不支持高效地隨機(jī)訪問跷睦。
6.Java中的包裝類都是那些?
- byte:Byte肋演;
- short:Short抑诸;
- int:Integer;
- double:Double爹殊;
- char:Character蜕乡;
- boolean:Boolean;
- long:Long梗夸;
- float:Float层玲。
7. String, StringBuilder, StringBuffer的區(qū)別是什么?
- String: 不可變的字符序列反症,若要向其中添加新字符需要?jiǎng)?chuàng)建一個(gè)新的String對(duì)象辛块;
- StringBuilder: 可變字符序列,支持向其中添加新字符铅碍;
- StringBuffer: 可以看作線程安全版的StringBuilder润绵。
8.一個(gè)java類中包含那些內(nèi)容?
屬性胞谈、方法尘盼、內(nèi)部類士嚎、構(gòu)造方法、代碼塊悔叽。
9. 靜態(tài)內(nèi)部類與非靜態(tài)內(nèi)部類的區(qū)別
靜態(tài)內(nèi)部類不會(huì)持有外圍類的引用莱衩,而非靜態(tài)內(nèi)部類會(huì)隱式持有外圍類的一個(gè)引用。
10. Java中多態(tài)的實(shí)現(xiàn)原理
所謂多態(tài)娇澎,指的就是父類引用指向子類對(duì)象笨蚁,調(diào)用方法時(shí)會(huì)調(diào)用子類的實(shí)現(xiàn)而不是父類的實(shí)現(xiàn)。多態(tài)的實(shí)現(xiàn)的關(guān)鍵在于“動(dòng)態(tài)綁定”趟庄。
Java多線程基礎(chǔ)面試題
1括细、進(jìn)程是什么?
進(jìn)程是程序在處理機(jī)中的一次運(yùn)行戚啥。一個(gè)進(jìn)程既包括其所要執(zhí)行的指令奋单,也包括了執(zhí)行指令所需的系統(tǒng)資源,不同進(jìn)程所占用的系統(tǒng)資源相對(duì)獨(dú)立猫十。所以進(jìn)程是重量級(jí)的任務(wù)览濒,它們之間的通信和轉(zhuǎn)換都需要操作系統(tǒng)付出較大的開銷。
2拖云、線程是什么贷笛?
線程是進(jìn)程中的一個(gè)實(shí)體,是被系統(tǒng)獨(dú)立調(diào)度和分派的基本單位宙项。線程自己基本上不擁有系統(tǒng)資源乏苦,但它可以與同屬一個(gè)進(jìn)程的其他線程共享進(jìn)程所擁有的全部資源。所以線程是輕量級(jí)的任務(wù)尤筐,它們之間的通信和轉(zhuǎn)換只需要較小的系統(tǒng)開銷汇荐。
還有哪些常問的面試題呢?
1盆繁、并行和并發(fā)有什么區(qū)別掀淘?
答:兩者區(qū)別:一個(gè)是交替執(zhí)行,一個(gè)是同時(shí)執(zhí)行。
2改基、創(chuàng)建線程有哪幾種方式该默?
答:繼承Thread類护奈、實(shí)現(xiàn)Runnable接口和實(shí)現(xiàn)Callable<T>接口。
3、線程有哪些狀態(tài)具壮?
答:線程可以正在運(yùn)行(Running)之碗,只要獲得了CPU時(shí)間它就可以運(yùn)行坦刀;
運(yùn)行的線程可以被掛起(Suspend)虽填,并臨時(shí)中斷它的執(zhí)行;
一個(gè)掛起的線程可以被恢復(fù)(Resume)我衬,允許它從停止的地方繼續(xù)運(yùn)行叹放;
一個(gè)線程可以在等待資源時(shí)被阻塞(Block)饰恕;
在任何時(shí)候,線程可以被終止(Terminate)井仰,這將立即中斷運(yùn)行埋嵌。一旦終止,線程不能被恢復(fù)俱恶。
有的說六種的是算上初始的狀態(tài)雹嗦,即:初始(New):新創(chuàng)建了一個(gè)線程對(duì)象,但還沒有調(diào)用start()方法合是。
4了罪、sleep() 和 wait() 有什么區(qū)別?
答:(1)同步鎖的對(duì)待不同:
sleep()后聪全,程序并不會(huì)不釋放同步鎖泊藕。
wait()后,程序會(huì)釋放同步鎖难礼。
(2)用法的不同:
sleep()可以用時(shí)間指定來使他自動(dòng)醒過來娃圆。如果時(shí)間不到你只能調(diào)用interreput()來強(qiáng)行打斷。
wait()可以用notify()直接喚起鹤竭。
(3)屬于不同的類:
sleep()的類是Thread踊餐。
wait()的類是Object。
5臀稚、線程的 run()和 start()有什么區(qū)別?
答:調(diào)用start方法方可啟動(dòng)線程三痰,而run方法只是thread的一個(gè)普通方法調(diào)用吧寺,還是在主線程里執(zhí)行。
6散劫、什么是死鎖稚机?怎么防止死鎖?
答:當(dāng)某一進(jìn)程提出資源的使用要求后获搏,使得系統(tǒng)中一些進(jìn)程處于無休止的阻塞狀態(tài)赖条,在無外力的作用下,這些進(jìn)程永遠(yuǎn)也不能繼續(xù)前進(jìn)常熙。我們稱這種現(xiàn)象為死鎖纬乍。
(1) 盡量使用 tryLock(long timeout, TimeUnit unit)的方法(ReentrantLock、ReentrantReadWriteLock)裸卫,設(shè)置超時(shí)時(shí)間仿贬,超時(shí)可以退出防止死鎖。
(2)盡量使用 Java. util. concurrent 并發(fā)類代替自己手寫鎖墓贿。
(3)盡量降低鎖的使用粒度茧泪,盡量不要幾個(gè)功能用同一把鎖蜓氨。
(4)盡量減少同步的代碼塊。
7队伟、synchronized 和 ReentrantLock 區(qū)別是什么穴吹?
答:一個(gè)可重入的互斥鎖 Lock,它具有與使用 synchronized 方法和語句所訪問的隱式監(jiān)視器鎖相同的一些基本行為和語義嗜侮,但功能更強(qiáng)大刀荒。
ReentrantLock更加靈活,提供了超時(shí)獲取鎖棘钞,可中斷鎖缠借。提供了非公平鎖和非公平鎖,而synchronized僅僅是非公平鎖宜猜。
用法上泼返,ReentrantLock必須手動(dòng)釋放鎖,并且只能修飾代碼塊姨拥。而synchronized不用手動(dòng)釋放鎖绅喉,除此之外可以修飾方法。
使用synchronized的線程會(huì)被block住叫乌,而ReentrantLock的線程則是進(jìn)入waiting狀態(tài)柴罐。
阿里高級(jí)java面試題和答案
一面面試題目:
1、你比較了解的機(jī)器學(xué)習(xí)的算法有哪些憨奸,說一下這些算法的過程和區(qū)別
2革屠、網(wǎng)絡(luò)的體系結(jié)構(gòu)分為哪五層,每層分別有哪些協(xié)議
3排宰、TCP和UDP的區(qū)別是什么似芝,如果想發(fā)送即時(shí)消息應(yīng)該用哪種協(xié)議
4、TCP的連接建立和斷開的過程(三次握手和四次揮手)板甘,如何保證TCP發(fā)送的信息是正確的党瓮,且保證其先后順序不被篡改
5、對(duì)HTTP協(xié)議了解多少盐类,HTTP和HTTPS有什么區(qū)別寞奸,HTTPS的安全性是怎么實(shí)現(xiàn)的
6、平時(shí)用mysql用什么引擎
7在跳、數(shù)據(jù)庫事務(wù)的特性有哪些
8枪萄、事務(wù)并發(fā)可能會(huì)導(dǎo)致哪些問題,數(shù)據(jù)庫的隔離級(jí)別有哪些硬毕,mysql默認(rèn)的是哪種級(jí)別呻引,這種默認(rèn)的隔離級(jí)別能夠避免哪些問題(復(fù)習(xí)的太久了,有一些忘記了吐咳,這個(gè)問題居然答得不全)
9逻悠、如何判斷SQL查詢操作是不是慢sql元践,如何優(yōu)化
10、進(jìn)程和線程的區(qū)別童谒,進(jìn)程之間的通信方法
11单旁、死鎖是什么,處理死鎖的方法有哪些
12饥伊、進(jìn)程同步中的臨界區(qū)有什么處理方法
13象浑、spring MVC,spring AOP源碼
14琅豆、spring循環(huán)引用
15愉豺、spring事務(wù)傳播機(jī)制
16、java nio茫因,bio蚪拦,aio,操作系統(tǒng)底層nio實(shí)現(xiàn)原理
17冻押、java線程編程了解嗎驰贷?
18、hashmap的數(shù)據(jù)結(jié)構(gòu)是什么洛巢,具體是怎么實(shí)現(xiàn)的括袒,是不是線程安全的(不是),那么它的線程安全的替代有哪些稿茉?
二面面試題目和參考答案:
你在項(xiàng)目中遇到哪些有挑戰(zhàn)性的點(diǎn)锹锰?
參考:參與了秒殺的高并發(fā)項(xiàng)目。
1.流量在某一時(shí)刻暴漲狈邑,然后又猛跌如何應(yīng)對(duì)城须?
參考答案:
- 流量削峰填谷
- 在客戶端與服務(wù)器加入消息隊(duì)列作為緩存機(jī)制
- 接入層與各模塊都采用cache增加QPS
2.redis 消息隊(duì)列如何對(duì)過期信息/無效信息進(jìn)行刪除
參考答案:
- 添加過期時(shí)間上限
- 不同組團(tuán)信息采用不同隊(duì)列,當(dāng)該組團(tuán)滿額之后刪除隊(duì)列
3.redis 的持久化機(jī)制米苹?
參考答案:RDB和AOF
4. 為什么JAVA類加載要用雙親委派
實(shí)例:Object類唯一
5.怎么實(shí)現(xiàn)同步
- Synchronized關(guān)鍵字
- Volatile變量
- Lock對(duì)象
6. JAVA鎖有哪幾種
- Sychronized
- ReentrantLock
7. 兩種鎖的區(qū)別
- Synchronized 由JVM實(shí)現(xiàn)
- ReentrantLock 由JDK實(shí)現(xiàn)
6. 了解過AQS嗎?
- AQS(Abstract Queue Synchronizer)隊(duì)列同步器
- 由一個(gè)Valotaile變量標(biāo)記狀態(tài)State砰琢,以及一個(gè)CLH(同步蘸嘶、FIFO)隊(duì)列構(gòu)成
具體實(shí)現(xiàn)類:
- CountdownLatch: 等待多個(gè)線程完成;
- CyclicBarrier:同步屏障陪汽;
- Semaphore:控制并發(fā)線程數(shù)训唱。
7. 場(chǎng)景題:給一個(gè)方法加上超時(shí)異常
- 使用AspectJ進(jìn)行AOP開發(fā)
- 將方法調(diào)用進(jìn)行Around切入
- 采用Future對(duì)象創(chuàng)建一個(gè)線程,在調(diào)用方法同時(shí)進(jìn)行計(jì)時(shí)
- 若Future率先返回值則拋出超時(shí)異常
- 否則則正常調(diào)用
以上就是阿里大廠面試題挚冤,以下就是阿里大廠面試題的答案况增。
面試題答案,獲取方式
請(qǐng)加QQ群:976203838
獲取以上面試題答案?jìng)魉烷T:https://shimo.im/docs/R6zZRIikthw8jifV