面試相關(guān)--JAVA基礎(chǔ)部分

1.Java中的原始數(shù)據(jù)類型都有哪些脚仔,它們的大小及對(duì)應(yīng)的封裝類是什么?

數(shù)據(jù)類型 大小(字節(jié)) 內(nèi)存空間(8位等于1字節(jié)) 包裝類
byte 1 8位 Byte
char 2 16位 Character
short 2 16位 Short
int 4 32位 Integer
long 8 64位 Long
float 4 32位 Float
double 8 64位 Double
boolean - - Boolean
關(guān)于boolean的說(shuō)明:

boolean數(shù)據(jù)類型非true即false狂塘。這個(gè)數(shù)據(jù)類型表示1 bit的信息细移,但是它的大小并沒(méi)有精確定義拗引。
《Java虛擬機(jī)規(guī)范》中如是說(shuō):“雖然定義了boolean這種數(shù)據(jù)類型点把,但是只對(duì)它提供了非常有限的支持橘荠。在Java虛擬機(jī)中沒(méi)有任何供boolean值專用的字節(jié)碼指令,Java語(yǔ)言表達(dá)式所操作的boolean值郎逃,在編譯之后都使用Java虛擬機(jī)中的int數(shù)據(jù)類型來(lái)代替哥童,而boolean數(shù)組將會(huì)被編碼成Java虛擬機(jī)的byte數(shù)組,每個(gè)元素boolean元素占8位”褒翰。這樣我們可以得出boolean類型單獨(dú)使用是4個(gè)字節(jié)贮懈,在數(shù)組中又是1個(gè)字節(jié)。那虛擬機(jī)為什么要用int來(lái)代替boolean呢优训?為什么不用byte或short朵你,這樣不是更節(jié)省內(nèi)存空間嗎?實(shí)際上揣非,使用int的原因是抡医,對(duì)于當(dāng)下32位的CPU來(lái)說(shuō),一次進(jìn)行32位的數(shù)據(jù)交換更加高效早敬。
綜上忌傻,我們可以知道:官方文檔對(duì)boolean類型沒(méi)有給出精確的定義,《Java虛擬機(jī)規(guī)范》給出了“單獨(dú)時(shí)使用4個(gè)字節(jié)搞监,boolean數(shù)組時(shí)1個(gè)字節(jié)”的定義水孩,具體還要看虛擬機(jī)實(shí)現(xiàn)是否按照規(guī)范來(lái),所以1個(gè)字節(jié)琐驴、4個(gè)字節(jié)都是有可能的荷愕。這其實(shí)是一種時(shí)空權(quán)衡。

2.談一談”==“與”equals()"的區(qū)別棍矛。

《Think in Java》中說(shuō):“關(guān)系操作符生成的是一個(gè)boolean結(jié)果安疗,它們計(jì)算的是操作數(shù)的值之間的關(guān)系”。

  • "=="判斷的是兩個(gè)對(duì)象的內(nèi)存地址是否一樣够委,適用于原始數(shù)據(jù)類型和枚舉類型(它們的變量存儲(chǔ)的是值本身荐类,而引用類型變量存儲(chǔ)的是引用);
  • equals是Object類的方法茁帽,Object對(duì)它的實(shí)現(xiàn)是比較內(nèi)存地址玉罐,我們可以重寫這個(gè)方法來(lái)自定義“相等”這個(gè)概念。比如類庫(kù)中的String潘拨、Date等類就對(duì)這個(gè)方法進(jìn)行了重寫吊输。

綜上,對(duì)于枚舉類型和原始數(shù)據(jù)類型的相等性比較铁追,應(yīng)該使用"=="季蚂;對(duì)于引用類型的相等性比較,應(yīng)該使用equals方法。

3.Java中的四種引用及其應(yīng)用場(chǎng)景是什么扭屁?

  • 強(qiáng)引用: 通常我們使用new操作符創(chuàng)建一個(gè)對(duì)象時(shí)所返回的引用即為強(qiáng)引用算谈。如果一個(gè)對(duì)象具有強(qiáng)引用,那垃圾回收器絕不會(huì)回收它料滥。當(dāng)內(nèi)存空間不足然眼,JVM寧愿拋出OutOfMemoryError錯(cuò)誤,使程序異常終止葵腹,也不會(huì)靠隨意回收具有強(qiáng)引用的對(duì)象來(lái)解決內(nèi)存不足的問(wèn)題高每。

  • 軟引用: 若一個(gè)對(duì)象只能通過(guò)軟引用到達(dá),那么這個(gè)對(duì)象在內(nèi)存不足時(shí)會(huì)被回收践宴,可用于圖片緩存中鲸匿,內(nèi)存不足時(shí)系統(tǒng)會(huì)自動(dòng)回收不再使用的Bitmap

  • 弱引用: 若一個(gè)對(duì)象只能通過(guò)弱引用到達(dá),那么它就會(huì)被回收(即使內(nèi)存充足)浴井,同樣可用于圖片緩存中,這時(shí)候只要Bitmap不再使用就會(huì)被回收

  • 虛引用: 虛引用是Java中最“弱”的引用霉撵,通過(guò)它甚至無(wú)法獲取被引用的對(duì)象磺浙,它存在的唯一作用就是當(dāng)它指向的對(duì)象回收時(shí),它本身會(huì)被加入到引用隊(duì)列中徒坡,這樣我們可以知道它指向的對(duì)象何時(shí)被銷毀撕氧。

4.Object中定義了哪些方法?

Object是所有類的父類喇完,任何類都默認(rèn)繼承Object伦泥。

  • clone
    保護(hù)方法,實(shí)現(xiàn)對(duì)象的淺復(fù)制锦溪,只有實(shí)現(xiàn)了Cloneable接口才可以調(diào)用該方法不脯,否則拋出CloneNotSupportedException異常

  • equals
    在Object中與==是一樣的,子類一般需要重寫該方法

  • hashCode
    該方法用于哈希查找刻诊,重寫了equals方法一般都要重寫hashCode方法防楷。這個(gè)方法在一些具有哈希功能的Collection中用到

  • getClass
    final方法,獲得運(yùn)行時(shí)類型

  • wait
    使當(dāng)前線程等待該對(duì)象的鎖则涯,當(dāng)前線程必須是該對(duì)象的擁有者复局,也就是具有該對(duì)象的鎖。wait()方法一直等待粟判,直到獲得鎖或者被中斷亿昏。wait(long timeout)設(shè)定一個(gè)超時(shí)間隔,如果在規(guī)定時(shí)間內(nèi)沒(méi)有獲得鎖就返回档礁。
    調(diào)用該方法后當(dāng)前線程進(jìn)入睡眠狀態(tài)角钩,直到以下事件發(fā)生:

  1. 其他線程調(diào)用了該對(duì)象的notify方法
  2. 其他線程調(diào)用了該對(duì)象的notifyAll方法
  3. 其他線程調(diào)用了interrupt中斷該線程
  4. 時(shí)間間隔到了

此時(shí)該線程就可以被調(diào)度了,如果是被中斷的話就拋出一個(gè)InterruptedException異常

  • notify
    喚醒在該對(duì)象上等待的某個(gè)線程

  • notifyAll
    喚醒在該對(duì)象上等待的所有線程

  • toString
    轉(zhuǎn)換成字符串,一般子類都有重寫彤断,否則打印句柄

