国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

Rumah Java JavaSoalan temu bual 常見java重點(diǎn)面試題分享

常見java重點(diǎn)面試題分享

Sep 30, 2020 pm 04:18 PM
java Soalan temu bual

常見java重點(diǎn)面試題分享

1、什么是Java虛擬機(jī)?為什么Java被稱作是“平臺(tái)無關(guān)的編程語言”?

(更多相關(guān)面試題推薦:java面試題及答案

java虛擬機(jī)是執(zhí)行字節(jié)碼文件(.class)的虛擬機(jī)進(jìn)程。。java源程序(.java)被編譯器編譯成字節(jié)碼文件(.class)。然后字節(jié)碼文件,將由java虛擬機(jī),解釋成機(jī)器碼(不同平臺(tái)的機(jī)器碼不同)。利用機(jī)器碼操作硬件和操作系統(tǒng)。因?yàn)椴煌钠脚_(tái)裝有不同的JVM,它們能夠?qū)⑾嗤?class文件,解釋成不同平臺(tái)所需要的機(jī)器碼。正是因?yàn)橛蠮VM的存在,java被稱為平臺(tái)無關(guān)的編程語言。

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

Java開發(fā)工具包(JDK)是完整的Java軟件開發(fā)包,包含了JRE,編譯器和其他的工具(比如:JavaDoc,Java調(diào)試器),可以讓開發(fā)者開發(fā)、編譯、執(zhí)行Java應(yīng)用程序。Java運(yùn)行時(shí)環(huán)境(JRE)。它包括Java虛擬機(jī)、Java核心類庫和支持文件。它不包含開發(fā)工具(JDK)、編譯器、調(diào)試器和其他工具。

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),所以概念上不適用。java中也不可以覆蓋private的方法,因?yàn)閜rivate修飾的變量和方法只能在當(dāng)前類中使用,如果是其他的類繼承當(dāng)前類是不能訪問到private變量或方法的,當(dāng)然也不能覆蓋。

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支持的數(shù)據(jù)類型包括兩種:一種是基本數(shù)據(jù)類型,包含byte,char, short, boolean ,int, long, float, double;另一種是引用類型:如String等,其實(shí)是對(duì)象的引用,JVM中虛擬棧中存的是對(duì)象的地址,創(chuàng)建的對(duì)象實(shí)質(zhì)在堆中,通過地址來找到堆中的對(duì)象的過程,即為引用類型。自動(dòng)裝箱就是Java編譯器在基本數(shù)據(jù)類型和對(duì)應(yīng)的對(duì)象包裝類型間的轉(zhuǎn)化,即int轉(zhuǎn)化為Integer,自動(dòng)拆箱是Integer調(diào)用其方法將其轉(zhuǎn)化為int的過程。

6.Java中的方法覆蓋(Overriding)和方法重載(Overloading)是什么意思?

Java中的方法重載發(fā)生在同一個(gè)類里面兩個(gè)或者是多個(gè)方法的方法名相同但是參數(shù)不同的情況。重載Override是一個(gè)類中多態(tài)性的一種表現(xiàn)。方法覆蓋是說子類重新定義了父類的方法。方法覆蓋必須有相同的方法名,參數(shù)列表和返回類型。覆蓋者可能不會(huì)限制它所覆蓋的方法的訪問。在java中,子類可繼承父類的方法,則不需要重新編寫相同的方法。但有時(shí)子類并不想原封不動(dòng)繼承父類的方法,而是想做一定的修改,這就采用方法重寫。方法重寫又稱方法覆蓋。

7.Java中,什么是構(gòu)造方法?什么是構(gòu)造方法重載?什么是復(fù)制構(gòu)造方法?

當(dāng)新對(duì)象被創(chuàng)建的時(shí)候,構(gòu)造方法會(huì)被調(diào)用。每一個(gè)類都有構(gòu)造方法。在程序員沒有給類提供構(gòu)造方法的情況下,Java編譯器會(huì)為這個(gè)類創(chuàng)建一個(gè)默認(rèn)的構(gòu)造方法。Java中構(gòu)造方法重載和方法重載很相似??梢詾橐粋€(gè)類創(chuàng)建多個(gè)構(gòu)造方法。每一個(gè)構(gòu)造方法必須有它自己唯一的參數(shù)列表。Java不支持復(fù)制構(gòu)造方法,如果你不自己寫構(gòu)造方法的情況下,Java不會(huì)創(chuàng)建默認(rèn)的復(fù)制構(gòu)造方法。

8. Java支持多繼承么?

