Java 面試題匯編

1 什么是 Java 虛擬機(jī)觉至?為什么 Java 被稱作是 “ 平臺無關(guān)的編程語言 ” 璧尸?

Java 虛擬機(jī)是一個可以執(zhí)行 Java 字節(jié)碼的虛擬機(jī)進(jìn)程 是牢。Java 源文件被編譯成能被 Java 虛擬機(jī)執(zhí)行的字節(jié)碼文件 俱病。

Java 被設(shè)計成允許應(yīng)用程序可以運(yùn)行在任意的平臺谓晌,而不需要程序員為每一個平臺單獨(dú)重寫或者是重新編譯 什黑。Java 虛擬機(jī)讓這個變?yōu)榭赡芡复В驗樗赖讓佑布脚_的指令長度和其他特性 唉韭。

2 JDK 和 JRE 的區(qū)別是什么护侮?

Java 運(yùn)行時環(huán)境 (JRE) 是將要執(zhí)行 Java 程序的 Java 虛擬機(jī) 挂捻。Java 開發(fā)工具包 (JDK) 是完整的 Java 軟件開發(fā)包活烙,包含了 JRE 徐裸,編譯器和其他的工具 ( 比如: JavaDoc , Java 調(diào)試器 ) 啸盏,可以讓開發(fā)者開發(fā) 重贺、 編譯 、 執(zhí)行 Java 應(yīng)用程序 回懦。

3 Java支持的數(shù)據(jù)類型有哪些气笙?什么是自動拆裝箱?

Java語言支持的 8 種基本數(shù)據(jù)類型是:

  • byte
  • short
  • int
  • long
  • float
  • double
  • boolean
  • char

自動裝箱是 Java 編譯器在基本數(shù)據(jù)類型和對應(yīng)的對象包裝類型之間做的一個轉(zhuǎn)化 怯晕。 比如:把 int 轉(zhuǎn)化成 Integer 潜圃, double 轉(zhuǎn)化成 Double ,等等 舟茶。 反之就是自動拆箱 谭期。

4 接口和抽象類的區(qū)別是什么?

  • 接口中所有的方法隱含的都是抽象的 吧凉。 而抽象類則可以同時包含抽象和非抽象的方法 隧出。
  • 類可以實現(xiàn)很多個接口,但是只能繼承一個抽象類
  • 類如果要實現(xiàn)一個接口客燕,它必須要實現(xiàn)接口聲明的所有方法 鸳劳。 但是,類可以不實現(xiàn)抽象類聲明的所有方法也搓,當(dāng)然赏廓,在這種情況下涵紊,類也必須得聲明成是抽象的 。
  • 抽象類可以在不提供接口方法實現(xiàn)的情況下實現(xiàn)接口 幔摸。
  • Java 接口中聲明的變量默認(rèn)都是 final 的 摸柄。 抽象類可以包含非 final 的變量 。
  • Java 接口中的成員函數(shù)默認(rèn)是 public 的 既忆。 抽象類的成員函數(shù)可以是 private 驱负, protected 或者是 public。
  • 接口是絕對抽象的患雇,不可以被實例化 跃脊。 抽象類也不可以被實例化,但是苛吱,如果它包含 main 方法的話是可以被調(diào)用的 酪术。

5 什么是值傳遞和引用傳遞?

對象被值傳遞翠储,意味著傳遞了對象的一個副本绘雁。因此,就算是改變了對象副本援所,也不會影響源對象的值庐舟。

對象被引用傳遞,意味著傳遞的并不是實際的對象住拭,而是對象的引用挪略。因此,外部對引用對象所做的改變會反映到所在的對象上废酷。

6 ”static” 關(guān)鍵字是什么意思瘟檩? Java 中是否可以覆蓋 (override) 一個 private 或者是 static 的方法?如果回答不能澈蟆,請問為什么不能墨辛?

“static” 關(guān)鍵字表明一個成員變量或者是成員方法可以在沒有所屬的類的實例變量的情況下被訪問 。static 還可以用于修飾內(nèi)部類(靜態(tài)內(nèi)部類)趴俘,還可以用在 import 中睹簇,可以直接使用某個類的靜態(tài)屬性而不需要類名 。
Java 中 static 方法不能被覆蓋寥闪,因為方法覆蓋是基于運(yùn)行時動態(tài)綁定的太惠,而 static 方法是編譯時靜態(tài)綁定的 。static 方法跟類的任何實例都不相關(guān)疲憋,所以概念上不適用 凿渊。

7 是否可以在 static 環(huán)境中訪問非 static 變量?

static 變量在 Java 中是屬于類的,它在所有的實例中的值是一樣的 埃脏。 當(dāng)類被 Java 虛擬機(jī)載入時搪锣,會對 static 變量進(jìn)行初始化 。 如果你的代碼嘗試不用實例來訪問非 static 的變量彩掐,編譯器會報錯构舟,因為這些變量還沒有被創(chuàng)建出來,還沒有跟任何實例關(guān)聯(lián)上 堵幽。

8 將構(gòu)造函數(shù)聲明為私有會有何作用狗超?

將構(gòu)造函數(shù)聲明為私有 (private) ,可以確保類以外的地方都不能直接實例化這個類 朴下。 在這種情況下努咐,要創(chuàng)建這個類的實例,唯一的辦法是提供一個公共靜態(tài)方法殴胧,就像工廠方法模式那樣 麦撵。
此外,由于構(gòu)造函數(shù)是私有的溃肪,因此這個類也不能被繼承 。

9 在 Java 中音五,若在 try-catch-finally 的 try 語句塊中插入 return 語句惫撰, finally 語句塊是否會執(zhí)行?

一般情況下會執(zhí)行 躺涝。 當(dāng)退出 try 語句塊時厨钻, finally 語句塊將執(zhí)行 。 即使我們試圖從 try 語句塊里跳出(通過 return 語句 坚嗜、continue 語句 夯膀、break 語句或任意異常語句), finally 語句塊仍將得以執(zhí)行 苍蔬。