5.hashCode的作用是什么野舶?

什么是HashCode,總結(jié)幾個(gè)關(guān)鍵點(diǎn):

  1. HashCode的存在主要是為了查找的快捷性宰衙,HashCode是用來(lái)在散列存儲(chǔ)結(jié)構(gòu)中確定對(duì)象的存儲(chǔ)地址的
  2. 如果兩個(gè)對(duì)象equals相等平道,那么這兩個(gè)對(duì)象的HashCode一定也相同
  3. 如果對(duì)象的equals方法被重寫,那么對(duì)象的HashCode方法也盡量重寫
  4. 如果兩個(gè)對(duì)象的HashCode相同供炼,不代表兩個(gè)對(duì)象就相同一屋,只能說(shuō)明這兩個(gè)對(duì)象在散列存儲(chǔ)結(jié)構(gòu)中,存放于同一個(gè)位置

HashCode有什么用袋哼?舉個(gè)例子:

  1. 假設(shè)內(nèi)存中有0 1 2 3 4 5 6 7 8這8個(gè)位置冀墨,如果我有個(gè)字段叫做ID,那么我要把這個(gè)字段存放在以上8個(gè)位置之一涛贯,如果不用HashCode而任意存放诽嘉,那么當(dāng)查找時(shí)就需要到8個(gè)位置中去挨個(gè)查找
  2. 使用HashCode則效率會(huì)快很多,把ID的HashCode%8弟翘,然后把ID存放在取得余數(shù)的那個(gè)位置虫腋,然后每次查找該類的時(shí)候都可以通過(guò)ID的HashCode%8求余數(shù)直接找到存放的位置了
  3. 如果ID的HashCode%8算出來(lái)的位置上本身已經(jīng)有數(shù)據(jù)了怎么辦?這就取決于算法的實(shí)現(xiàn)了稀余,比如ThreadLocal中的做法就是從算出來(lái)的位置向后查找第一個(gè)為空的位置悦冀,放置數(shù)據(jù);HashMap的做法就是通過(guò)鏈?zhǔn)浇Y(jié)構(gòu)連起來(lái)睛琳。反正盒蟆,只要保證放的時(shí)候和取的時(shí)候的算法一致就行了。
  4. 如果ID的HashCode%8相等怎么辦(這種對(duì)應(yīng)的是第三點(diǎn)說(shuō)的鏈?zhǔn)浇Y(jié)構(gòu)的場(chǎng)景)师骗?這時(shí)候就需要定義equals了历等。先通過(guò)HashCode%8來(lái)判斷類在哪一個(gè)位置,再通過(guò)equals來(lái)在這個(gè)位置上尋找需要的類辟癌。對(duì)比兩個(gè)類的時(shí)候也差不多募闲,先通過(guò)HashCode比較,假如HashCode相等再判斷equals愿待。如果兩個(gè)類的HashCode都不相同浩螺,那么這兩個(gè)類必定是不同的

具體可以看以下文章:
談?wù)凥ashCode的作用
散列表的原理與實(shí)現(xiàn)

6.ArrayList, LinkedList, Vector的區(qū)別是什么仍侥?

  • ArrayList: 內(nèi)部采用數(shù)組存儲(chǔ)元素要出,支持高效隨機(jī)訪問(wèn),支持動(dòng)態(tài)調(diào)整大小

  • LinkedList: 內(nèi)部采用鏈表來(lái)存儲(chǔ)元素农渊,支持快速插入/刪除元素患蹂,但不支持高效地隨機(jī)訪問(wèn)

  • Vector: 可以看作線程安全版的ArrayList

7.String, StringBuilder, StringBuffer的區(qū)別是什么或颊?

  • String: 不可變的字符序列,若要向其中添加新字符需要?jiǎng)?chuàng)建一個(gè)新的String對(duì)象

  • StringBuilder: 可變字符序列传于,支持向其中添加新字符(無(wú)需創(chuàng)建新對(duì)象)

  • StringBuffer: 可以看作線程安全版的StringBuilder

8.Map, Set, List, Queue囱挑、Stack的特點(diǎn)及用法。

  • Map<K, V>: Java中存儲(chǔ)鍵值對(duì)的數(shù)據(jù)類型都實(shí)現(xiàn)了這個(gè)接口沼溜,表示“映射表”平挑。支持的兩個(gè)核心操作是get(Object key)以及put(K key, V value),分別用來(lái)獲取鍵對(duì)應(yīng)的值以及向映射表中插入鍵值對(duì)系草。

  • Set<E>: 實(shí)現(xiàn)了這個(gè)接口的集合類型中不允許存在重復(fù)的元素通熄,代表數(shù)學(xué)意義上的“集合”。它所支持的核心操作有add(E e),remove(Object o), contains(Object o)找都,分別用于添加元素唇辨,刪除元素以及判斷給定元素是否存在于集中。

  • List<E>: Java中集合框架中的列表類型都實(shí)現(xiàn)了這個(gè)接口能耻,表示一種有序序列赏枚。支持get(int index), add(E e)等操作。

  • Queue<E>: Java集合框架中的隊(duì)列接口晓猛,代表了“先進(jìn)先出”隊(duì)列饿幅。支持add(E element), remove()等操作。

  • Stack<E>: Java集合框架中表示堆棧的數(shù)據(jù)類型鞍帝,堆棧是一種“后進(jìn)先出”的數(shù)據(jù)結(jié)構(gòu)诫睬。支持push(E item), pop()等操作煞茫。

9.HashMap和HashTable的區(qū)別帕涌。

  • HashMap是非線程安全的,HashTable是線程安全的续徽。

  • HashMap的鍵和值都允許有null值存在蚓曼,而HashTable則不行。

  • 因?yàn)榫€程安全的問(wèn)題钦扭,HashMap效率比HashTable的要高纫版。

詳細(xì)分析請(qǐng)參考深入解析HashMap、HashTable

10.HashMap的實(shí)現(xiàn)原理客情。

簡(jiǎn)單說(shuō)其弊,HashMap就是將key做hash算法,然后將hash所對(duì)應(yīng)的數(shù)據(jù)映射到內(nèi)存地址膀斋,直接取得key所對(duì)應(yīng)的數(shù)據(jù)梭伐。在HashMap中。底層數(shù)據(jù)結(jié)構(gòu)使用的是數(shù)組仰担,所謂的內(nèi)存地址即數(shù)組的下標(biāo)索引糊识。HashMap的高性能需要保證以下幾點(diǎn):

  • hash算法必須高效
  • hash值到內(nèi)存地址(數(shù)組索引)的算法是快速的
  • 根據(jù)內(nèi)存地址(數(shù)組索引)可以直接取得對(duì)應(yīng)的值

具體可參考從源碼分析HashMap

11.ConcurrentHashMap的實(shí)現(xiàn)原理

ConcurrentHashMap是支持并發(fā)讀寫的HashMap,它的特點(diǎn)是讀取數(shù)據(jù)時(shí)無(wú)需加鎖,寫數(shù)據(jù)時(shí)可以保證加鎖粒度盡可能的小赂苗。由于其內(nèi)部采用“分段存儲(chǔ)”愉耙,只需對(duì)要進(jìn)行寫操作的數(shù)據(jù)所在的“段”進(jìn)行加鎖。關(guān)于ConcurrentHashMap底層實(shí)現(xiàn)的詳細(xì)分析請(qǐng)參考Java并發(fā)編程:并發(fā)容器之ConcurrentHashMap