Java中類不支持多繼承,只支持單繼承(即一個(gè)類只有一個(gè)父類)。但是java中的接口支持多繼承,,即一個(gè)子接口可以有多個(gè)父接口。(接口的作用是用來擴(kuò)展對(duì)象的功能,一個(gè)子接口繼承多個(gè)父接口,說明子接口擴(kuò)展了多個(gè)功能,當(dāng)類實(shí)現(xiàn)接口時(shí),類就擴(kuò)展了相應(yīng)的功能)。

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

從設(shè)計(jì)層面來說,抽象是對(duì)類的抽象,是一種模板設(shè)計(jì),接口是行為的抽象,是一種行為的規(guī)范。

Java提供和支持創(chuàng)建抽象類和接口。它們的實(shí)現(xiàn)有共同點(diǎn),不同點(diǎn)在于:

接口中所有的方法隱含的都是抽象的。而抽象類則可以同時(shí)包含抽象和非抽象的方法;類可以實(shí)現(xiàn)很多個(gè)接口,但是只能繼承一個(gè)抽象類;類可以不實(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. 什么是值傳遞和引用傳遞?

一般認(rèn)為,java內(nèi)的傳遞都是值傳遞. java中實(shí)例對(duì)象的傳遞是引用傳遞。

值傳遞是對(duì)基本型變量而言的,傳遞的是該變量的一個(gè)副本,改變副本不影響原變量;引用傳遞一般是對(duì)于對(duì)象型變量而言的,傳遞的是該對(duì)象地址的一個(gè)副本, 并不是原對(duì)象本身。

11. 進(jìn)程與線程的區(qū)別?

進(jìn)程是執(zhí)行著的應(yīng)用程序,是程序的一種動(dòng)態(tài)形式,是CPU、內(nèi)存等資源占用的基本單位,而且進(jìn)程之間相互獨(dú)立,通信比較困難,進(jìn)程在執(zhí)行過程中,包含比較固定的入口,執(zhí)行順序,出口;線程是進(jìn)程內(nèi)部的一個(gè)執(zhí)行序列,隸屬于某個(gè)進(jìn)程,一個(gè)進(jìn)程可以有多個(gè)線程,線程不能占有CPU、內(nèi)存等資源,而且線程之間共享一塊內(nèi)存區(qū)域,通信比較方便,線程的入口執(zhí)行順序這些過程被應(yīng)用程序所控制。

12. 創(chuàng)建線程有幾種不同的方式?你喜歡哪一種?為什么?

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

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

實(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)。

新建( new ):新創(chuàng)建了一個(gè)線程對(duì)象??蛇\(yùn)行( runnable ):線程對(duì)象創(chuàng)建后,其他線程(比如 main 線程)調(diào)用了該對(duì)象的start ()方法。該狀態(tài)的線程位于可運(yùn)行線程池中,等待被線程調(diào)度選中,獲取cpu的使用權(quán)。運(yùn)行( running ):可運(yùn)行狀態(tài)( runnable )的線程獲得了cpu時(shí)間片( timeslice ),執(zhí)行程序代碼。阻塞( block ):阻塞狀態(tài)是指線程因?yàn)槟撤N原因放棄了cpu使用權(quán),也即讓出了cpu timeslice ,暫時(shí)停止運(yùn)行。直到線程進(jìn)入可運(yùn)行( runnable )狀態(tài),才有機(jī)會(huì)再次獲得 cpu timeslice 轉(zhuǎn)到運(yùn)行( running )狀態(tài)。阻塞的情況分三種:

(一). 等待阻塞:運(yùn)行( running )的線程執(zhí)行 o.wait ()方法,JVM會(huì)把該線程放入等待隊(duì)列( waitting queue )中。

(二). 同步阻塞:運(yùn)行( running )的線程在獲取對(duì)象的同步鎖時(shí),若該同步鎖被別的線程占用,則 JVM 會(huì)把該線程放入鎖池( lock pool )中。

(三). 其他阻塞: 運(yùn)行( running )的線程執(zhí)行Thread.sleep ( long ms )或 t.join ()方法,或者發(fā)出了 I/O 請(qǐng)求時(shí),JVM會(huì)把該線程置為阻塞狀態(tài)。當(dāng) sleep ()狀態(tài)超時(shí)、join()等待線程終止或者超時(shí)、或者I/O 處理完畢時(shí),線程重新轉(zhuǎn)入可運(yùn)行( runnable )狀態(tài)。

死亡( dead ):線程run()、 main() 方法執(zhí)行結(jié)束,或者因異常退出了run()方法,則該線程結(jié)束生命周期。死亡的線程不可再次復(fù)生。

f0534600e1a8ccb0fe235321652d05d.png

14. 同步方法和同步代碼塊的區(qū)別是什么?