注意:有些情況下 finally 語句塊將不會執(zhí)行诱建,比如:

  • 如果虛擬機(jī)在 try/catch 語句塊執(zhí)行期間退出;
  • 如果執(zhí)行 try/catch 語句塊的線程被殺死終止了 碟绑。

10 請問什么是 Java 的對象反射俺猿?它有什么作用?

對象反射是 Java 的一項特性格仲,提供了獲取 Java 類和對象的反射信息的方法押袍,可以執(zhí)行以下方法:

  • 運(yùn)行時獲得類的方法和字段的相關(guān)信息 。
  • 創(chuàng)建某個類的新實例 凯肋。
  • 通過取得字段引用直接獲取和設(shè)置對象字段谊惭,不管訪問修飾為何 。

反射的作用:

  • 有助于觀察和操縱應(yīng)用程序的運(yùn)行時行為 。
  • 有助于調(diào)試或測試程序圈盔,因為我們可以直接訪問方法 豹芯、 構(gòu)造函數(shù)和成員字段 。
  • 即使事前那個不知道某個方法药磺,我們也可以通過名字調(diào)用該方法 告组。

11 為什么內(nèi)部類調(diào)用的外部變量必須是 final 修飾的?

因為生命周期的原因 癌佩。 方法中的局部變量木缝,方法結(jié)束后這個變量就要釋放掉, final 保證這個變量始終指向一個對象 围辙。 首先我碟,內(nèi)部類和外部類其實是處于同一個級別,內(nèi)部類不會因為定義在方法中就會隨著方法的執(zhí)行完畢而跟隨者被銷毀 姚建。 問題就來了矫俺,如果外部類的方法中的變量不定義 final ,那么當(dāng)外部類方法執(zhí)行完畢時掸冤,這個局部變量肯定也就被 GC 了厘托,然而內(nèi)部類的某個方法還沒有執(zhí)行完,這個時候他所引用的外部變量已經(jīng)找不到了 稿湿。 如果定義為 final 铅匹, java 會將這個變量復(fù)制一份作為成員變量內(nèi)置于內(nèi)部類中,這樣的話饺藤,由于 final 所修飾的值始終無法改變包斑,所以這個變量所指向的內(nèi)存區(qū)域就不會變 。
為了解決:局部變量的生命周期與局部內(nèi)部類的對象的生命周期的不一致性問題涕俗。

12 請說一說 Java 中的方法覆蓋 (Overriding) 和方法重載 (Overloading) 的區(qū)別 罗丰?

Java 中的方法重載發(fā)生在同一個類里面兩個或者是多個方法的方法名相同但是參數(shù)不同的情況 。

與此相對再姑,方法覆蓋是說子類重新定義了父類的方法 萌抵。 方法覆蓋必須有相同的方法名,參數(shù)列表和返回類型 元镀。 覆蓋者可能不會限制它所覆蓋的方法的訪問 谜嫉。

13 Java 支持多繼承么?

Java 中類不支持多繼承凹联,只支持單繼承(即一個類只有一個父類) 沐兰。 但是 java 中的接口支持多繼承,蔽挠,即一個子接口可以有多個父接口 住闯。 (接口的作用是用來擴(kuò)展對象的功能瓜浸,一個子接口繼承多個父接口,說明子接口擴(kuò)展了多個功能比原,當(dāng)類實現(xiàn)接口時插佛,類就擴(kuò)展了相應(yīng)的功能) 。

14 請問量窘,創(chuàng)建線程有幾種不同的方式雇寇?你喜歡哪一種?為什么蚌铜?

有三種方式可以用來創(chuàng)建線程:

  • 繼承 Thread 類
  • 實現(xiàn) Runnable 接口
    應(yīng)用程序可以使用 Executor 框架來創(chuàng)建線程池

實現(xiàn) Runnable 接口這種方式更受歡迎锨侯,因為這不需要繼承 Thread 類 。 在應(yīng)用設(shè)計中已經(jīng)繼承了別的對象的情況下冬殃,這需要多繼承(而 Java 不支持多繼承)囚痴,只能實現(xiàn)接口 。 同時审葬,線程池也是非常高效的深滚,很容易實現(xiàn)和使用 。

15 請說一說涣觉,線程的生命周期痴荐?有哪幾種阻塞情況?死亡的線程可以復(fù)生嗎官册?

  • 新建 (new) :新創(chuàng)建了一個線程對象 蹬昌。
  • 可運(yùn)行 (runnable) :線程對象創(chuàng)建后,其他線程 ( 比如 main 線程)調(diào)用了該對象的 start() 方法 攀隔。 該狀態(tài)的線程位于可運(yùn)行線程池中,等待被線程調(diào)度選中栖榨,獲取 cpu 的使用權(quán) 昆汹。
    運(yùn)行 (running) :可運(yùn)行狀態(tài) (runnable) 的線程獲得了 cpu 時間片( timeslice ),執(zhí)行程序代碼 婴栽。
  • 阻塞 (block) :阻塞狀態(tài)是指線程因為某種原因放棄了 cpu 使用權(quán)满粗,也即讓出了 cpu timeslice ,暫時停止運(yùn)行 愚争。 直到線程進(jìn)入可運(yùn)行 (runnable) 狀態(tài)映皆,才有 機(jī)會再次獲得 cpu timeslice 轉(zhuǎn)到運(yùn)行 (running) 狀態(tài) 。 阻塞的情況分三種:
    ( 一 ). 等待阻塞:運(yùn)行 (running) 的線程執(zhí)行 o.wait() 方法轰枝, JVM 會把該線程放入等待隊列 (waitting queue) 中 捅彻。
    ( 二 ). 同步阻塞:運(yùn)行 (running) 的線程在獲取對象的同步鎖時,若該同步鎖被別的線程占用鞍陨,則 JVM 會把該線程放入鎖池 (lock pool) 中 步淹。
    ( 三 ). 其他阻塞 : 運(yùn)行 (running) 的線程執(zhí)行 Thread.sleep (long ms) 或 t.join() 方法,或者發(fā)出了 I/O 請求時, JVM 會把該線程置為阻塞狀態(tài) 缭裆。 當(dāng) sleep() 狀態(tài)超時 键闺、join() 等待線程終止或者超時 、 或者 I/O 處理完畢時澈驼,線程重新轉(zhuǎn)入可運(yùn)行 (runnable) 狀態(tài) 辛燥。
  • 死亡 (dead) :線程 run()、 main() 方法執(zhí)行結(jié)束缝其,或者因異常退出了 run() 方法挎塌,則該線程結(jié)束生命周期 。 死亡的線程不可再次復(fù)生 氏淑。