12.TreeMap, LinkedHashMap, HashMap的區(qū)別是什么拌滋?

  • HashMap的底層實(shí)現(xiàn)是散列表朴沿,因此它內(nèi)部存儲(chǔ)的元素是無(wú)序的;

  • TreeMap的底層實(shí)現(xiàn)是紅黑樹(shù)鸠真,所以它內(nèi)部的元素的有序的悯仙。排序的依據(jù)是自然序或者是創(chuàng)建TreeMap時(shí)所提供的比較器(Comparator)對(duì)象。

  • LinkedHashMap可以看作能夠記住插入元素的順序的HashMap吠卷。

13.Collection與Collections的區(qū)別是什么锡垄?

Collection是一個(gè)接口,它是Set祭隔、List等容器的父接口货岭;Collections是一個(gè)工具類,提供了一系列的靜態(tài)方法來(lái)輔助容器操作疾渴,這些方法包括對(duì)容器的搜索千贯、排序、線程安全化等等搞坝。

14.Set搔谴、List、Map之間的區(qū)別是什么?

Collection是最基本的集合接口,Set 和List 都繼承了Conllection,Map沒(méi)有桩撮。

  • Set是最簡(jiǎn)單的一種集合敦第。集合中的對(duì)象不按特定的方式排序,并且沒(méi)有重復(fù)對(duì)象店量。
  • List的特征是其元素以線性方式存儲(chǔ)芜果,集合中可以存放重復(fù)對(duì)象。
  • Map 是一種把鍵對(duì)象和值對(duì)象映射的集合融师,它的每一個(gè)元素都包含一對(duì)鍵對(duì)象和值對(duì)象右钾。

詳細(xì)可參考java 中的Set,List,Map

15.特殊關(guān)鍵字:final

  • 可以修飾類、函數(shù)旱爆、變量舀射;
  • 被final修飾的類不可以被繼承。為了避免被繼承怀伦,被子類復(fù)寫脆烟。final class Demo { }
  • 被final修飾的方法不可以被復(fù)寫。final void show () { }
  • 被final 修飾的變量是一個(gè)常量空镜,只能賦值一次浩淘。
  • 內(nèi)部類定義在類中的局部位置上時(shí)捌朴,只能訪問(wèn)該局部被final修飾的局部變量。

16.Switch能否用string做參數(shù)张抄?

在Java7之前砂蔽,switch只支持byte、short署惯、char左驾、int及其對(duì)應(yīng)的封裝類,以及Enum類型极谊,在Java 7中诡右,String類型被加上。

17.對(duì)于“try-catch-finally”轻猖,若try語(yǔ)句塊中包含“return”語(yǔ)句帆吻,finally語(yǔ)句塊會(huì)執(zhí)行嗎?

答案是會(huì)執(zhí)行咙边。只有兩種情況finally塊中的語(yǔ)句不會(huì)被執(zhí)行:

  • 調(diào)用了System.exit()方法猜煮;

  • JVM“崩潰”了。

18.泛型的優(yōu)缺點(diǎn)

優(yōu)點(diǎn):

使用泛型類型可以最大限度地重用代碼败许、保護(hù)類型的安全以及提高性能王带。

泛型最常見(jiàn)的用途是創(chuàng)建集合類。

缺點(diǎn):

在性能上不如數(shù)組快市殷。

19.Java中的異常層次結(jié)構(gòu)

Java中的異常層次結(jié)構(gòu)如下圖所示:


java中的異常

我們可以看到Throwable類是異常層級(jí)中的基類愕撰。Error類表示內(nèi)部錯(cuò)誤,這類錯(cuò)誤使我們無(wú)法控制的醋寝;Exception表示異常搞挣,RuntimeException及其子類屬于未檢查異常,這類異常包括ArrayIndexOutOfBoundsException甥桂、NullPointerException等柿究,我們應(yīng)該通過(guò)條件判斷等方式語(yǔ)句避免未檢查異常的發(fā)生邮旷。IOException及其子類屬于已檢查異常黄选,編譯器會(huì)檢查我們是否為所有可能拋出的已檢查異常提供了異常處理器,若沒(méi)有則會(huì)報(bào)錯(cuò)婶肩。對(duì)于未檢查異常办陷,我們無(wú)需捕獲(當(dāng)然Java也允許我們捕獲,但我們應(yīng)該做的事避免未檢查異常的發(fā)生)律歼。

20.Interface與abstract類的區(qū)別民镜。

抽象類和接口都不能夠?qū)嵗梢远x抽象類和接口類型的引用险毁。一個(gè)類如果繼承了某個(gè)抽象類或者實(shí)現(xiàn)了某個(gè)接口都需要對(duì)其中的抽象方法全部進(jìn)行實(shí)現(xiàn)制圈,否則該類仍然需要被聲明為抽象類们童。接口比抽象類更加抽象,因?yàn)槌橄箢愔锌梢远x構(gòu)造器鲸鹦,可以有抽象方法和具體方法慧库,而接口中不能定義構(gòu)造器而且其中的方法全部都是抽象方法。抽象類中的成員可以是private馋嗜、默認(rèn)齐板、protected、public的葛菇,而接口中的成員全都是public的甘磨。抽象類中可以定義成員變量,而接口中定義的成員變量實(shí)際上都是常量眯停。有抽象方法的類必須被聲明為抽象類济舆,而抽象類未必要有抽象方法。

21.Java面向?qū)ο蟮娜齻€(gè)特征與含義莺债。

三大特征:封裝吗冤、繼承、多態(tài)九府。

  • 繼承
    (1)繼承是一種聯(lián)結(jié)類的層次模型椎瘟,并且允許和鼓勵(lì)類的重用,它提供了一種明確表述共性的方法侄旬。
    (2)對(duì)象的一個(gè)新類可以從現(xiàn)有的類中派生肺蔚,這個(gè)過(guò)程稱為類繼承,新類繼承了原始類的特性儡羔,新類稱為原始類的派生類(子類)宣羊,而原始類稱為新類的基類(父類)。
    (3)派生類可以從它的基類那里繼承方法和實(shí)例變量汰蜘,并且類可以修改或增加新的方法使之更適合特殊的需要仇冯。
  • 封裝
    封裝是把過(guò)程和數(shù)據(jù)包圍起來(lái),對(duì)數(shù)據(jù)的訪問(wèn)只能通過(guò)已定義的界面族操。面向?qū)ο笥?jì)算始于這個(gè)基本概念苛坚,即現(xiàn)實(shí)世界可以被描繪成一系列完全自治、封裝的對(duì)象色难,這些對(duì)象通過(guò)一個(gè)受保護(hù)的接口訪問(wèn)其他對(duì)象泼舱。
  • 多態(tài)性
    (1)多態(tài)性是指允許不同類的對(duì)象對(duì)同一消息作出響應(yīng)。
    (2)多態(tài)性包括參數(shù)化多態(tài)性和包含多態(tài)性枷莉。
    (3)多態(tài)性語(yǔ)言具有靈活娇昙、抽象、行為共享笤妙、代碼共享的優(yōu)勢(shì)冒掌,很好的解決了應(yīng)用程序函數(shù)同名問(wèn)題噪裕。