為何使用同步?
java允許多線程并發(fā)控制,當(dāng)多個(gè)線程同時(shí)操作一個(gè)可共享的資源變量時(shí)(增刪改查),將會(huì)導(dǎo)致數(shù)據(jù)的不準(zhǔn)確,相互之間產(chǎn)生沖突,因此加入同步鎖以避免在該線程沒有完成操作之前,被其他線程的調(diào)用,從而保證了該變量的唯一性和準(zhǔn)確性。

區(qū)別

同步方法默認(rèn)用this或者當(dāng)前類class對(duì)象作為鎖;同步代碼塊可以選擇以什么來加鎖,比同步方法要更細(xì)顆粒度,我們可以選擇只同步會(huì)發(fā)生同步問題的部分代碼而不是整個(gè)方法;同步方法使用關(guān)鍵字 synchronized修飾方法,而同步代碼塊主要是修飾需要進(jìn)行同步的代碼,用synchronized(object){代碼內(nèi)容}進(jìn)行修飾;

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) 程因==競(jìng)爭資源==而造成的一種僵局(互相等待),若無外力作用,這些進(jìn)程都將無法向前推進(jìn)。死鎖產(chǎn)生的4個(gè)必要條件:

互斥條件:進(jìn)程要求對(duì)所分配的資源(如打印機(jī))進(jìn)行排他性控制,即在一段時(shí)間內(nèi)某 資源僅為一個(gè)進(jìn)程所占有。此時(shí)若有其他進(jìn)程請(qǐng)求該資源,則請(qǐng)求進(jìn)程只能等待。不剝奪條件:進(jìn)程所獲得的資源在未使用完畢之前,不能被其他進(jìn)程強(qiáng)行奪走,即只能 由獲得該資源的進(jìn)程自己來釋放(只能是主動(dòng)釋放)。請(qǐng)求和保持條件:進(jìn)程已經(jīng)保持了至少一個(gè)資源,但又提出了新的資源請(qǐng)求,而該資源 已被其他進(jìn)程占有,此時(shí)請(qǐng)求進(jìn)程被阻塞,但對(duì)自己已獲得的資源保持不放。循環(huán)等待條件:存在一種進(jìn)程資源的==循環(huán)等待鏈==,鏈中每一個(gè)進(jìn)程已獲得的資源同時(shí)被鏈中下一個(gè)進(jìn)程所請(qǐng)求。

17. 如何確保N個(gè)線程可以訪問N個(gè)資源同時(shí)又不導(dǎo)致死鎖?

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

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í)例的
迭代方法。迭代器可以在迭代的過程中刪除底層集合的元素,但是不可以直接調(diào)用集合的
remove(Object Obj)刪除,可以通過迭代器的remove()方法刪除。

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ì)拋出這樣的異常。

33.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)。

34.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)重要的。

35.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è)遺留的類。

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

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ì)比較慢。

37. 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)長inkedList為每一個(gè)節(jié)點(diǎn)存儲(chǔ)了兩個(gè)引用,一個(gè)指向前一個(gè)元素,一個(gè)指向下一個(gè)元素。

38.Comparable和Comparator接口是干什么的?列出它們的區(qū)別。

Java提供了只包含一個(gè)compareTo()方法的Comparable接口。這個(gè)方法可以個(gè)給兩個(gè)對(duì)象排序。具體來說,它返回負(fù)數(shù),0,正數(shù)來表明已經(jīng)存在的對(duì)象小于,等于,大于輸入對(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。

Comparable & Comparator 都是用來實(shí)現(xiàn)集合中元素的比較、排序的,只是?Comparable是在集合內(nèi)部定義的方法實(shí)現(xiàn)的排序,Comparator 是在集合外部實(shí)現(xiàn)的排序,所以,如想實(shí)現(xiàn)排序,就需要在集合外定義 Comparator 接口的方法或在集合內(nèi)實(shí)現(xiàn) Comparable 接口的方法。 Comparator位于包java.util下,而Comparable位于包 java.lang下 Comparable 是一個(gè)對(duì)象本身就已經(jīng)支持自比較所需要實(shí)現(xiàn)的接口(如 String、Integer 自己就可以完成比較大小操作,已經(jīng)實(shí)現(xiàn)了Comparable接口) 自定義的類要在加入list容器中后能夠排序,可以實(shí)現(xiàn)Comparable接口,在用Collections類的sort方法排序時(shí),如果不指定Comparator,那么就以自然順序排序, 這里的自然順序就是實(shí)現(xiàn)Comparable接口設(shè)定的排序方式。?

而 Comparator 是一個(gè)專用的比較器,當(dāng)這個(gè)對(duì)象不支持自比較或者自比較函數(shù)不能滿足你的要求時(shí),你可以寫一個(gè)比較器來完成兩個(gè)對(duì)象之間大小的比較。 可以說一個(gè)是自已完成比較,一個(gè)是外部程序?qū)崿F(xiàn)比較的差別而已。 用 Comparator 是策略模式(strategy design pattern),就是不改變對(duì)象自身,而用一個(gè)策略對(duì)象(strategy object)來改變它的行為。 比如:你想對(duì)整數(shù)采用絕對(duì)值大小來排序,Integer 是不符合要求的,你不需要去修改 Integer 類(實(shí)際上你也不能這么做)去改變它的排序行為,只要使用一個(gè)實(shí)現(xiàn)了 Comparator 接口的對(duì)象來實(shí)現(xiàn)控制它的排序就行了。