16 線程同步方法和同步代碼塊的區(qū)別是什么勃蜘?

同步方法默認(rèn)用this或者當(dāng)前類class對象作為鎖;
同步代碼塊可以選擇以什么來加鎖假残,比同步方法要更細(xì)顆粒度缭贡,我們可以選擇只同步會發(fā)生同步問題的部分代碼而不是整個方法;

17 什么是死鎖辉懒?

兩個線程或兩個以上線程都在等待對方執(zhí)行完畢才能繼續(xù)往下執(zhí)行的時候就發(fā)生了死鎖阳惹。結(jié)果就是這些線程都陷入了無限的等待中。

18 如何確保 N 個線程可以訪問 N 個資源同時又不導(dǎo)致死鎖眶俩?

使用多線程的時候莹汤,一種非常簡單的避免死鎖的方式就是:指定獲取鎖的順序,并強(qiáng)制線程按照指定的順序獲取鎖颠印。因此纲岭,如果所有的線程都是以同樣的順序加鎖和釋放鎖,就不會出現(xiàn)死鎖了线罕。

19 Java 集合框架的基礎(chǔ)接口有哪些止潮?

  • Collection 為集合層級的根接口 。 一個集合代表一組對象钞楼,這些對象即為它的元素 喇闸。Java 平臺不提供這個接口任何直接的實現(xiàn) 。
  • Set 是一個不能包含重復(fù)元素的集合 询件。 這個接口對數(shù)學(xué)集合抽象進(jìn)行建模燃乍,被用來代表集合,就如一副牌 宛琅。
  • List 是一個有序集合刻蟹,可以包含重復(fù)元素 。 你可以通過它的索引來訪問任何元素 嘿辟。List 更像長度動態(tài)變換的數(shù)組 座咆。
  • Map 是一個將 key 映射到 value 的對象 . 一個 Map 不能包含重復(fù)的 key :每個 key 最多只能映射一個 value痢艺。
    一些其它的接口有 Queue、Dequeue介陶、SortedSet堤舒、SortedMap 和 ListIterator。

20 說說 Java 的 HashMap 的工作原理哺呜?

HashMap 是一個針對數(shù)據(jù)結(jié)構(gòu)的鍵值舌缤,每個鍵都會有相應(yīng)的值,關(guān)鍵是識別這樣的值 某残。

HashMap 基于 hashing 原理国撵,我們通過 put () 和 get () 方法儲存和獲取對象 。 當(dāng)我們將鍵值對傳遞給 put () 方法時玻墅,它調(diào)用鍵對象的 hashCode () 方法來計算 hashcode 介牙,然后找到 bucket 位置來儲存值對象 。 當(dāng)獲取對象時澳厢,通過鍵對象的 equals () 方法找到正確的鍵值對环础,然后返回值對象 。HashMap 使用 LinkedList 來解決碰撞問題剩拢,當(dāng)發(fā)生碰撞了线得,對象將會儲存在 LinkedList 的下一個節(jié)點中 。 HashMap 在每個 LinkedList 節(jié)點中儲存鍵值對對象 徐伐。

21 Java 集合中有哪些已實現(xiàn)的 List 贯钩,它們有何區(qū)別?

LinkedList 和 ArrayList办素。ArrayList 的優(yōu)勢在于動態(tài)的增長數(shù)組角雷,非常適合初始時總長度未知的情況下使用 。LinkedList 的優(yōu)勢在于在中間位置插入和刪除操作性穿,速度是最快的 勺三。

LinkedList 實現(xiàn)了 List 接口,允許 null 元素 季二。 此外 LinkedList 提供額外的 get , remove 揭措, insert 方法在 LinkedList 的首部或尾部 胯舷。 這些操作使 LinkedList 可被用作堆棧( stack ),隊列( queue )或雙向隊列( deque ) 绊含。

ArrayList 實現(xiàn)了可變大小的數(shù)組 桑嘶。 它允許所有元素,包括 null躬充。 每個 ArrayList 實例都有一個容量( Capacity )逃顶,即用于存儲元素的數(shù)組的大小 讨便。 這個容量可隨著不斷添加新元素而自動增加,但是增長算法并沒有定義 以政。 當(dāng)需要插入大量元素時霸褒,在插入前可以調(diào)用 ensureCapacity 方法來增加 ArrayList 的容量以提高插入效率 。

22 在遍歷一個集合的時候盈蛮,如何避免并發(fā)修改異常(ConcurrentModificationException)废菱?

在遍歷一個集合的時候,我們可以使用并發(fā)集合類來避免ConcurrentModificationException抖誉,比如使用CopyOnWriteArrayList殊轴,而不是ArrayList。

也可以使用迭代器迭代集合時袒炉,刪除集合中的某個元素旁理。

23 哪些集合類提供對元素的隨機(jī)訪問?

ArrayList我磁、HashMap孽文、TreeMap和HashTable類提供對元素的隨機(jī)訪問。

24 什么是迭代器(Iterator)十性?