22.Override, Overload的含義與區(qū)別。

  • Override表示“重寫”股毫,是子類對(duì)父類中同一方法的重新定義

  • Overload表示“重載”州疾,也就是定義一個(gè)與已定義方法名稱相同但簽名不同的新方法

23.接口與抽象類的區(qū)別

接口是一種約定,實(shí)現(xiàn)接口的類要遵循這個(gè)約定皇拣;抽象類本質(zhì)上是一個(gè)類严蓖,使用抽象類的代價(jià)要比接口大。接口與抽象類的對(duì)比如下:

  • 抽象類中可以包含屬性氧急,方法(包含抽象方法與有著具體實(shí)現(xiàn)的方法)颗胡,常量;接口只能包含常量和方法聲明吩坝。

  • 抽象類中的方法和成員變量可以定義可見(jiàn)性(比如public毒姨、private等);而接口中的方法只能為public(缺省為public)钉寝。

  • 一個(gè)子類只能有一個(gè)父類(具體類或抽象類)弧呐;而一個(gè)接口可以繼承一個(gè)多個(gè)接口,一個(gè)類也可以實(shí)現(xiàn)多個(gè)接口嵌纲。

  • 子類中實(shí)現(xiàn)父類中的抽象方法時(shí)俘枫,可見(jiàn)性可以大于等于父類中的;而接口實(shí)現(xiàn)類中的接口 方法的可見(jiàn)性只能與接口中相同(public)逮走。

24.靜態(tài)內(nèi)部類與非靜態(tài)內(nèi)部類的區(qū)別鸠蚪。

內(nèi)部靜態(tài)類不需要有指向外部類的引用。但非靜態(tài)內(nèi)部類需要持有對(duì)外部類的引用师溅。非靜態(tài)內(nèi)部類能夠訪問(wèn)外部類的靜態(tài)和非靜態(tài)成員茅信。靜態(tài)類不能訪問(wèn)外部類的非靜態(tài)成員。他只能訪問(wèn)外部類的靜態(tài)成員墓臭。一個(gè)非靜態(tài)內(nèi)部類不能脫離外部類實(shí)體被創(chuàng)建蘸鲸,一個(gè)非靜態(tài)內(nèi)部類可以訪問(wèn)外部類的數(shù)據(jù)和方法,因?yàn)樗驮谕獠款惱锩妗?/p>

25.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)綁定”妙痹。詳細(xì)介紹請(qǐng)戳Java動(dòng)態(tài)綁定的內(nèi)部實(shí)現(xiàn)機(jī)制

  • Java方法的存儲(chǔ)機(jī)制
    當(dāng)JVM執(zhí)行Java字節(jié)碼時(shí)铸史,類型信息會(huì)存儲(chǔ)在方法區(qū)中鼻疮,為了優(yōu)化對(duì)象的調(diào)用方法的速度,方法區(qū)的類型信息會(huì)增加一個(gè)指針琳轿,該指針指向一個(gè)記錄該類方法的方法表判沟,方法表中的每一個(gè)項(xiàng)都是對(duì)應(yīng)方法的指針耿芹。

    方法區(qū):方法區(qū)和JAVA堆一樣,是各個(gè)線程共享的內(nèi)存區(qū)域挪哄,用于存儲(chǔ)已被虛擬機(jī)加載的類信息吧秕、常量、靜態(tài)變量迹炼、即時(shí)編譯器編譯后的代碼等數(shù)據(jù)砸彬。 運(yùn)行時(shí)常量池:它是方法區(qū)的一部分,Class文件中除了有類的版本斯入、方法砂碉、字段等描述信息外,還有一項(xiàng)信息是常量池刻两,用于存放編譯器生成的各種符號(hào)引用增蹭,這部分信息在類加載時(shí)進(jìn)入方法區(qū)的運(yùn)行時(shí)常量池中。 方法區(qū)的內(nèi)存回收目標(biāo)是針對(duì)常量池的回收及對(duì)類型的卸載磅摹。

  • 方法表的構(gòu)造
    由于java的單繼承機(jī)制滋迈,一個(gè)類只能繼承一個(gè)父類,而所有的類又都繼承Object類户誓,方法表中最先存放的是Object的方法饼灿,接下來(lái)是父類的方法,最后是該類本身的方法帝美。如果子類改寫了父類的方法赔退,那么子類和父類的那些同名的方法共享一個(gè)方法表項(xiàng)。

    由于這樣的特性证舟,使得方法表的偏移量總是固定的硕旗,例如,對(duì)于任何類來(lái)說(shuō)女责,其方法表的equals方法的偏移量總是一個(gè)定值漆枚,所有繼承父類的子類的方法表中,其父類所定義的方法的偏移量也總是一個(gè)定值抵知。

  • 實(shí)例
    假設(shè)Class A是Class B的子類墙基,并且A改寫了B的方法的method(),那么B來(lái)說(shuō)刷喜,method方法的指針指向B的method方法入口残制;對(duì)于A來(lái)說(shuō),A的方法表的method項(xiàng)指向自身的method而非父類的掖疮。

    流程:調(diào)用方法時(shí)初茶,虛擬機(jī)通過(guò)對(duì)象引用得到方法區(qū)中類型信息的方法表的指針入口,查詢類的方法表 浊闪,根據(jù)實(shí)例方法的符號(hào)引用解析出該方法在方法表的偏移量恼布,子類對(duì)象聲明為父類類型時(shí)螺戳,形式上調(diào)用的是父類的方法,此時(shí)虛擬機(jī)會(huì)從實(shí)際的方法表中找到方法地址折汞,從而定位到實(shí)際類的方法倔幼。 注:所有引用為父類,但方法區(qū)的類型信息中存放的是子類的信息爽待,所以調(diào)用的是子類的方法表损同。

詳細(xì)可查看JAVA多態(tài)的實(shí)現(xiàn)原理(JVM實(shí)現(xiàn)方式)

26.簡(jiǎn)述Java中創(chuàng)建新線程的兩種方法。

  • 繼承Thread類(假設(shè)子類為MyThread)鸟款,并重寫run()方法揖庄,然后new一個(gè)MyThread對(duì)象并對(duì)其調(diào)用start()即可啟動(dòng)新線程。

  • 實(shí)現(xiàn)Runnable接口(假設(shè)實(shí)現(xiàn)類為MyRunnable)欠雌,而后將MyRunnable對(duì)象作為參數(shù)傳入Thread構(gòu)造器蹄梢,在得到的Thread對(duì)象上調(diào)用start()方法即可。

實(shí)現(xiàn)方式和繼承方式有什么區(qū)別富俄?

  • 實(shí)現(xiàn)方式相比繼承方式的好處: 避免了單繼承的局限性(單繼承只能繼承一個(gè)父類)禁炒。在定義線程時(shí),建議使用實(shí)現(xiàn)方式霍比。
  • 存放代碼的位置不一樣:
    繼承Thread: 線程代碼存放Thread子類的run方法中幕袱。
    實(shí)現(xiàn)Runnable: 線程代碼存在接口的子類的run方法。