39.什么是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))。

40.你了解大O符號(hào)(big-O notation)么?你能給出不同數(shù)據(jù)結(jié)構(gòu)的例子么?

大O符號(hào)描述了當(dāng)數(shù)據(jù)結(jié)構(gòu)里面的元素增加的時(shí)候,算法的規(guī)模或者是一個(gè)漸進(jìn)上界 。
大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è)很好的說明。

41.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來說是不可能的。

42.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)。

43.Java中垃圾回收有什么目的?什么時(shí)候進(jìn)行垃圾回收?

垃圾回收是在內(nèi)存中存在沒有引用的對(duì)象或超過作用域的對(duì)象時(shí)進(jìn)行。
垃圾回收的目的是識(shí)別并且丟棄應(yīng)用不再使用的對(duì)象來釋放和重用資源。

44.System.gc()和Runtime.gc()會(huì)做什么事情?

這兩個(gè)方法用來提示JVM要進(jìn)行垃圾回收。但是,立即開始還是延遲進(jìn)行垃圾回收是取決于JVM的。

45.finalize()方法什么時(shí)候被調(diào)用?析構(gòu)函數(shù)(finalization)的目的是什么?

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

調(diào)用時(shí)機(jī):當(dāng)垃圾回收器要宣告一個(gè)對(duì)象死亡時(shí),至少要經(jīng)過兩次標(biāo)記過程:如果對(duì)象在進(jìn)行可達(dá)性分析后發(fā)現(xiàn)沒有和GC Roots相連接的引用鏈,就會(huì)被第一次標(biāo)記,并且判斷是否執(zhí)行finalizer( )方法,如果對(duì)象覆蓋finalizer( )方法且未被虛擬機(jī)調(diào)用過,那么這個(gè)對(duì)象會(huì)被放置在F-Queue隊(duì)列中,并在稍后由一個(gè)虛擬機(jī)自動(dòng)建立的低優(yōu)先級(jí)的Finalizer線程區(qū)執(zhí)行觸發(fā)finalizer( )方法,但不承諾等待其運(yùn)行結(jié)束。

(推薦教程:java課程

finalization的目的:對(duì)象逃脫死亡的最后一次機(jī)會(huì)。(只要重新與引用鏈上的任何一個(gè)對(duì)象建立關(guān)聯(lián)即可。)但是不建議使用,運(yùn)行代價(jià)高昂,不確定性大,且無法保證各個(gè)對(duì)象的調(diào)用順序??捎胻ry-finally或其他替代。

46.如果對(duì)象的引用被置為null,垃圾收集器是否會(huì)立即釋放對(duì)象占用的內(nèi)存?

不會(huì),在下一個(gè)垃圾回收周期中,這個(gè)對(duì)象將是可被回收的。

不會(huì)立即釋放對(duì)象占用的內(nèi)存。 如果對(duì)象的引用被置為null,只是斷開了當(dāng)前線程棧幀中對(duì)該對(duì)象的引用關(guān)系,而 垃圾收集器是運(yùn)行在后臺(tái)的線程,只有當(dāng)用戶線程運(yùn)行到安全點(diǎn)(safe point)或者安全區(qū)域才會(huì)掃描對(duì)象引用關(guān)系,掃描到對(duì)象沒有被引用則會(huì)標(biāo)記對(duì)象,這時(shí)候仍然不會(huì)立即釋放該對(duì)象內(nèi)存,因?yàn)橛行?duì)象是可恢復(fù)的(在 finalize方法中恢復(fù)引用 )。只有確定了對(duì)象無法恢復(fù)引用的時(shí)候才會(huì)清除對(duì)象內(nèi)存。

47.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)存空間。

永久代是用于存放靜態(tài)文件,如Java類、方法等。持久代對(duì)垃圾回收沒有顯著影響,但是有些應(yīng)用可能動(dòng)態(tài)生成或者調(diào)用一些class,例如Hibernate 等,在這種時(shí)候需要設(shè)置一個(gè)比較大的持久代空間來存放這些運(yùn)行過程中新增的類,永久代中一般包含:
類的方法(字節(jié)碼…)
類名(Sring對(duì)象)
.class文件讀到的常量信息
class對(duì)象相關(guān)的對(duì)象列表和類型列表 (e.g., 方法對(duì)象的array).
JVM創(chuàng)建的內(nèi)部對(duì)象
JIT編譯器優(yōu)化用的信息

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

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