Iterator 接口提供了很多對集合元素進(jìn)行迭代的方法 叛溢。 每一個集合類都包含了可以返回迭代器實例的迭代方法 。 迭代器可以在迭代的過程中刪除底層集合的元素 , 但是不可以直接調(diào)用集合的 remove(Object Obj) 刪除劲适,可以通過迭代器的 remove() 方法刪除 楷掉。

25 Iterator 和 ListIterator 的區(qū)別是什么?

  • Iterator 可用來遍歷 Set 和 List 集合霞势,但是 ListIterator 只能用來遍歷 List烹植。
  • Iterator 對集合只能是前向遍歷, ListIterator 既可以前向也可以后向 愕贡。
  • ListIterator 實現(xiàn)了 Iterator 接口草雕,并包含其他的功能,比如:增加元素固以,替換元素墩虹,獲取前一個和后一個元素的索引,等等 憨琳。

26 迭代器中的快速失敗 (fail-fast) 和安全失敗 (fail-safe) 的區(qū)別是什么诫钓?

答: Iterator 的安全失敗是基于對底層集合做拷貝,因此篙螟,它不受源集合上修改的影響 菌湃。java.util 包下面的所有的集合類都是快速失敗的,而 java.util.concurrent 包下面的所有的類都是安全失敗的 遍略。 快速失敗的迭代器會拋出 ConcurrentModificationException 異常骤坐,而安全失敗的迭代器永遠(yuǎn)不會拋出這樣的異常 下愈。

27 hashCode() 和 equals() 方法的重要性體現(xiàn)在哪里?

Java 中的 HashMap 使用 hashCode() 和 equals() 方法來確定鍵值對的索引驰唬,當(dāng)根據(jù)鍵獲取值時也會用到這兩個方法 顶岸。 如果沒有正確的實現(xiàn)這兩個方法辖佣,兩個不同的鍵可能會有相同的 hash 值,因此搓逾,可能會被集合認(rèn)為是相等的 卷谈。 而且霞篡,這兩個方法也用來發(fā)現(xiàn)重復(fù)元素 。 所以這兩個方法的實現(xiàn)對 HashMap 的精確性和正確性是至關(guān)重要的 污淋。

28 HashMap 和 Hashtable 有什么區(qū)別寸爆?

HashMap 和 Hashtable 都實現(xiàn)了 Map 接口盐欺,因此很多特性非常相似 。 但是魔种,他們有以下不同點:

  • HashMap 允許鍵和值是 null 粉洼,而 Hashtable 不允許鍵或者值是 null属韧。
  • Hashtable 是同步的,而 HashMap 不是 去扣。 因此愉棱, HashMap 更適合于單線程環(huán)境,而 Hashtable 適合于多線程環(huán)境 奔滑。
  • HashMap 提供了可供應(yīng)用迭代的鍵的集合顺少,因此脆炎, HashMap 是快速失敗的 。 另一方面袱蚓, Hashtable 提供了對鍵的列舉 (Enumeration) 喇潘。 一般認(rèn)為 Hashtable 是一個遺留的類 梭稚。

29 數(shù)組 (Array) 和列表 (ArrayList) 有什么區(qū)別弧烤?什么時候應(yīng)該使用 Array 而不是 ArrayList ?

下面列出了 Array 和 ArrayList 的不同點:

  • Array 可以包含基本類型和對象類型想幻, ArrayList 只能包含對象類型 脏毯。
  • Array 大小是固定的幔崖, ArrayList 的大小是動態(tài)變化的 赏寇。
  • ArrayList 提供了更多的方法和特性,比如: addAll() 自娩, removeAll() 忙迁, iterator() 等等 。

對于基本類型數(shù)據(jù)惠奸,ArrayList 可以使用自動裝箱來減少編碼工作量 佛南。 但是嵌言,當(dāng)處理固定大小的基本數(shù)據(jù)類型時摧茴,這種方式相對較慢 ,所以在這種情況下尘分,使用 Array 更恰當(dāng)培愁。

30 Comparable 和 Comparator 接口有什么作用缓窜?請說出它們之間的區(qū)別禾锤?

  1. Comparable 接口 :
    它只包含一個 compareTo() 方法的 Comparable 接口 。 這個方法可以個給兩個對象排序 恩掷。 具體來說黄娘,它返回負(fù)數(shù)、0 或正數(shù)來表明輸入對象小于优床、等于或大于已經(jīng)存在的對象 胆敞。

  2. Comparator 接口:
    Java 提供了包含 compare() 和 equals() 兩個方法的 Comparator 接口 移层。

  • compare() 方法用來給兩個輸入?yún)?shù)排序,返回負(fù)數(shù)、0 或正數(shù)表明第一個參數(shù)是小于匪燕、等于或大于第二個參數(shù) 喧笔。
  • equals() 方法需要一個對象作為參數(shù)书闸,它用來決定輸入?yún)?shù)是否和 comparator 相等 浆劲。 只有當(dāng)輸入?yún)?shù)也是一個 comparator 并且輸入?yún)?shù)和當(dāng)前 comparator 的排序結(jié)果是相同時,這個方法才返回 true度气。

31 什么是 Java 優(yōu)先級隊列 (Priority Queue) 磷籍?

PriorityQueue 是一個基于優(yōu)先級堆的無界隊列现柠,它的元素是按照自然順序 (natural order) 排序的 够吩。 在創(chuàng)建時周循,我們可以給它提供一個負(fù)責(zé)給元素排序的比較器 。PriorityQueue 不允許 null 值拟烫,因為他們沒有自然順序硕淑,或者說他們沒有任何的相關(guān)聯(lián)的比較器 。 最后于樟, PriorityQueue 不是線程安全的迂曲,入隊和出隊的時間復(fù)雜度是 O(log(n))路捧。

32 無序數(shù)組與有序數(shù)組之間的區(qū)別是什么传黄?

有序數(shù)組最大的好處在于查找的時間復(fù)雜度是 O(log n) 膘掰,而無序數(shù)組是 O(n)。