27.簡(jiǎn)述Java中進(jìn)行線程同步的方法悠瞬。

  • volatile: Java Memory Model保證了對(duì)同一個(gè)volatile變量的寫happens before對(duì)它的讀们豌;

  • synchronized: 可以來(lái)對(duì)一個(gè)代碼塊或是對(duì)一個(gè)方法上鎖,被“鎖住”的地方稱為臨界區(qū)浅妆,進(jìn)入臨界區(qū)的線程會(huì)獲取對(duì)象的monitor望迎,這樣其他嘗試進(jìn)入臨界區(qū)的線程會(huì)因無(wú)法獲取monitor而被阻塞。由于等待另一個(gè)線程釋放monitor而被阻塞的線程無(wú)法被中斷凌外。

  • ReentrantLock: 嘗試獲取鎖的線程可以被中斷并可以設(shè)置超時(shí)參數(shù)辩尊。

28.簡(jiǎn)述Java中具有哪幾種粒度的鎖

Java中可以對(duì)類、對(duì)象康辑、方法或是代碼塊上鎖摄欲。

更加詳細(xì)的介紹請(qǐng)查看:Java核心技術(shù)點(diǎn)之多線程

29.給出“生產(chǎn)者-消費(fèi)者”問(wèn)題的一種解決方案。

public class BlockingQueueTest {
    
    private int size = 20;    
    private ArrayBlockingQueue<Integer> blockingQueue = new ArrayBlockingQueue<>(size); 
       
    public static void main(String[] args)  { 
            BlockingQueueTest test = new BlockingQueueTest();        
            Producer producer = test.new Producer();        Consumer consumer = test.new Consumer();                   producer.start();        
            consumer.start();    
    }
        
    class Consumer extends Thread{
        
        @Override        
        public void run() {             
            while(true){                
                try {                    
                    //從阻塞隊(duì)列中取出一個(gè)元素
                    queue.take();                    
                    System.out.println("隊(duì)列剩余" + queue.size() + "個(gè)元素");                
                } catch (InterruptedException e) {                                  
                }            
            }        
        }    
    } 
       
    class Producer extends Thread{                  

        @Override
        public void run() {            
            while (true) {                
                try {                    
                    //向阻塞隊(duì)列中插入一個(gè)元素    
                    queue.put(1);                    
                    System.out.println("隊(duì)列剩余空間:" + (size - queue.size()));                
                } catch (InterruptedException e) {                              
                }            
            }        
        }    
    }

}

30.ThreadLocal的設(shè)計(jì)理念與作用疮薇。

ThreadLocal的作用是提供線程內(nèi)的局部變量胸墙,在多線程環(huán)境下訪問(wèn)時(shí)能保證各個(gè)線程內(nèi)的ThreadLocal變量各自獨(dú)立。也就是說(shuō)按咒,每個(gè)線程的ThreadLocal變量是自己專用的迟隅,其他線程是訪問(wèn)不到的。ThreadLocal最常用于以下這個(gè)場(chǎng)景:多線程環(huán)境下存在對(duì)非線程安全對(duì)象的并發(fā)訪問(wèn),而且該對(duì)象不需要在線程間共享玻淑,但是我們不想加鎖嗽冒,這時(shí)候可以使用ThreadLocal來(lái)使得每個(gè)線程都持有一個(gè)該對(duì)象的副本呀伙。
關(guān)于ThreadLocal的實(shí)現(xiàn)原理分析請(qǐng)戳深入剖析ThreadLocal

31.concurrent包的整體架構(gòu)补履。

concurrent包的整體架構(gòu)

32.ArrayBlockingQueue, CountDownLatch類的作用.

  • CountDownLatch: 允許線程集等待直到計(jì)數(shù)器為0。適用場(chǎng)景: 當(dāng)一個(gè)或多個(gè)線程需要等待指定數(shù)目的事件發(fā)生后再繼續(xù)執(zhí)行剿另。

  • ArrayBlockingQueue: 一個(gè)基于數(shù)組實(shí)現(xiàn)的阻塞隊(duì)列箫锤,它在構(gòu)造時(shí)需要指定容量。當(dāng)試圖向滿隊(duì)列中添加元素或者從空隊(duì)列中移除元素時(shí)雨女,當(dāng)前線程會(huì)被阻塞谚攒。通過(guò)阻塞隊(duì)列,我們可以按以下模式來(lái)工作:工作者線程可以周期性的將中間結(jié)果放入阻塞隊(duì)列中氛堕,其它線程可以取出中間結(jié)果并進(jìn)行進(jìn)一步操作馏臭。若工作者線程的執(zhí)行比較慢(還沒(méi)來(lái)得及向隊(duì)列中插入元素),其他從隊(duì)列中取元素的線程會(huì)等待它(試圖從空隊(duì)列中取元素從而阻塞)讼稚;若工作者線程執(zhí)行較快(試圖向滿隊(duì)列中插入元素)括儒,則它會(huì)等待其它線程取出元素再繼續(xù)執(zhí)行。

33.wait()锐想,sleep() 的區(qū)別

  • wait(): Object類中定義的實(shí)例方法帮寻。在指定對(duì)象上調(diào)用wait方法會(huì)讓當(dāng)前線程進(jìn)入等待狀態(tài)(前提是當(dāng)前線程持有該對(duì)象的monitor),此時(shí)當(dāng)前線程會(huì)釋放相應(yīng)對(duì)象的monitor赠摇,這樣一來(lái)其它線程便有機(jī)會(huì)獲取這個(gè)對(duì)象的monitor了固逗。當(dāng)其它線程獲取了這個(gè)對(duì)象的monitor并進(jìn)行了所需操作時(shí),便可以調(diào)用notify方法喚醒之前進(jìn)入等待狀態(tài)的線程藕帜。

  • sleep(): Thread類中的靜態(tài)方法烫罩,作用是讓當(dāng)前線程進(jìn)入休眠狀態(tài),以便讓其他線程有機(jī)會(huì)執(zhí)行洽故。進(jìn)入休眠狀態(tài)的線程不會(huì)釋放它所持有的鎖嗡髓。

34.線程池的用法與優(yōu)勢(shì)

  • 優(yōu)勢(shì): 實(shí)現(xiàn)對(duì)線程的復(fù)用,避免了反復(fù)創(chuàng)建及銷毀線程的開(kāi)銷收津;使用線程池統(tǒng)一管理線程可以減少并發(fā)線程的數(shù)目饿这,而線程數(shù)過(guò)多往往會(huì)在線程上下文切換上以及線程同步上浪費(fèi)過(guò)多時(shí)間秧耗。

  • 用法: 我們可以調(diào)用ThreadPoolExecutor的某個(gè)構(gòu)造方法來(lái)自己創(chuàng)建一個(gè)線程池抓韩。但通常情況下我們可以使用Executors類提供給我們的靜態(tài)工廠方法來(lái)更方便的創(chuàng)建一個(gè)線程池對(duì)象。創(chuàng)建了線程池對(duì)象后放祟,我們就可以調(diào)用submit方法提交任務(wù)到線程池中去執(zhí)行了吻贿;線程池使用完畢后我們要記得調(diào)用shutdown方法來(lái)關(guān)閉它串结。