49.在Java中,對(duì)象什么時(shí)候可以被垃圾回收?

當(dāng)一個(gè)對(duì)象到GC Roots不可達(dá)時(shí),在下一個(gè)垃圾回收周期中嘗試回收該對(duì)象,如果該對(duì)象重寫了finalize()方法,并在這個(gè)方法中成功自救(將自身賦予某個(gè)引用),那么這個(gè)對(duì)象不會(huì)被回收。但如果這個(gè)對(duì)象沒有重寫finalize()方法或者已經(jīng)執(zhí)行過這個(gè)方法,也自救失敗,該對(duì)象將會(huì)被回收。

50.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ū))

51.Java中的兩種異常類型是什么?他們有什么區(qū)別?

Java中有兩種異常:受檢查的(checked)異常和不受檢查的(unchecked)異常。不受檢查的異常不需要在方法或者是構(gòu)造函數(shù)上聲明,就算方法或者是構(gòu)造函數(shù)的執(zhí)行可能會(huì)拋出這樣的異常,并且不受檢查的異??梢詡鞑サ椒椒ɑ蛘呤菢?gòu)造函數(shù)的外面。相反,受檢查的異常必須要用throws語句在方法或者是構(gòu)造函數(shù)上聲明。這里有Java異常處理的一些小建議。

Throwable包含了錯(cuò)誤(Error)和異常(Excetion兩類)
Exception又包含了運(yùn)行時(shí)異常(RuntimeException, 又叫非檢查異常)和非運(yùn)行時(shí)異常(又叫檢查異常)
(1) Error是程序無法處理了, 如果OutOfMemoryError等, 這些異常發(fā)生時(shí), java虛擬機(jī)一般會(huì)終止線程 .
(2) 運(yùn)行時(shí)異常都是RuntimeException類及其子類,如 NullPointerException、IndexOutOfBoundsException等, 這些異常是不檢查的異常, 是在程序運(yùn)行的時(shí)候可能會(huì)發(fā)生的, 所以程序可以捕捉, 也可以不捕捉. 這些錯(cuò)誤一般是由程序的邏輯錯(cuò)誤引起的, 程序應(yīng)該從邏輯角度去盡量避免.
(3) 檢查異常是運(yùn)行時(shí)異常以外的異常, 也是Exception及其子類, 這些異常從程序的角度來說是必須經(jīng)過捕捉檢查處理的, 否則不能通過編譯. 如IOException、SQLException等。

52.Java中Exception和Error有什么區(qū)別?

Exception和Error都是Throwable的子類。Exception用于用戶程序可以捕獲的異常情況。Error定義了不期望被用戶程序捕獲的異常。

53.throw和throws有什么區(qū)別?

throw關(guān)鍵字用來在程序中明確的拋出異常,相反,throws語句用來表明方法不能處理的異常。每一個(gè)方法都必須要指定哪些異常不能處理,所以方法的調(diào)用者才能夠確保處理可能發(fā)生的異常,多個(gè)異常是用逗號(hào)分隔的。

1、Throw用于方法內(nèi)部,Throws用于方法聲明上;
2、Throw后跟異常對(duì)象,Throws后跟異常類型;
3、Throw后只能跟一個(gè)異常對(duì)象,Throws后可以一次聲明多種異常類型。

54. 異常處理完成以后,Exception對(duì)象會(huì)發(fā)生什么變化?、

Exception對(duì)象會(huì)在下一個(gè)垃圾回收過程中被回收掉。

55. finally代碼塊和finalize()方法有什么區(qū)別?

無論是否拋出異常,finally代碼塊都會(huì)執(zhí)行,它主要是用來釋放應(yīng)用占用的資源。finalize()方法是Object類的一個(gè)protected方法,它是在對(duì)象被垃圾回收之前由Java虛擬機(jī)來調(diào)用的。

56. 什么是Applet?

java applet是能夠被包含在HTML頁面中并且能被啟用了java的客戶端瀏覽器執(zhí)行的程序。Applet主要用來創(chuàng)建動(dòng)態(tài)交互的web應(yīng)用程序。

57. 解釋一下Applet的生命周期。

applet可以經(jīng)歷下面的狀態(tài):
Init:每次被載入的時(shí)候都會(huì)被初始化。
Start:開始執(zhí)行applet。
Stop:結(jié)束執(zhí)行applet。
Destroy:卸載applet之前,做最后的清理工作。

58. 當(dāng)applet被載入的時(shí)候會(huì)發(fā)生什么?