有序數(shù)組的缺點是插入操作的時間復(fù)雜度是 O(n) 凡伊,因為值大的元素需要往后移動來給新元素騰位置 窗声。 相反笨觅,無序數(shù)組的插入時間復(fù)雜度是常量 O(1)耕腾。

33 Enumeration 接口和 Iterator 接口之間的區(qū)別有哪些扫俺?

Enumeration 速度是 Iterator 的 2 倍狼纬,同時占用更少的內(nèi)存 。 但是冈欢, Iterator 遠(yuǎn)遠(yuǎn)比 Enumeration 安全凑耻,因為其他線程不能夠修改正在被 iterator 遍歷的集合里面的對象 香浩。 同時, Iterator 允許調(diào)用者刪除底層集合里面的元素餐弱,這對 Enumeration 來說是不可能的 膏蚓。

34 HashSet 和 TreeSet 有什么區(qū)別?

HashSet 是由一個 hash 表來實現(xiàn)的艺糜,因此幢尚,它的元素是無序的 尉剩。add() 理茎, remove() , contains() 方法的時間復(fù)雜度是 O(1)朗鸠。

另一方面烛占, TreeSet 是由一個樹形的結(jié)構(gòu)來實現(xiàn)的忆家,它里面的元素是有序的 德迹。 因此胳搞, add() , remove() 列另, contains() 方法的時間復(fù)雜度是 O(logn)页衙。

35 Java 中垃圾回收有什么目的阴绢?什么時候進(jìn)行垃圾回收呻袭?

垃圾回收的目的是識別并且丟棄應(yīng)用不再使用的對象來釋放和重用資源 左电。

當(dāng)堆中空間不足以分配給對象時會進(jìn)行垃圾回收篓足。

36 System.gc() 和 Runtime.gc() 會做什么事情栈拖?

這兩個方法用來提示 JVM 要進(jìn)行垃圾回收 。 但是索赏,立即開始還是延遲進(jìn)行垃圾回收是由 JVM 決定的 参滴。

37 finalize() 方法什么時候被調(diào)用砾赔?

垃圾回收器 (garbage colector) 決定回收某對象時暴心,就會運(yùn)行該對象的 finalize() 方法杂拨。但是在 Java 中很不幸弹沽,如果內(nèi)存總是充足的,那么垃圾回收可能永遠(yuǎn)不會進(jìn)行娜亿,也就是說 filalize() 可能永遠(yuǎn)不被執(zhí)行买决,顯然指望它做收尾工作是靠不住的 督赤。 那么 finalize() 究竟是做什么的呢泻蚊?它最主要的用途是回收特殊渠道申請的內(nèi)存 性雄。Java 程序有垃圾回收器毅贮,所以一般情況下內(nèi)存問題不用程序員操心 滩褥。 但有一種 JNI(Java Native Interface) 調(diào)用 non-Java 程序( C 或 C++ )瑰煎, finalize() 的工作就是回收這部分的內(nèi)存 俗孝。

38 如果對象的引用被置為 null 赋铝,垃圾收集器是否會立即釋放對象占用的內(nèi)存革骨?

不會良哲,在下一個垃圾回收周期中筑凫,這個對象將是可被回收的 。

39 Java 堆的結(jié)構(gòu)是什么樣子的哩牍?什么是堆中的永久代 (Perm Gen space) ?

JVM 的堆是運(yùn)行時數(shù)據(jù)區(qū)殖属,所有類的實例和數(shù)組都是在堆上分配內(nèi)存 洗显。 它在 JVM 啟動時被創(chuàng)建 挠唆。 對象所占的堆內(nèi)存是由自動內(nèi)存管理系統(tǒng)也就是垃圾收集器回收 填硕。 堆內(nèi)存是由存活和死亡的對象組成的 俄讹。 存活的對象是應(yīng)用可以訪問的,不會被垃圾回收 摊阀。 死亡的對象是應(yīng)用不可訪問尚且還沒有被垃圾收集器回收掉的對象 胞此。 一直到垃圾收集器把這些對象回收掉之前漱牵,他們會一直占據(jù)堆內(nèi)存空間 酣胀。

永久代闻镶,主要存放類定義儒溉,字節(jié)碼和常量等很少變動的信息 顿涣。 在 HotSpot 虛擬機(jī)中運(yùn)行時方法區(qū)是使用永久代實現(xiàn)的 涛碑。

40 串行 (serial) 收集器和吞吐量 (throughput) 收集器的區(qū)別是什么蒲障?

吞吐量收集器使用并行版本的新生代垃圾收集器,它用于中等規(guī)模和大規(guī)模數(shù)據(jù)的應(yīng)用程序 庄撮。
而串行收集器對大多數(shù)的小應(yīng)用 ( 在現(xiàn)代處理器上需要大概 100M 左右的內(nèi)存 ) 就足夠了 。

41 請說明 java.lang.Character 與 char 的關(guān)系烙如?

  • Character 是 char 的包裝類亚铁,因為是類徘溢,所以提供了很多方法 甸昏。
  • 包裝類和基本類型可以自動轉(zhuǎn)換 , 這是 jdk5.0 提供的新特性 , 叫做自動拆裝箱徐许。

42 請寫出從 DataSource ds 中獲取連接雌隅,并執(zhí)行查詢操作的代碼片段(無須寫出異常相關(guān)代碼)恰起?

ds = new com.mysql.jdbc.jdbc2.optional.MysqlDataSource();
ds.setServerName("localhost");
ds.setDatabaseName("xxx");
ds.setPort(3306);
Connection conn = ds.getConnection("xxx", "password");
Statement statement = conn.createStatement();
String sql = "select * from table_name";
ResultSet rs = statement.executeQuery(sql);
while (rs.next()) {
    String name = rs.getString("name");
    ...
}
rs.close();
conn.close();

43 什么情況下需要重載 equals 函數(shù)?重載 equals 函數(shù)時吨枉,為什么也必須重載 hashCode 函數(shù)貌亭?