關(guān)于線程池的詳細(xì)介紹以及實(shí)現(xiàn)原理分析請(qǐng)查看:深入理解java線程池—ThreadPoolExecutor

35.for-each與常規(guī)for循環(huán)的效率對(duì)比

關(guān)于這個(gè)問(wèn)題我們直接看《Effective Java》給我們做的解答:
for-each能夠讓代碼更加清晰,并且減少了出錯(cuò)的機(jī)會(huì)。下面的慣用代碼適用于集合與數(shù)組類型:

for (Element e : elements) {
    doSomething(e);
}

使用for-each循環(huán)與常規(guī)的for循環(huán)相比肌割,并不存在性能損失卧蜓,即使對(duì)數(shù)組進(jìn)行迭代也是如此。實(shí)際上把敞,在有些場(chǎng)合下它還能帶來(lái)微小的性能提升弥奸,因?yàn)樗挥?jì)算一次數(shù)組索引的上限。

36.簡(jiǎn)述Java IO與NIO的區(qū)別

  • Java IO是面向流的奋早,這意味著我們需要每次從流中讀取一個(gè)或多個(gè)字節(jié)盛霎,直到讀取完所有字節(jié);NIO是面向緩沖的耽装,也就是說(shuō)會(huì)把數(shù)據(jù)讀取到一個(gè)緩沖區(qū)中愤炸,然后對(duì)緩沖區(qū)中的數(shù)據(jù)進(jìn)行相應(yīng)處理。

  • Java IO是阻塞IO掉奄,而NIO是非阻塞IO规个。

  • Java NIO中存在一個(gè)稱為選擇器(selector)的東西,它允許你把多個(gè)通道(channel)注冊(cè)到一個(gè)選擇器上姓建,然后使用一個(gè)線程來(lái)監(jiān)視這些通道:若這些通道里有某個(gè)準(zhǔn)備好可以開(kāi)始進(jìn)行讀或?qū)懖僮髁说郑瑒t開(kāi)始對(duì)相應(yīng)的通道進(jìn)行讀寫。而在等待某通道變?yōu)榭勺x/寫期間引瀑,請(qǐng)求對(duì)通道進(jìn)行讀寫操作的線程可以去干別的事情狂芋。

更進(jìn)一步的說(shuō)明請(qǐng)查看:Java NIO與IO

37.父類的靜態(tài)方法能否被子類重寫,為什么憨栽?

父類的靜態(tài)方法可以被子類繼承帜矾,也就是說(shuō)子類可以調(diào)用父類的靜態(tài)方法,但是不能重寫。
可以寫個(gè)例子進(jìn)行驗(yàn)證:

父類代碼:
public class Fu {  

    public static void show() {  

        System.out.println("父類的靜態(tài)方法");  

    }  

    public void method() {  

        System.out.println("父類的普通方法");  

    }  

}

子類代碼:
public class Zi extends Fu {  
    public static void main(String[] args) {  
        Fu fu = new Zi();  
        fu.show();  
        fu.method();  
    }  
    public static void show() {  
        System.out.println("子類的靜態(tài)方法");  
    }  
    public void method() {  
        System.out.println("子類的普通方法");  
    }  
      
}  

輸出的結(jié)果是:
  父類的靜態(tài)方法
  子類的普通方法

38.反射的作用與原理

JAVA反射機(jī)制是在運(yùn)行狀態(tài)中, 對(duì)于任意一個(gè)類, 都能夠知道這個(gè)類的所有屬性和方法; 對(duì)于任意一個(gè)對(duì)象, 都能夠調(diào)用它的任意一個(gè)方法和屬性; 這種動(dòng)態(tài)獲取的信息以及動(dòng)態(tài)調(diào)用對(duì)象的方法的功能稱為java語(yǔ)言的反射機(jī)制.

主要作用有三:

  • 運(yùn)行時(shí)取得類的方法和字段的相關(guān)信息屑柔。
  • 創(chuàng)建某個(gè)類的新實(shí)例(.newInstance())
  • 取得字段引用直接獲取和設(shè)置對(duì)象字段屡萤,無(wú)論訪問(wèn)修飾符是什么。

用處如下:

  • 觀察或操作應(yīng)用程序的運(yùn)行時(shí)行為掸宛。
  • 調(diào)試或測(cè)試程序死陆,因?yàn)榭梢灾苯釉L問(wèn)方法、構(gòu)造函數(shù)和成員字段唧瘾。
  • 通過(guò)名字調(diào)用不知道的方法并使用該信息來(lái)創(chuàng)建對(duì)象和調(diào)用方法措译。

39.Java中的泛型機(jī)制

泛型:JDK1.5版本以后出現(xiàn)的新特性,用于解決安全問(wèn)題饰序,是一個(gè)類型安全機(jī)制领虹。
其好處是:

  • 將運(yùn)行時(shí)期出現(xiàn)的問(wèn)題CLassCastException(類型匹配異常),轉(zhuǎn)移到了編譯時(shí)期,方便與程序員解決問(wèn)題求豫,讓運(yùn)行時(shí)期問(wèn)題減少塌衰,安全了诉稍。
  • 避免了強(qiáng)制類型轉(zhuǎn)換,且運(yùn)行時(shí)不會(huì)提示程序類型沒(méi)檢查的不安全提示最疆。

泛型技術(shù)是給編譯器使用的技術(shù),用于編譯時(shí)期杯巨。確保了類型的安全。 運(yùn)行時(shí)努酸,會(huì)將泛型去掉服爷,生成的class文件中是不帶泛型的,這個(gè)稱為泛型的擦除。 為什么擦除呢蚊逢?因?yàn)闉榱思嫒葸\(yùn)行的類加載器层扶。 泛型的補(bǔ)償:在類加載器原有基礎(chǔ)上箫章,編寫一個(gè)補(bǔ)償程序烙荷。在運(yùn)行時(shí),通過(guò)反射檬寂, 獲取元素的類型進(jìn)行轉(zhuǎn)換動(dòng)作终抽。不用使用者在強(qiáng)制轉(zhuǎn)換了。

具體可查看Java核心技術(shù)點(diǎn)之泛型