首先,創(chuàng)建applet控制類的實(shí)例,然后初始化applet,最后開始運(yùn)行。

59. 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)用一般使用比較寬松的安全策略。

60. Java applet有哪些限制條件?

主要是由于安全的原因,給applet施加了以下的限制:
applet不能夠載入類庫或者定義本地方法;不能在宿主機(jī)上讀寫文件;不能讀取特定的系統(tǒng)屬性;不能發(fā)起網(wǎng)絡(luò)連接,除非是跟宿主機(jī);不能夠開啟宿主機(jī)上其他任何的程序。

61. 什么是不受信任的applet?

不受信任的applet是不能訪問或是執(zhí)行本地系統(tǒng)文件的Java applet,默認(rèn)情況下,所有下載的applet都是不受信任的。

62. 從網(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)。

63. 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ù)是正確的。

64. applet安全管理器是什么?它會(huì)做哪些工作?

applet安全管理器是給applet施加限制條件的一種機(jī)制。瀏覽器可以只有一個(gè)安全管理器。安全管理器在啟動(dòng)的時(shí)候被創(chuàng)建,之后不能被替換覆蓋或者是擴(kuò)展。

65. 彈出式選擇菜單(Choice)和列表(List)有什么區(qū)別?

Choice是以一種緊湊的形式展示的,需要下拉才能看到所有的選項(xiàng)。Choice中一次只能選中一個(gè)選項(xiàng)。List同時(shí)可以有多個(gè)元素可見,支持選中一個(gè)或者多個(gè)元素。

66. 什么是布局管理器?

布局管理器用來在容器中組織組件。

67. 滾動(dòng)條(Scrollbar)和滾動(dòng)面板(JScrollPane)有什么區(qū)別?

Scrollbar是一個(gè)組件,不是容器。而ScrollPane是容器。ScrollPane自己處理滾動(dòng)事件。

68. 哪些Swing的方法是線程安全的?

只有3個(gè)線程安全的方法: repaint(), revalidate(), and invalidate()。

69. 說出三種支持重繪(painting)的組件。

Canvas, Frame, Panel,和Applet支持重繪。

70. 什么是JDBC?

JDBC是允許用戶在不同數(shù)據(jù)庫之間做選擇的一個(gè)抽象層。JDBC允許開發(fā)者用JAVA寫數(shù)據(jù)庫應(yīng)用程序,而不需要關(guān)心底層特定數(shù)據(jù)庫的細(xì)節(jié)。

JDBC(Java DataBase Connectivity),是一套面向?qū)ο蟮膽?yīng)用程序接口(API),制定了統(tǒng)一的訪問各類關(guān)系數(shù)據(jù)庫的標(biāo)準(zhǔn)接口,為各個(gè)數(shù)據(jù)庫廠商提供了標(biāo)準(zhǔn)的實(shí)現(xiàn)。通過JDBC技術(shù),開發(fā)人員可以用純Java語言和標(biāo)準(zhǔn)的SQL語句編寫完整的數(shù)據(jù)庫應(yīng)用程序,并且真正地實(shí)現(xiàn)了軟件的跨平臺(tái)性。
通常情況下使用JDBC完成以下操作:
1.同數(shù)據(jù)庫建立連接;
2.向數(shù)據(jù)庫發(fā)送SQL語句;
3.處理從數(shù)據(jù)庫返回的結(jié)果;
JDBC具有下列優(yōu)點(diǎn):
1.JDBC與ODBC(Open Database Connectivity,即開放數(shù)據(jù)庫互連)十分相似,便于軟件開發(fā)人員理解;
2.JDBC使軟件開發(fā)人員從復(fù)雜的驅(qū)動(dòng)程序編寫工作中解脫出來,可以完全專注于業(yè)務(wù)邏輯開發(fā);
3.JDBC支持多種關(guān)系型數(shù)據(jù)庫,大大增加了軟件的可移植性;
4.JDBC API是面向?qū)ο蟮模浖_發(fā)人員可以將常用的方法進(jìn)行二次封裝,從而提高代碼的重用性;

71. 數(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)求。

72. 讓RMI程序能正確運(yùn)行有哪些步驟?

為了讓RMI程序能正確運(yùn)行必須要包含以下幾個(gè)步驟:
編譯所有的源文件。
使用rmic生成stub。
啟動(dòng)rmiregistry。
啟動(dòng)RMI服務(wù)器。
運(yùn)行客戶端程序。

73. 解釋下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。

74. 解釋下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ì)象的相反的步驟。

75. 什么是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)信息。

76. 說一下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ù)。

77. 什么是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的集合。

78. 如何知道是哪一個(gè)客戶端的機(jī)器正在請(qǐng)求你的Servlet?