把對象作為 Key 放入 Set 或 Map 時圃庭,必須重寫 equals() 方法,這樣才能保證唯一性 剧腻。

hashCode 默認(rèn)返回的是對象的存儲地址拘央。因此當(dāng)我們重寫 equals 方法后,判斷兩個對象的內(nèi)容相等時书在,如果不重寫 hashCode 方法就會造成由 hashCode 方法得到的結(jié)果是兩個對象不相等堪滨!

44 HTTP get 與 HTTP post 的區(qū)別是什么?默認(rèn)表單提交的是哪一種方式蕊温?

  • get 可以使用 body 傳參袱箱,只是瀏覽器和服務(wù)器對此進(jìn)行了限制义矛;post 無限制发笔。
  • get 提交可以被瀏覽器緩存, post 則不會凉翻。

默認(rèn)的表單提交方式為 get 了讨。

45 請簡述下 Hashtable 的原理?

  • Hashtable 是一個散列表制轰,它存儲的內(nèi)容是鍵值對 (key-value) 的映射 前计。
  • Hashtable 繼承于 Dictionary ,實現(xiàn)了 Map垃杖、Cloneable男杈、java.io.Serializable 接口 。
  • Hashtable 的函數(shù)都是同步的调俘,這意味著它是線程安全的 伶棒。 它的 key、value 都不可以為 null彩库。 此外肤无, Hashtable 中的映射不是有序的 。

46 敏捷軟件開發(fā)與傳統(tǒng)的瀑布式開發(fā)模型的區(qū)別骇钦?

瀑布開發(fā)模式是嚴(yán)格把軟件項目的開發(fā)分隔成各個開發(fā)階段宛渐。使用里程碑的方式,嚴(yán)格定義了各開發(fā)階段的輸入和輸出。文檔的重要性仿佛已經(jīng)超過了代碼的重要性窥翩。而敏捷開發(fā)模式的核心是:速迭代畴蹭,擁抱變化。

47 請列舉并比較你所了解的軟件開發(fā)模型鳍烁?

模型名稱 技術(shù)特點 適用范圍
瀑布模型 簡單叨襟,分階段,階段間存在因果關(guān)系幔荒,各個階段完成后都有評審糊闽,允許反饋,不支持用戶參與爹梁,要求預(yù)先確定需求右犹。 用戶參與,要求預(yù)先確定需求姚垃,需求易于完善定義且不易變更的軟件系統(tǒng)念链。
快速原型模型 不要求需求預(yù)先完備定義,支持用戶參與积糯,支持需求的漸進(jìn)式完善和確認(rèn)掂墓,能夠適應(yīng)用戶需求的變化。 需求復(fù)雜看成、難以確定君编、動態(tài)變化的軟件系統(tǒng)。
增量模型 軟件產(chǎn)品是被增量式地一塊塊開發(fā)的川慌,允許開發(fā)活動并行和重疊吃嘿。 技術(shù)風(fēng)險較大、用戶需求較為穩(wěn)定的軟件系統(tǒng)梦重。
迭代模型 不要求一次性地開發(fā)出完整的軟件系統(tǒng)兑燥,將軟件開發(fā)視為一個逐步獲取用廣需求、完善軟件產(chǎn)品的過程琴拧。 需求難以確定降瞳、不斷變更的軟件系統(tǒng)。
螺旋模型 結(jié)合瀑布模型艾蓝、快速原型模型和迭代模型的思想力崇,并引進(jìn)了風(fēng)險分析活動斗塘。 需求難以獲取和確定赢织、軟件開發(fā)風(fēng)險較大的軟件系統(tǒng)。

以下是部分模型的詳細(xì)說明:

  • 快速原型模型:建造一個快速原型馍盟,實現(xiàn)客戶或未來的用戶與系統(tǒng)的交互于置,用戶或客戶對原型進(jìn)行評價,進(jìn)一步細(xì)化待開發(fā)軟件的需求。通過逐步調(diào)整原型使其滿足客戶的要求八毯,開發(fā)人員可以確定客戶的真正需求是什么搓侄;第二步則在第一步的基礎(chǔ)上開發(fā)客戶滿意的軟件產(chǎn)品。
  • 螺旋模型:將瀑布模型和快速原型模型結(jié)合起來话速,強(qiáng)調(diào)了其他模型所忽視的風(fēng)險分析讶踪,特別適合于大型復(fù)雜的系統(tǒng)。步驟為:制定計劃泊交、風(fēng)險分析乳讥、實施工程與客戶評估。
  • 噴泉模型:以用戶需求為動力廓俭,以對象為驅(qū)動的模型云石,主要用于采用對象技術(shù)的軟件開發(fā)項目。噴泉模型與傳統(tǒng)的結(jié)構(gòu)化生存期相比較研乒,具有更多的增量和迭代性質(zhì)汹忠,生存期的各個階段可以相互重疊和多次反復(fù),而且在項目的整個生存期中還可以嵌入子生存期雹熬。就像水噴上去又可以落下來宽菜,可以落在中間,也可以落在最底部竿报。
  • 演化模型:主要針對事先不能完整定義需求的軟件開發(fā)赋焕。用戶可以給出待開發(fā)系統(tǒng)的核心需求,并且當(dāng)看到核心需求實現(xiàn)后仰楚,能夠有效地提出反饋隆判,以支持系統(tǒng)的最終設(shè)計和實現(xiàn)。軟件開發(fā)人員根據(jù)用戶的需求僧界,首先開發(fā)核心系統(tǒng)侨嘀。當(dāng)該核心系統(tǒng)投入運(yùn)行后,用戶試用之捂襟,完成他們的工作咬腕,并提出精化系統(tǒng)、增強(qiáng)系統(tǒng)能力的需求葬荷。軟件開發(fā)人員根據(jù)用戶的反饋涨共,實施開發(fā)的迭代過程。

48 jsp 有哪些內(nèi)置對象宠漩?它們的作用是什么举反?