40.內(nèi)部類的作用

  1. 完善多重繼承
  • C++作為比較早期的面向?qū)ο缶幊陶Z(yǔ)言桶至,摸著石頭過(guò)河昼伴,不幸的當(dāng)了炮灰。比如多重繼承镣屹,Java是不太歡迎繼承的圃郊。因?yàn)槔^承耦合度太高。比如你是一個(gè)人女蜈,你想會(huì)飛持舆,于是就繼承了鳥(niǎo)這個(gè)類,然后你順便擁有了一對(duì)翅膀和厚厚的羽毛伪窖,可這些玩意你并不需要逸寓。所以Java發(fā)明了接口,以契約的方式向你提供功能覆山。想想看竹伸,你的程序里成員變量會(huì)比函數(shù)多嗎?況且多重繼承會(huì)遇到死亡菱形問(wèn)題簇宽,就是兩個(gè)父類有同樣名字的函數(shù)勋篓,你繼承誰(shuí)的呢?其實(shí)C++也可以做到這些魏割,那就是定義沒(méi)有成員變量的純虛類譬嚣,而且所有函數(shù)都是純虛函數(shù)〖剩可是這些都是要靠程序員自己把握孤荣,并沒(méi)有把這些功能集成到類似Interface這樣的語(yǔ)法里甸陌。
  • 所以Java只支持單重繼承,想擴(kuò)展功能盐股,去實(shí)現(xiàn)接口吧钱豁。很快Java的設(shè)計(jì)者就發(fā)現(xiàn)了他們犯了矯枉過(guò)正的錯(cuò)誤,多重繼承還是有一定用處的疯汁。比如每一個(gè)人都是同時(shí)繼承父親和母親兩個(gè)類牲尺,要不然你的身體里怎么能留著父母的血呢?Java內(nèi)部類應(yīng)運(yùn)而生幌蚊。
  1. 實(shí)現(xiàn)事件驅(qū)動(dòng)系統(tǒng)
    用來(lái)開(kāi)發(fā)GUI的Java Swing使用了大量?jī)?nèi)部類谤碳,主要用來(lái)響應(yīng)各種事件。Swing的工作就是在事件就緒的時(shí)候執(zhí)行事件溢豆,至于事件具體怎么做蜒简,這由事件決定。這里面有兩個(gè)問(wèn)題:1.事件必須要用到繼承2.事件必須能訪問(wèn)到Swing漩仙。所以必須把事件寫成內(nèi)部類搓茬。

  2. 閉包。
    內(nèi)部類是面向?qū)ο蟮拈]包队他,因?yàn)樗粌H包含創(chuàng)建內(nèi)部類的作用域的信息卷仑,還自動(dòng)擁有一個(gè)指向此外圍類對(duì)象的引用,在此作用域內(nèi)麸折,內(nèi)部類有權(quán)操作所有的成員锡凝,包括private成員。一般使用一個(gè)庫(kù)或類時(shí)垢啼,是你主動(dòng)調(diào)用人家的API窜锯,這個(gè)叫Call,有的時(shí)候這樣不能滿足需要膊夹,需要你注冊(cè)(注入)你自己的程序(比如一個(gè)對(duì)象)衬浑,然后讓人家在合適的時(shí)候來(lái)調(diào)用你,這叫Callback放刨。
    當(dāng)父類和實(shí)現(xiàn)的接口出現(xiàn)同名函數(shù)時(shí)工秩,你又不想父類的函數(shù)被覆蓋,回調(diào)可以幫你解決這個(gè)問(wèn)題进统。

摘取至知乎中Java 中引入內(nèi)部類的意義一文的回答

41.if和switch的區(qū)別:

  • if :
    1.對(duì)具體的值進(jìn)行判斷
    2.對(duì)區(qū)間判斷
    3.對(duì)運(yùn)算結(jié)果是boolean類型的表達(dá)式進(jìn)行判斷

  • switch :
    1.對(duì)具體的值進(jìn)行判斷助币;
    2.值的個(gè)數(shù)通常是固定的。

對(duì)于幾個(gè)固定值的判斷螟碎,建議使用switch語(yǔ)句眉菱,因?yàn)閟witch語(yǔ)句會(huì)將具體的答案加載進(jìn)內(nèi)存,相對(duì)高效一點(diǎn)掉分。

42.進(jìn)程和線程的區(qū)別

進(jìn)程就是一個(gè)應(yīng)用程在處理機(jī)上的一次執(zhí)行過(guò)程俭缓, 它是一個(gè)動(dòng)態(tài)的概念克伊。而線程是進(jìn)程的一部分,一個(gè)進(jìn)程可以包含多個(gè)線程. 進(jìn)程是一個(gè)具有獨(dú)立功能的程序關(guān)于某個(gè)數(shù)據(jù)集合的一次運(yùn)行活動(dòng)华坦。它可以申請(qǐng)和擁有系統(tǒng)資源愿吹,是一個(gè)動(dòng)態(tài)的概念,是一個(gè)活動(dòng)的實(shí)體惜姐。它不只是程序的代碼犁跪,還包括當(dāng)前的活動(dòng),通過(guò)程序計(jì)數(shù)器的值和處理寄存器的內(nèi)容來(lái)表示歹袁。

進(jìn)程是一個(gè)“執(zhí)行中的程序”坷衍。程序是一個(gè)沒(méi)有生命的實(shí)體,只有處理器賦予程序生命時(shí)条舔,它才能成為一個(gè)活動(dòng)的實(shí)體枫耳,我們稱其為進(jìn)程。

通常在一個(gè)進(jìn)程中可以包含若干個(gè)線程逞刷,它們可以利用進(jìn)程所擁有的資源嘉涌。在引入線程的操作系統(tǒng)中妻熊,通常都是把進(jìn)程作為分配資源的基本單位夸浅,而把線程作為獨(dú)立運(yùn)行和獨(dú)立調(diào)度的基本單位。由于線程比進(jìn)程更小扔役,基本上不擁有系統(tǒng)資源帆喇,故對(duì)它的調(diào)度所付出的開(kāi)銷就會(huì)小得多,能更高效的提高系統(tǒng)內(nèi)多個(gè)程序間并發(fā)執(zhí)行的程度亿胸。

線程和進(jìn)程的區(qū)別在于坯钦,子進(jìn)程和父進(jìn)程有不同的代碼和數(shù)據(jù)空間,而多個(gè)線程則共享數(shù)據(jù)空間侈玄,每個(gè)線程有自己的執(zhí)行堆棧和程序計(jì)數(shù)器為其執(zhí)行上下文婉刀。多線程主要是為了節(jié)約CPU時(shí)間,發(fā)揮利用序仙,根據(jù)具體情況而定突颊。線程的運(yùn)行中需要使用計(jì)算機(jī)的內(nèi)存資源和CPU。

線程與進(jìn)程的區(qū)別歸納:

  • 地址空間和其它資源**:進(jìn)程間相互獨(dú)立潘悼,同一進(jìn)程的各線程間共享律秃。某進(jìn)程內(nèi)的線程在其它進(jìn)程不可見(jiàn)。
  • 通信:進(jìn)程間通信IPC治唤,線程間可以直接讀寫進(jìn)程數(shù)據(jù)段(如全局變量)來(lái)進(jìn)行通信——需要進(jìn)程同步和互斥手段的輔助棒动,以保證數(shù)據(jù)的一致性。
  • 調(diào)度和切換:線程上下文切換比進(jìn)程上下文切換要快得多宾添。
  • 在多線程OS中船惨,進(jìn)程不是一個(gè)可執(zhí)行的實(shí)體柜裸。

進(jìn)程是具有一定獨(dú)立功能的程序關(guān)于某個(gè)數(shù)據(jù)集合上的一次運(yùn)行活動(dòng),進(jìn)程是系統(tǒng)進(jìn)行資源分配和調(diào)度的一個(gè)獨(dú)立單位。線程是進(jìn)程的一個(gè)實(shí)體,是CPU調(diào)度和分派的基本單位,它是比進(jìn)程更小的能獨(dú)立運(yùn)行的基本單位粱锐。線程自己基本上不擁有系統(tǒng)資源,只擁有一點(diǎn)在運(yùn)行中必不可少的資源(如程序計(jì)數(shù)器,一組寄存器和棧),但是它可與同屬一個(gè)進(jìn)程的其他的線程共享進(jìn)程所擁有的全部資源粘室。