ServletRequest類可以找出客戶端機(jī)器的IP地址或者是主機(jī)名。getRemoteAddr()方法獲取客戶端主機(jī)的IP地址,getRemoteHost()可以獲取主機(jī)名。

79. 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é)組成的。

80. 什么是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)該能正常工作??蛻舳丝梢赃x擇禁用cookie,但是,session仍然是能夠工作的,因?yàn)榭蛻舳藷o法禁用服務(wù)端的session。
在存儲(chǔ)的數(shù)據(jù)量方面session和cookies也是不一樣的。session能夠存儲(chǔ)任意的Java對(duì)象,cookie只能存儲(chǔ)String類型的對(duì)象。

81. 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ā)送給客戶端。

82. 封裝的定義和好處有哪些?

封裝給對(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é)和示例。

或:

一是用private把類的細(xì)節(jié)與外界隔離起來,從而實(shí)現(xiàn)數(shù)據(jù)項(xiàng)和方法的隱藏,而要訪問這些數(shù)據(jù)項(xiàng)和方法唯一的途徑就是通過類本身,類才有資格調(diào)用它所擁有的資源(方法,數(shù)據(jù)項(xiàng)屬性等等)。所以第一個(gè)好處就是數(shù)據(jù)的安全性提高了。
二是通過隱藏隔離,只允許外部對(duì)類做有限的訪問,開發(fā)者可以自由的改變類的內(nèi)部實(shí)現(xiàn),而無需修改使用該類的那些程序。只要那些在類外部就能被調(diào)用的方法保持其外部特征不變,內(nèi)部代碼就可以自由改變,各取所需,利于分工。
三就是提高了代碼的重用性,封裝成工具類以后能夠減少很多繁瑣的步驟。

83.抽象的定義?抽象和封裝的不同點(diǎn)?

抽象是把想法從具體的實(shí)例中分離出來的步驟,因此,要根據(jù)他們的功能而不是實(shí)現(xiàn)細(xì)節(jié)來創(chuàng)建類。Java支持創(chuàng)建只暴漏接口而不包含方法實(shí)現(xiàn)的抽象的類。這種抽象技術(shù)的主要目的是把類的行為和實(shí)現(xiàn)細(xì)節(jié)分離開。抽象和封裝是互補(bǔ)的概念。一方面,抽象關(guān)注對(duì)象的行為。另一方面,封裝關(guān)注對(duì)象行為的細(xì)節(jié)。一般是通過隱藏對(duì)象內(nèi)部狀態(tài)信息做到封裝,因此,封裝可以看成是用來提供抽象的一種策略。

相關(guān)推薦:java入門

Atas ialah kandungan terperinci 常見java重點(diǎn)面試題分享. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Tutorial PHP
1502
276
Bagaimana menangani transaksi di Java dengan JDBC? Bagaimana menangani transaksi di Java dengan JDBC? Aug 02, 2025 pm 12:29 PM

Untuk mengendalikan transaksi JDBC dengan betul, anda mesti terlebih dahulu mematikan mod komit automatik, kemudian melakukan pelbagai operasi, dan akhirnya melakukan atau mengembalikan semula hasilnya; 1. Panggil Conn.SetAutOcommit (palsu) untuk memulakan transaksi; 2. Melaksanakan pelbagai operasi SQL, seperti memasukkan dan mengemaskini; 3. Panggil Conn.Commit () jika semua operasi berjaya, dan hubungi conn.rollback () jika pengecualian berlaku untuk memastikan konsistensi data; Pada masa yang sama, cuba-dengan-sumber harus digunakan untuk menguruskan sumber, mengendalikan pengecualian dengan betul dan menutup sambungan untuk mengelakkan kebocoran sambungan; Di samping itu, adalah disyorkan untuk menggunakan kolam sambungan dan menetapkan mata simpan untuk mencapai rollback separa, dan menyimpan urus niaga sesingkat mungkin untuk meningkatkan prestasi.

Bagaimana untuk bekerja dengan kalendar di Jawa? Bagaimana untuk bekerja dengan kalendar di Jawa? Aug 02, 2025 am 02:38 AM

Gunakan kelas dalam pakej Java.Time untuk menggantikan kelas lama dan kelas kalendar; 2. Dapatkan tarikh dan masa semasa melalui LocalDate, LocalDateTime dan Tempatan Tempatan; 3. Buat tarikh dan masa tertentu menggunakan kaedah (); 4. Gunakan kaedah tambah/tolak untuk meningkatkan dan mengurangkan masa; 5. Gunakan zoneddatetime dan zonid untuk memproses zon waktu; 6. Format dan parse date string melalui DateTimeFormatter; 7. Gunakan segera untuk bersesuaian dengan jenis tarikh lama apabila perlu; pemprosesan tarikh di java moden harus memberi keutamaan untuk menggunakan java.timeapi, yang memberikan jelas, tidak berubah dan linear