內(nèi)置對象 作用
request 代表了客戶端的請求信息,主要用于接受通過HTTP協(xié)議傳送到服務(wù)器的數(shù)據(jù)扒吁。(包括頭信息火鼻、系統(tǒng)信息、請求方式以及請求參數(shù)等)。request對象的作用域為一次請求魁索。
response 對客戶端的響應(yīng)融撞,主要是將 JSP 容器處理過的對象傳回到客戶端 。response 對象也具有作用域粗蔚,它只在 JSP 頁面內(nèi)有效 尝偎。
session 是由服務(wù)器自動創(chuàng)建的與用戶請求相關(guān)的對象 。 服務(wù)器為每個用戶都生成一個 session 對象鹏控,用于保存該用戶的信息冬念,跟蹤用戶的操作狀態(tài) 。session 對象內(nèi)部使用 Map 類來保存數(shù)據(jù)牧挣,因此保存數(shù)據(jù)的格式為 “Key/value”急前。 session 對象的 value 可以使復(fù)雜的對象類型,而不僅僅局限于字符串類型 瀑构。
application 可將信息保存在服務(wù)器中裆针,直到服務(wù)器關(guān)閉,否則 application 對象中保存的信息會在整個應(yīng)用中都有效 寺晌。 與 session 對象相比世吨, application 對象生命周期更長,類似于系統(tǒng)的 “ 全局變量 ”呻征。
out 用于在 Web 瀏覽器內(nèi)輸出信息耘婚,并且管理應(yīng)用服務(wù)器上的輸出緩沖區(qū) 。 在使用 out 對象輸出數(shù)據(jù)時陆赋,可以對數(shù)據(jù)緩沖區(qū)進(jìn)行操作沐祷,及時清除緩沖區(qū)中的殘余數(shù)據(jù),為其他的輸出讓出緩沖空間 攒岛。 待數(shù)據(jù)輸出完畢后赖临,要及時關(guān)閉輸出流 。
pageContext 作用是取得任何范圍的參數(shù)灾锯,通過它可以獲取 JSP 頁面的 out兢榨、request、response顺饮、session吵聪、application 等對象 。pageContext 對象的創(chuàng)建和初始化都是由容器來完成的兼雄,在 JSP 頁面中可以直接使用 pageContext 對象 吟逝。
config 作用是取得服務(wù)器的配置信息 。 通過 pageConext 對象的 getServletConfig() 方法可以獲取一個 config 對象 君旦。 當(dāng)一個 Servlet 初始化時澎办,容器把某些信息通過 config 對象傳遞給這個 Servlet嘲碱。 開發(fā)者可以在 web.xml 文件中為應(yīng)用程序環(huán)境中的 Servlet 程序和 JSP 頁面提供初始化參數(shù) 金砍。
page 代表 JSP 本身局蚀,只有在 JSP 頁面內(nèi)才是合法的 。 page 隱含對象本質(zhì)上包含當(dāng)前 Servlet 接口引用的變量恕稠,類似于 Java 編程中的 this 指針 琅绅。
exception 作用是顯示異常信息,只有在包含 isErrorPage="true" 的頁面中才可以被使用鹅巍,在一般的 JSP 頁面中使用該對象將無法編譯 JSP 文件 千扶。exception 對象和 Java 的所有對象一樣,都具有系統(tǒng)提供的繼承結(jié)構(gòu) 骆捧。exception 對象幾乎定義了所有異常情況 澎羞。 在 Java 程序中,可以使用 try/catch 關(guān)鍵字來處理異常情況敛苇; 如果在 JSP 頁面中出現(xiàn)沒有捕獲到的異常妆绞,就會生成 exception 對象,并把 exception 對象傳送到在 page 指令中設(shè)定的錯誤頁面中枫攀,然后在錯誤頁面中處理相應(yīng)的 exception 對象 括饶。

49 MVC 的各個部分都有那些技術(shù)來實現(xiàn)?

MVC 是 Model-View-Controller 的簡寫。

  • Model 代表的是應(yīng)用的業(yè)務(wù)邏輯( 通過 JavaBean来涨, EJB 組件實現(xiàn))图焰, * View 是應(yīng)用的表示面( 由 JSP 頁面產(chǎn)生);
  • Controller 是提供應(yīng)用的處理過程控制( 一般是一個 Servlet)蹦掐。

通過這種設(shè)計模型把應(yīng)用邏輯技羔, 處理過程和顯示邏輯分成不同的組件實現(xiàn)。 這些組件可以進(jìn)行交互和重用卧抗。

50 什么是 SOAP堕阔?選擇什么軟件來構(gòu)建 SOAP 應(yīng)用?

1颗味、
SOAP 是基于 XML 的簡易協(xié)議超陆,可使應(yīng)用程序在 HTTP 之上進(jìn)行信息交換∑致恚可用于訪問網(wǎng)絡(luò)服務(wù)的協(xié)議时呀。

SOAP 是 Web Service 三大要素之一。 Web Service 是一個平臺獨(dú)立的晶默,低耦合的谨娜,自包含的 、 基于可編程的 web 的應(yīng)用程序磺陡,可使用開放的 XML (標(biāo)準(zhǔn)通用標(biāo)記語言下的一個子集)標(biāo)準(zhǔn)來描述 趴梢、 發(fā)布 漠畜、 發(fā)現(xiàn) 、 協(xié)調(diào)和配置這些應(yīng)用程序坞靶,用于開發(fā)分布式的互操作的應(yīng)用程序 憔狞。

WebService 通過 HTTP 協(xié)議發(fā)送請求和接收結(jié)果時,發(fā)送的請求內(nèi)容和結(jié)果內(nèi)容都采用 XML 格式封裝彰阴,并增加了一些特定的 HTTP 消息頭瘾敢,以說明 HTTP 消息的內(nèi)容格式,這些特定的 HTTP 消息頭和 XML 內(nèi)容格式就是 SOAP 協(xié)議 尿这。SOAP 提供了標(biāo)準(zhǔn)的 RPC 方法來調(diào)用 Web Service簇抵。