來(lái)源于文章面試題二(談?wù)勥M(jìn)程與線程)

43.Java 7與Java 8的新特性

Java 7:

  • 對(duì)集合的支持
    創(chuàng)建List / Set / Map 時(shí)寫法更簡(jiǎn)單了。
  • 對(duì)資源的自動(dòng)回收管理
  • 泛型實(shí)例創(chuàng)建過(guò)程中類型引用的簡(jiǎn)化
  • 在數(shù)字中使用下劃線
  • 對(duì)字符串進(jìn)行switch case
  • 二進(jìn)制符號(hào)
  • 一個(gè)catch里捕捉多個(gè)異常類型

Java 8:

  • Lambdas表達(dá)式與Functional接口
  • 接口的默認(rèn)與靜態(tài)方法
  • 方法引用
  • 重復(fù)注解
  • 更好的類型推測(cè)機(jī)制
  • 擴(kuò)展注解的支持

這里有兩篇總結(jié)的非常好的:
Java 7的新特性
Java 8的新特性

44.常見(jiàn)設(shè)計(jì)模式

所謂“設(shè)計(jì)模式”卜范,不過(guò)是面向?qū)ο缶幊讨幸恍┏S玫能浖O(shè)計(jì)手法衔统,并且經(jīng)過(guò)實(shí)踐的檢驗(yàn),這些設(shè)計(jì)手法在各自的場(chǎng)景下能解決一些需求海雪,因此它們就成為了如今廣為流傳的”設(shè)計(jì)模式“锦爵。也就是說(shuō),正式因?yàn)樵谀承﹫?chǎng)景下產(chǎn)生了一些棘手的問(wèn)題奥裸,才催生了相應(yīng)的設(shè)計(jì)模式险掀。明確了這一點(diǎn),我們?cè)趯W(xué)習(xí)某種設(shè)計(jì)模式時(shí)要充分理解它產(chǎn)生的背景以及它所解決的主要矛盾是什么湾宙。

常用的設(shè)計(jì)模式可以分為以下三大類:

  • 創(chuàng)建型模式: 包括工廠模式(又可進(jìn)一步分為簡(jiǎn)單工廠模式樟氢、工廠方法模式、抽象工廠模式)侠鳄、建造者模式埠啃、單例模式。

  • 結(jié)構(gòu)型模式: 包括適配器模式伟恶、橋接模式碴开、裝飾模式、外觀模式博秫、享元模式潦牛、代理模式。

  • 行為型模式: 包括命令模式挡育、中介者模式巴碗、觀察者模式、狀態(tài)模式即寒、策略模式橡淆。

關(guān)于每個(gè)模式具體的介紹請(qǐng)參考圖說(shuō)設(shè)計(jì)模式

45.動(dòng)態(tài)代理的定義、應(yīng)用場(chǎng)景及原理

公共技術(shù)點(diǎn)之 Java 動(dòng)態(tài)代理

46.注解的基本概念與使用

  • 注解可以看作是“增強(qiáng)版的注釋”蒿叠,它可以向編譯器明垢、虛擬機(jī)說(shuō)明一些事情。

  • 注解是描述Java代碼的代碼市咽,它能夠被編譯器解析痊银,注解處理工具在運(yùn)行時(shí)也能夠解析注解。注解本身是“被動(dòng)”的信息施绎,只有主動(dòng)解析它才有意義溯革。

  • 除了向編譯器/虛擬機(jī)傳遞信息贞绳,我們也可以使用注解來(lái)生成一些“模板化”的代碼。


本文主要根據(jù)以下文章整理:

  1. Java面試知識(shí)點(diǎn)總結(jié)
  2. LearningNotes

后續(xù)會(huì)持續(xù)添加我認(rèn)為重要的東西

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末致稀,一起剝皮案震驚了整個(gè)濱河市冈闭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌抖单,老刑警劉巖萎攒,帶你破解...
    沈念sama閱讀 219,366評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異矛绘,居然都是意外死亡耍休,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門货矮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)羊精,“玉大人,你說(shuō)我怎么就攤上這事囚玫⌒酰” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,689評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵抓督,是天一觀的道長(zhǎng)燃少。 經(jīng)常有香客問(wèn)我,道長(zhǎng)本昏,這世上最難降的妖魔是什么供汛? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,925評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮涌穆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘雀久。我一直安慰自己宿稀,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布赖捌。 她就那樣靜靜地躺著祝沸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪越庇。 梳的紋絲不亂的頭發(fā)上罩锐,一...
    開(kāi)封第一講書(shū)人閱讀 51,727評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音卤唉,去河邊找鬼涩惑。 笑死,一個(gè)胖子當(dāng)著我的面吹牛桑驱,可吹牛的內(nèi)容都是我干的竭恬。 我是一名探鬼主播跛蛋,決...
    沈念sama閱讀 40,447評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼痊硕!你這毒婦竟也來(lái)了赊级?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,349評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤岔绸,失蹤者是張志新(化名)和其女友劉穎理逊,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體盒揉,經(jīng)...
    沈念sama閱讀 45,820評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡挡鞍,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了预烙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片墨微。...
    茶點(diǎn)故事閱讀 40,127評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖扁掸,靈堂內(nèi)的尸體忽然破棺而出翘县,到底是詐尸還是另有隱情,我是刑警寧澤谴分,帶...
    沈念sama閱讀 35,812評(píng)論 5 346
  • 正文 年R本政府宣布锈麸,位于F島的核電站,受9級(jí)特大地震影響牺蹄,放射性物質(zhì)發(fā)生泄漏忘伞。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評(píng)論 3 331
  • 文/蒙蒙 一沙兰、第九天 我趴在偏房一處隱蔽的房頂上張望氓奈。 院中可真熱鬧,春花似錦鼎天、人聲如沸舀奶。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,017評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)育勺。三九已至,卻和暖如春罗岖,著一層夾襖步出監(jiān)牢的瞬間涧至,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,142評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工桑包, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留南蓬,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,388評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像蓖康,于是被迫代替她去往敵國(guó)和親铐炫。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • (一)Java部分 1蒜焊、列舉出JAVA中6個(gè)比較常用的包【天威誠(chéng)信面試題】 【參考答案】 java.lang;ja...
    獨(dú)云閱讀 7,107評(píng)論 0 62
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法倒信,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法泳梆,繼承相關(guān)的語(yǔ)法鳖悠,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,644評(píng)論 18 399
  • 集合框架: 1)特點(diǎn):存儲(chǔ)對(duì)象优妙;長(zhǎng)度可變乘综;存儲(chǔ)對(duì)象的類型可不同2)Collection(1)List:有序的;元素...
    Demo_Yang閱讀 1,264評(píng)論 0 4
  • 從三月份找實(shí)習(xí)到現(xiàn)在套硼,面了一些公司卡辰,掛了不少,但最終還是拿到小米邪意、百度九妈、阿里、京東雾鬼、新浪萌朱、CVTE、樂(lè)視家的研發(fā)崗...
    時(shí)芥藍(lán)閱讀 42,255評(píng)論 11 349
  • $http服務(wù) $http(requestConfig)只是一個(gè)封裝的XMLHttpRequest對(duì)象策菜。 requ...
    iqing2012閱讀 900評(píng)論 0 0