Membandingkan kerangka Java: Spring Boot vs Quarkus vs Micronaut Membandingkan kerangka Java: Spring Boot vs Quarkus vs Micronaut Aug 04, 2025 pm 12:48 PM

Pra-formancetartuptimemoryusage, quarkusandmicronautleadduetocompile-timeprocessingandgraalvsupport, withquarkusoftenperforminglightbetterine serverless scenarios.tyvelopecosyste,

Memahami Pelabuhan Rangkaian dan Firewall Memahami Pelabuhan Rangkaian dan Firewall Aug 01, 2025 am 06:40 AM

NetworkPortsandFireWallSworkTogethertoenableCommunicationWileensuringsecurity.1.networkportsarevirtualendpointsNumbered0-655 35, Withwell-KnownportsLike80 (http), 443 (https), 22 (ssh), dan25 (smtp) identitispecificservices.2.portsoperateovertcp (boleh dipercayai, c

Bagaimana pengumpulan sampah berfungsi di java? Bagaimana pengumpulan sampah berfungsi di java? Aug 02, 2025 pm 01:55 PM

Koleksi Sampah Java (GC) adalah mekanisme yang secara automatik menguruskan ingatan, yang mengurangkan risiko kebocoran ingatan dengan menuntut semula objek yang tidak dapat dicapai. 1.GC menghakimi kebolehcapaian objek dari objek akar (seperti pembolehubah stack, benang aktif, medan statik, dan lain -lain), dan objek yang tidak dapat dicapai ditandakan sebagai sampah. 2. Berdasarkan algoritma penandaan tanda, tandakan semua objek yang dapat dicapai dan objek yang tidak ditandai. 3. Mengamalkan strategi pengumpulan generasi: Generasi Baru (Eden, S0, S1) sering melaksanakan MinorGC; Orang tua melakukan kurang tetapi mengambil masa lebih lama untuk melakukan MajorGC; Metaspace Stores Metadata kelas. 4. JVM menyediakan pelbagai peranti GC: SerialGC sesuai untuk aplikasi kecil; ParallelGC meningkatkan throughput; CMS mengurangkan

Membandingkan Java Build Tools: Maven vs Gradle Membandingkan Java Build Tools: Maven vs Gradle Aug 03, 2025 pm 01:36 PM

GradleisthebetterChoiceFormostNewProjectSduetoitSsuperiorflexibility, Prestasi, danModernToolingSupport.1.Gradle'sGroovy/KOT lindslismoreconciseandexpressivethanmaven'sverbosexml.2.GradleOutPerformsMaveninBuildSpeedWithIncrementalcompilation, BuildCac

Pergi dengan contoh penangguhan yang dijelaskan Pergi dengan contoh penangguhan yang dijelaskan Aug 02, 2025 am 06:26 AM

Defer digunakan untuk melaksanakan operasi tertentu sebelum fungsi pulangan, seperti sumber pembersihan; Parameter dinilai dengan serta-merta apabila menangguhkan, dan fungsi-fungsi dilaksanakan mengikut urutan terakhir (LIFO); 1. Pelbagai penahanan dilaksanakan dalam urutan terbalik pengisytiharan; 2. Biasanya digunakan untuk pembersihan yang selamat seperti penutupan fail; 3. Nilai pulangan yang dinamakan boleh diubah suai; 4. Ia akan dilaksanakan walaupun panik berlaku, sesuai untuk pemulihan; 5. Elakkan penyalahgunaan menangguhkan gelung untuk mengelakkan kebocoran sumber; Penggunaan yang betul boleh meningkatkan keselamatan kod dan kebolehbacaan.

Menggunakan jenis html `input` untuk data pengguna Menggunakan jenis html `input` untuk data pengguna Aug 03, 2025 am 11:07 AM

Memilih jenis htmlinput yang betul dapat meningkatkan ketepatan data, meningkatkan pengalaman pengguna, dan meningkatkan kebolehgunaan. 1. Pilih jenis input yang sepadan mengikut jenis data, seperti teks, e -mel, tel, nombor dan tarikh, yang secara automatik boleh menyemak dan menyesuaikan diri dengan papan kekunci; 2. Gunakan HTML5 untuk menambah jenis baru seperti URL, Warna, Julat dan Carian, yang dapat memberikan kaedah interaksi yang lebih intuitif; 3. Gunakan pemegang tempat dan sifat -sifat yang diperlukan untuk meningkatkan kecekapan dan ketepatan pengisian bentuk, tetapi harus diperhatikan bahawa pemegang tempat tidak dapat menggantikan label.

See all articles