SOAP 協(xié)議 = HTTP 協(xié)議 + XML 數(shù)據(jù)格式

SOAP 協(xié)議定義了 SOAP 消息的格式, SOAP 協(xié)議是基于 HTTP 協(xié)議的射众, SOAP 也是基于 XML 和 XSD 的碟摆, XML 是 SOAP 的數(shù)據(jù)編碼方式 。 打個比 喻: HTTP 就是普通公路叨橱, XML 就是中間的綠色隔離帶和兩邊的防護(hù)欄典蜕, SOAP 就是普通公路經(jīng)過加隔離帶和防護(hù)欄改造過的高速公路 。

2雏逾、Java 語言體系嘉裤,可以使用以下開源庫實現(xiàn) webservice 應(yīng)用:

  • Axis2。
  • Apche CXF栖博。
  • xfire屑宠。

51 面向?qū)ο缶幊痰谋举|(zhì)是什么?談?wù)勀銓γ嫦驅(qū)ο缶幊痰睦斫猓?/h1>

1仇让、以類的方式組織代碼典奉,以對象的方式封裝數(shù)據(jù)。
2丧叽、面向?qū)ο笫窍颥F(xiàn)實世界模型的自然延伸卫玖,這是一種 “ 萬物皆對象 ” 的編程思想 。 在現(xiàn)實生活中的任何物體都可以歸為一類事物踊淳,而每一個個體都是一類事物的實例 假瞬。 面向?qū)ο蟮木幊淌且詫ο鬄橹行模韵轵?qū)動迂尝,所以程序 = 對象 + 消息 脱茉。

面向?qū)ο笥腥筇匦裕庋b 垄开、 繼承和多態(tài) 琴许。

  • 封裝就是將一類事物的屬性和行為抽象成一個類,使其屬性私有化溉躲,行為公開化榜田,提高了數(shù)據(jù)的隱秘性的同時益兄,使代碼模塊化 。 這樣做使得代碼的復(fù)用性更高 箭券。

  • 繼承則是進(jìn)一步將一類事物共有的屬性和行為抽象成一個父類净捅,而每一個子類是一個特殊的父類 -- 有父類的行為和屬性,也有自己特有的行為和屬性 邦鲫。 這樣做擴(kuò)展了已存在的代碼塊灸叼,進(jìn)一步提高了代碼的復(fù)用性 神汹。

  • 如果說封裝和繼承是為了使代碼重用庆捺,那么多態(tài)則是為了實現(xiàn)接口重用 。 多態(tài)的一大作用就是為了解耦 -- 為了解除父子類繼承的耦合度 屁魏。 如果說繼承中父子類的關(guān)系式 IS-A 的關(guān)系滔以,那么接口和實現(xiàn)類之之間的關(guān)系式 HAS-A。 簡單來說氓拼,多態(tài)就是允許父類引用 ( 或接口 ) 指向子類 ( 或?qū)崿F(xiàn)類 ) 對象 你画。 很多的設(shè)計模式都是基于面向?qū)ο蟮亩鄳B(tài)性設(shè)計的 。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末桃漾,一起剝皮案震驚了整個濱河市坏匪,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌撬统,老刑警劉巖适滓,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異恋追,居然都是意外死亡凭迹,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進(jìn)店門苦囱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來嗅绸,“玉大人,你說我怎么就攤上這事撕彤∮沭” “怎么了?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵羹铅,是天一觀的道長蚀狰。 經(jīng)常有香客問我,道長睦裳,這世上最難降的妖魔是什么造锅? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮廉邑,結(jié)果婚禮上哥蔚,老公的妹妹穿的比我還像新娘倒谷。我一直安慰自己,他們只是感情好糙箍,可當(dāng)我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布渤愁。 她就那樣靜靜地躺著,像睡著了一般深夯。 火紅的嫁衣襯著肌膚如雪抖格。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天咕晋,我揣著相機(jī)與錄音雹拄,去河邊找鬼。 笑死掌呜,一個胖子當(dāng)著我的面吹牛滓玖,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播质蕉,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼势篡,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了模暗?” 一聲冷哼從身側(cè)響起禁悠,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎兑宇,沒想到半個月后碍侦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡顾孽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年祝钢,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片若厚。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡拦英,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出测秸,到底是詐尸還是另有隱情疤估,我是刑警寧澤,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布霎冯,位于F島的核電站铃拇,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏沈撞。R本人自食惡果不足惜慷荔,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望缠俺。 院中可真熱鬧显晶,春花似錦贷岸、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至唯笙,卻和暖如春螟蒸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背崩掘。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工七嫌, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人呢堰。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓抄瑟,卻偏偏與公主長得像凡泣,于是被迫代替她去往敵國和親枉疼。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,697評論 2 351

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

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法鞋拟,類相關(guān)的語法骂维,內(nèi)部類的語法,繼承相關(guān)的語法贺纲,異常的語法航闺,線程的語...
    子非魚_t_閱讀 31,602評論 18 399
  • (一)Java部分 1、列舉出JAVA中6個比較常用的包【天威誠信面試題】 【參考答案】 java.lang;ja...
    獨(dú)云閱讀 7,088評論 0 62
  • 轉(zhuǎn)自:http://blog.csdn.net/jackfrued/article/details/4492194...
    王帥199207閱讀 8,507評論 3 93
  • 文/望舒 很多我們以為一輩子都不會忘記的事情猴誊,就在我們念念不忘的日子里潦刃,被我們遺忘了 。 小T總是在我的面前...
    Y小姐故事館閱讀 543評論 0 0
  • 糊里糊涂的注冊了天天基金網(wǎng)懈叹,既來之則安之乖杠,選了幾個基金先觀察著,哪天有興趣了買一點試試澄成! 抓緊時間在節(jié)前把著急的確...
    適說心語閱讀 162評論 0 0