Java面試

1.什麼是Java虛擬機?爲什麼Java被稱爲平臺無關的編程語言?

java虛擬機是一個可以執行字節碼文件(.class)的虛擬機進程。
爲什麼java與平臺無關呢?因爲java源程序(.java)首先被編譯器編譯成字節碼文件(.class),然後java虛擬機將字節碼文件解釋成機器碼。而不同的操作平臺,裝有不同的java虛擬機(JVM),能夠將相同的字節碼文件(.class)解釋爲對應平臺所需要的機器碼。所以,java是一種與平臺無關的編程語言。

2.JDK和JRE的區別是什麼?

JDK是完整的Java軟件開發包,包括編譯器、Java運行時環境和其它的工具(比如:JavaDoc,Java調試器),可以讓開發者開發、編譯、執行Java應用程序。
JRE是Java運行時環境,它是JDK的一個組成部分,只包括Java虛擬機、Java核心類庫和支持文件。

3.可否在static環境中訪問非static變量?

static變量在Java中是屬於類的,它在所有的實例中的值是一樣的。當類被Java虛擬機載入的時候,會對static變量進行初始化。如果代碼嘗試不用實例來訪問非static的變量,編譯器會報錯,因爲這些變量還沒有被創建出來,還沒有跟任何實例關聯上。

4.Java支持的數據類型有哪些?什麼是自動拆裝箱?

支持類型
Java支持8種基本數據類型:
其中整數值型有四種:byte,short,int,long,
字符型一種:char
浮點類型兩種:float,double
布爾型一種:boolean
整數默認int型,小數默認是double型。Float和long類型的必須加後綴。
Java還支持引用數據類型,引用類型包括類、接口、數組等。引用類型聲明的變量是指該變量在內存中實際存儲的是一個引用地址,實體在堆中。而包裝類就屬於引用類型。

自動拆裝箱
自動裝箱和拆箱就是基本類型和引用類型之間的轉換,轉換的目的是因爲基本類型轉換爲引用類型後,就可以new對象,從而調用包裝類中封裝好的方法進行基本類型之間的轉換或者toString,還有就是如果集合中想存放基本類型,泛型的限定類型只能是對應的包裝類型。

5.“static”關鍵字是什麼意思?Java中是否可以覆蓋(override)一個private或者是static的方法?

“static”關鍵字表明一個成員變量或者是成員方法可以在沒有所屬類的實例變量的情況下被訪問。
Java中static方法不能被覆蓋,因爲static方法是編譯時靜態綁定的,而方法覆蓋是基於運行時動態綁定的。static方法跟類的任何實例都不相關,所以概念上不適用。
java中也不可以覆蓋private的方法,因爲private修飾的變量和方法只能在當前類中使用,如果是其他的類繼承當前類是不能訪問到private變量或方法的,當然也不能覆蓋。

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

方法覆蓋
Java中方法覆蓋(Overriding)是指子類重新定義了父類的方法。方法覆蓋必須有相同的方法名,參數列表和返回類型。覆蓋者可能不會限制它所覆蓋的方法的訪問。重寫方法不能爲private,運用中最典型的就是對接口方法的覆蓋。
方法重載
Java中方法重載(Overloading)就是具有相同函數名,返回類型可以不同,參數個數、順序、類型不同的函數。Overloading發生在同一個類裏面具有兩個或者是更多的函數具有相同名字的情況下。

7.Java中,什麼是構造函數?什麼是構造函數重載?什麼是複製構造函數?

構造函數是對象被創建時初始化對象的成員方法,它具有和它所在的類完全一樣的名字。構造函數只能有入口參數,沒有返回類型,因爲一個類的構造方法的返回類就是類本身。構造函數定義後,創建對象時就會自動調用它,對新創建的對象分配內存空間和初始化。每一個類都有構造函數。在程序員沒有給類提供構造函數的情況下,Java編譯器會爲這個類創建一個默認的構造函數。
方法名稱相同,參數項不相同。那麼認爲一個方法是另一個方法的重載方法。重載只跟參數有關,與返回類型無關。方法名和參數相同而返回類型不相同,不能說是重載。
構造方法重載是方法重載的一個典型的特例。參數列表不同。

8.Java爲什麼不支持多繼承?

Java中類不支持多繼承,因爲兩個繼承於中一個父類的子類,被同一個子類繼承時,會出現方法的引用歧義,所以Java中只支持單繼承,即一個類只有一個父類。
java中的接口支持多繼承,即一個子接口可以有多個父接口。接口的作用是用來擴展對象的功能,一個子接口繼承多個父接口,說明子接口擴展了多個功能,當類實現接口時,類就擴展了相應的功能。

9.什麼是值傳遞和引用傳遞?

值傳遞
值傳遞:(形式參數類型是基本數據類型):方法調用時,實際參數把它的值傳遞給對應的形式參數,形式參數只是用實際參數的值初始化自己的存儲單元內容,是兩個不同的存儲單元,所以方法執行中形式參數值的改變不影響實際參數的值。
引用傳遞
引用傳遞:(形式參數類型是引用數據類型參數):也稱爲傳地址。方法調用時,實際參數是對象(或數組),這時實際參數與形式參數指向同一個地址,在方法執行中,對形式參數的操作實際上就是對實際參數的操作,這個結果在方法結束後被保留了下來,所以方法執行中形式參數的改變將會影響實際參數。

10.接口和抽象類的區別是什麼?

接口是對動作的抽象,抽象類是對根源的抽象。
抽象類表示的是,這個對象是什麼。接口表示的是,這個對象能做什麼。比如,大貓,小貓,來定義兩個類,他們的抽象類是貓。說明,他們都是貓。貓可以奔跑,狗也可以奔跑,把“奔跑”定義成一個接口,然後讓這些類去實現它。
所以,在高級語言上,一個類只能繼承一個類(抽象類)(正如貓不可能同時是動物和植物),但是可以實現多個接口(吃奔跑口、跳躍接口)。
區別如下:
1、抽象類和接口都不能直接實例化,如果要實例化,抽象類變量必須指向實現所有抽象方法的子類對象,接口變量必須指向實現所有接口方法的類對象。
2、抽象類要被子類繼承,接口要被類實現。
3、接口只能做方法申明,抽象類中可以做方法申明,也可以做方法實現。
4、接口裏定義的變量只能是公共的靜態的常量,抽象類中的變量是普通變量。
5、抽象類裏的抽象方法必須全部被子類所實現,如果子類不能全部實現父類抽象方法,那麼該子類只能是抽象類。同樣,一個實現接口的時候,如不能全部實現接口方法,那麼該類也只能爲抽象類。
6、抽象方法只能申明,不能實現,接口是設計的結果 ,抽象類是重構的結果。
7、抽象類裏可以沒有抽象方法。
8、如果一個類裏有抽象方法,那麼這個類只能是抽象類。
9、抽象方法要被實現,所以不能是靜態的,也不能是私有的。
10、接口可繼承接口,並可多繼承接口,但類只能單根繼承。

11.解釋一下線程和進程

進程是具有一定獨立功能的程序關於某個數據集合上的一次運行活動,進程是系統進行資源分配和調度的一個獨立單位。
線程是進程的一個實體,是CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位.線程自己基本上不擁有系統資源,只擁有一點在運行中必不可少的資源,如程序計數器,一組寄存器和棧,但是線程可以與同一個進程種其它的線程共享進程的全部資源。

12.進程與線程有什麼區別?

1、線程的劃分尺度小於進程,使得多線程程序的併發性高。
2、進程在執行過程中擁有獨立的內存單元,而多個線程共享內存,從而極大地提高了程序的運行效率。
3、每個獨立的線程有一個程序運行的入口、順序執行序列和程序的出口。但是線程不能夠獨立執行,必須依存在應用程序中,由應用程序提供多個線程執行控制。
4、一個進程崩潰後,在保護模式下不會對其它進程產生影響。線程只是一個進程的不同執行路徑,線程有自己的堆棧和局部變量,但線程之間沒有單獨的地址空間,一個線程死掉就等於整個進程死掉。

13.創建線程有幾種不同的方式?

線程的創建方式有下面三種:
1、繼承Thread類(真正意義上的線程類),是Runnable接口的實現。
2、實現Runnable接口,並重寫裏面的run方法。
3、使用Executor框架創建線程池。
其中實現Runnable接口這種方式更受歡迎,因爲這不需要繼承Thread類。在應用設計中已經繼承了別的對象的情況下,這需要多繼承(而Java不支持多繼承),只能實現接口。同時,線程池也是非常高效的,很容易實現和使用。


14.線程的幾種可用狀態分別是什麼?


1.新建(new)
新創建了一個線程對象。
2.可運行(runnable)
線程對象創建後,其他線程(比如main線程)調用了該對象的start()方法。該狀態的線程位於可運行線程池中,等待被線程調度選中,獲取cpu的使用權。
3.運行(running)
可運行狀態(runnable)的線程獲得了cpu時間片(timeslice),執行程序代碼。
4.阻塞(block)
阻塞狀態是指線程因爲某種原因放棄了cpu使用權,也即讓出了cpu timeslice,暫時停止運行。直到線程進入可運行(runnable)狀態,纔有 機會再次獲得cpu timeslice轉到運行(running)狀態。阻塞的情況分三種:
a、等待阻塞:運行(running)的線程執行o.wait()方法,JVM會把該線程放入等待隊列(waitting queue)中。
b、同步阻塞:運行(running)的線程在獲取對象的同步鎖時,若該同步鎖 被別的線程佔用,則JVM會把該線程放入鎖池(lock pool)中。
c、其他阻塞: 運行(running)的線程執行Thread.sleep(long ms)或t.join()方法或者發出了I/O請求時,JVM會把該線程置爲阻塞狀態。當sleep()狀態超時、join()等待線程終止或者超時或者I/O處理完畢時,線程重新轉入可運行(runnable)狀態。
5.死亡(dead)
線程run()、main()方法執行結束,或者因異常退出了run()方法,則該線程結束生命週期。死亡的線程不可再次復生。


15.同步方法和同步代碼塊的區別是什麼?


定義
同步方法是指有synchronized關鍵字修飾的方法。由於java的每個對象都有一個內置鎖,當用此關鍵字修飾方法時,內置鎖會保護整個方法。在調用該方法前,需要獲得內置鎖,否則就處於阻塞狀態。
同步代碼塊是指有synchronized關鍵字修飾的語句塊。被該關鍵字修飾的語句塊會自動被加上內置鎖,從而實現同步。
區別
1、同步方法默認用this或者當前類class對象作爲鎖;
2、同步方法作用於整個方法,同步代碼塊作用範圍更小,作用於整個代碼塊。
3、同步方法使用關鍵字synchronized修飾方法,而同步代碼塊主要是修飾需要進行同步的代碼,用synchronized(object){代碼內容}進行修飾;

 

16.在監視器(Monitor)內部,線程同步是如何實現的?


監視器和鎖在Java虛擬機中是一塊使用的。監視器監視一塊同步代碼塊,確保一次只有一個線程執行同步代碼塊。每一個監視器都和一個對象引用相關聯。線程在獲取鎖之前不允許執行同步代碼。


17.什麼是死鎖(deadlock),產生的條件是什麼?


死鎖是指兩個或兩個以上的進程在執行過程中,由於競爭資源或者由於彼此通信而造成的一種阻塞的現象。
死鎖的發生必須具備以下四個必要條件。
1.互斥
互斥條件是指進程對所分配到的資源進行排它性使用,即在一段時間內某資源只由一個進程佔用。如果此時還有其它進程請求資源,則請求者只能等待,直至佔有資源的進程用畢釋放。
2.請求和保持
請求和保持條件是指進程已經保持至少一個資源,但又提出了新的資源請求,而該資源已被其它進程佔有,此時請求進程阻塞,但又對自己已獲得的其它資源保持不放。
3.不剝奪
不剝奪條件是指進程已獲得的資源,在未使用完之前,不能被剝奪,只能在使用完時由自己釋放。
4.環路
環路等待條件是指在發生死鎖時,必然存在一個進程——資源的環形鏈,即進程集合{P0,P1,P2,···,Pn}中的P0正在等待一個P1佔用的資源;P1正在等待P2佔用的資源,……,Pn正在等待已被P0佔用的資源。


18.如何確保多個線程可以訪問多個資源同時又不導致死鎖?


如果所有的線程都是以同樣的順序加鎖和釋放鎖,就不會出現死鎖了。所以爲了確保多個線程訪問多個資源同時又不導致死鎖,我們可以指定獲取鎖的順序,並強制線程按照指定的順序獲取鎖。


19.Java集合類框架的基本接口有哪些?


Java集合類提供了一套設計良好的支持對一組對象進行操作的接口和類。Java集合類裏面最基本的接口有:
Collection:代表一組對象,每一個對象都是它的子元素。
Set:不包含重複元素的Collection。
List:有順序的collection,並且可以包含重複元素。
Map:可以把鍵(key)映射到值(value)的對象,鍵不能重複。
集合類接口指定了一組叫做元素的對象。集合類接口的每一種具體的實現類都可以選擇以它自己的方式對元素進行保存和排序。有的集合類允許重複的鍵,有些不允許。


20.爲什麼集合類沒有實現Cloneable和Serializable接口?


集合類接口指定了一組叫做元素的對象。集合類接口的每一種具體的實現類都可以選擇以它自己的方式對元素進行保存和排序。有的集合類允許重複的鍵,有些不允許。


21.什麼是迭代器(Iterator)?


迭代器(iterator)是一種對象,它能夠用來遍歷標準模板庫容器中的部分或全部元素,每個迭代器對象代表容器中確定的地址。迭代器提供了一種方法,可以用來訪問一個容器對象中各個元素,而又不需暴露該對象的內部細節。
Iterator接口提供了很多對集合元素進行迭代的方法。每一個集合類都包含了可以返回迭代器實例的迭代方法。迭代器可以在迭代的過程中刪除底層集合的元素。


22.Iterator和ListIterator的區別是什麼?


區別有一下幾點:
1.使用範圍
使用範圍不同,Iterator可以應用於所有的集合,Set、List和Map和這些集合的子類型。而ListIterator只能用於List及其子類型。
2.add方法
ListIterator有add方法,可以向List中添加對象,而Iterator不能。
3.逆向遍歷
ListIterator和Iterator都有hasNext()和next()方法,可以實現順序向後遍歷,但是ListIterator有hasPrevious()和previous()方法,可以實現逆向(順序向前)遍歷。Iterator不可以。
4.索引定位
ListIterator可以定位當前索引的位置,nextIndex()和previousIndex()可以實現。Iterator沒有此功能。
5.修改對象
都可實現刪除操作,但是ListIterator可以實現對象的修改,set()方法可以實現。Iterator僅能遍歷,不能修改。


23.快速失敗(fail-fast)和安全失敗(fail-safe)的區別是什麼?


Iterator的安全失敗是基於對底層集合做拷貝,所以,它不受源集合上修改的影響。java.util包下面的所有的集合類都是快速失敗的,而java.util.concurrent包下面的所有的類都是安全失敗的。快速失敗的迭代器會拋出ConcurrentModificationException異常,而安全失敗的迭代器永遠不會拋出這樣的異常。


24.Java中的HashMap的工作原理是什麼?


存儲方式
Java中的HashMap是以鍵值對(key-value)的形式存儲元素的。
調用原理
HashMap需要一個hash函數,它使用hashCode()和equals()方法來向集合/從集合添加和檢索元素。當調用put()方法的時候,HashMap會計算key的hash值,然後把鍵值對存儲在集合中合適的索引上。如果key已經存在了,value會被更新成新值。
其它特性
HashMap的一些重要的特性是它的容量(capacity),負載因子(load factor)和擴容極限(threshold resizing)。


25.hashCode()和equals()方法的重要性體現在什麼地方?


Java中的HashMap使用hashCode()和equals()方法來確定鍵值對的索引,當根據鍵獲取值的時候也會用到這兩個方法。如果沒有正確的實現這兩個方法,兩個不同的鍵可能會有相同的hash值,因此,可能會被集合認爲是相等的。而且,這兩個方法也用來發現重複元素。所以這兩個方法的實現對HashMap的精確性和正確性是至關重要的。


26.HashMap和Hashtable有什麼區別?


區別一
HashMap幾乎可以等價於Hashtable,除了HashMap是非synchronized的,並可以接受null,HashMap可以接受爲null的鍵值(key)和值(value),而Hashtable則不行。
區別二
HashMap是非synchronized,而Hashtable是synchronized,這意味着Hashtable是線程安全的,多個線程可以共享一個Hashtable;而如果沒有正確的同步的話,多個線程是不能共享HashMap的。Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的擴展性更好。
區別三
HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。所以當有其它線程改變了HashMap的結構(增加或者移除元素),將會拋出ConcurrentModificationException,但迭代器本身的remove()方法移除元素則不會拋出ConcurrentModificationException異常。但這並不是一個一定發生的行爲,要看JVM。這條同樣也是Enumeration和Iterator的區別。
區別四
由於Hashtable是線程安全的也是synchronized,所以在單線程環境下它比HashMap要慢。如果你不需要同步,只需要單一線程,那麼使用HashMap性能要好過Hashtable。
區別五
HashMap不能保證隨着時間的推移Map中的元素次序是不變的。


27.數組(Array)和列表(ArrayList)有什麼區別?什麼時候應該使用Array而不是ArrayList?


區別

1、Array可以包含基本類型和對象類型,ArrayList只能包含對象類型。
2、Array大小是固定的,ArrayList的大小是動態變化的。
3、ArrayList提供了更多的方法和特性,比如:addAll(),removeAll(),iterator()等等。

應用
對於基本類型數據,集合使用自動裝箱來減少編碼工作量。但是,當處理固定大小的基本數據類型的時候,這種方式相對比較慢。


28.ArrayList和LinkedList有什麼區別?


1、ArrayList是基於動態數組實現的,LinkedList是基於鏈表的數據結構。
2、get訪問List內部任意元素時,ArrayList的性能要比LinkedList性能好。LinkedList中的get方法是要按照順序從列表的一端開始檢查,直到另一端。
3、對於新增和刪除操作LinkedList要強於ArrayList,因爲ArrayList要移動數據。
4、LinkedList比ArrayList更佔內存,因爲LinkedList爲每一個節點存儲了兩個引用,一個指向前一個元素,一個指向下一個元素。


29.Comparable和Comparator接口是幹什麼的?列出它們的區別。


Java提供了只包含一個compareTo()方法的Comparable接口。這個方法用來給兩個對象排序,結果返回負數,0,正數來表明輸入對象小於,等於,大於已經存在的對象。
Java提供了包含compare()和equals()兩個方法的Comparator接口。compare()方法用來給兩個輸入參數排序,返回負數,0,正數表明第一個參數是小於,等於,大於第二個參數。equals()方法需要一個對象作爲參數,來決定輸入參數是否和comparator相等。只有當輸入參數也是一個comparator並且輸入參數和當前comparator的排序結果是相同的時候,比較結果才返回true。


30.什麼是Java優先級隊列(Priority Queue)?


PriorityQueue是一個基於優先級堆的無界隊列,隊列的元素是依據自然順序(natural order)排序的。在創建的時候,我們可以給它提供一個負責給元素排序的比較器。PriorityQueue不允許null值,因爲他們沒有自然順序,或者說他們沒有任何的相關聯的比較器。最後,PriorityQueue不是線程安全的,入隊和出隊的時間複雜度是O(log(n))。

31.大O符號(big-O notation)的作用是什麼?有哪些使用方法?


大O符號描述了當數據結構裏面的元素增加的時候,算法的規模或者是性能在最壞的場景下有多麼好。
大O符號也可用來描述其他的行爲,比如:內存消耗。因爲集合類實際上是數據結構,一般使用大O符號基於時間、內存和性能來選擇最好的實現。大O符號可以對大量數據的性能給出一個很好的說明。


32.有序數組和無序數組的區別是什麼?


1、有序數組最大的好處在於查找的時間複雜度是O(log n),而無序數組是O(n)。
2、有序數組的缺點是插入操作的時間複雜度是O(n),因爲值大的元素需要往後移動來給新元素騰位置。相反,無序數組的插入時間複雜度是常量O(1)。

33.Java集合類框架的最佳實踐有哪些?

實踐一

根據應用的需要,正確選擇要使用集合的類型對性能非常重要,所以,如果提前知道元素的大小是固定的,我們就會使用Array,而不ArrayList。
實踐二
對於那些允許指定初始容量的集合。如果能估計出存儲的元素的數目,就可以提前設置初始容量,以此來避免重新計算hash值或者是擴容。
實踐三
爲了類型安全,可讀性和健壯性的原因總是要使用泛型。同時,使用泛型還可以避免運行時的ClassCastException。
實踐四
使用JDK提供的不變類(immutable class)作爲Map的鍵可以避免爲我們自己的類實現hashCode()和equals()方法。
實踐五
編程的時候接口優於實現。
實踐六
底層的集合實際上是空的情況下,返回長度是0的集合或者是數組,不要返回null。

34.Enumeration接口和Iterator接口的區別有哪些?

1.速度

Enumeration速度是Iterator的2倍。
2.內存
Enumeration比Iterator佔用更少的內存。
3.安全
Enumeration安全性遠遠低於Iterator,因爲當集合裏面的對象正在被Iterator遍歷的時候,其他線程無法修改對象。
4.可操作
Enumeration不允許調用者刪除底層集合裏面的元素,Iterator可以。

35.HashSet和TreeSet有什麼區別?

區別一

底層存儲的數據結構不同。HashSet底層用的是HashMap哈希表結構存儲,而TreeSet底層用的是TreeMap樹結構存儲。
區別二
有序性不同。HashSet是無序的,而TreeSet是有序的。
區別三
存儲時保證數據唯一性依據不同。HashSet是通過複寫hashCode()方法和equals()方法來保證數據唯一性的,而TreeSet通過Compareable接口的compareTo()方法來保證數據唯一性的。
區別四
時間複雜度不同。HashSet的add()、remove()和contains()方法的時間複雜度是0(1),TreeSet的時間複雜度是0(logn)。

36.Java中垃圾回收有什麼目的?垃圾回收的時機是什麼?

目的

識別並且丟棄應用不再使用的對象來釋放和重用資源。
時機
1.程序員可以手動調用gc,但是Java語言規範並不保證GC一定會執行。
2.當應用程序空閒時,即沒有應用線程在運行時,GC會被調用。
3.Java堆內存不足時,GC會被調用。

37.System.gc()和Runtime.gc()的作用是什麼?

這兩個方法用來提示JVM要進行垃圾回收。但是,立即開始還是延遲進行垃圾回收是取決於JVM的。GC本身是會週期性的自動運行的,由JVM決定運行的時機,現在的版本有多種更智能的模式可以選擇,還會根據運行的機器自動去做選擇。

38.finalize()方法什麼時候被調用?析構函數(finalization)的目的是什麼?

在釋放對象佔用的內存之前,垃圾收集器會調用對象的finalize()方法。
目的是回收某些對象,清理內存,一般建議在該方法中釋放對象持有的資源。


39.如果對象的引用被置爲null,佔用內存將在何時被回收?


在下一個垃圾回收週期,這個對象將是可被回收的。


40.Java堆的結構是什麼樣子的?什麼是堆中的永久代(Perm Gen space)?


JVM的堆是運行時數據區,所有類的實例和數組都是在堆上分配內存。它在JVM啓動的時候被創建。對象所佔的堆內存是由自動內存管理系統也就是垃圾收集器回收。
堆內存是由存活和死亡的對象組成的。存活的對象是應用可以訪問的,不會被垃圾回收。死亡的對象是應用不可訪問尚且還沒有被垃圾收集器回收掉的對象,一直到垃圾收集器把這些對象回收掉之前,會一直佔據堆內存空間。


41.串行(serial)收集器和吞吐量(throughput)收集器的區別是什麼?


吞吐量收集器使用並行版本的新生代垃圾收集器,它用於中等規模和大規模數據的應用程序。

串行收集器對大多數的小應用(在現代處理器上需要大概100M左右的內存)就足夠了。


42.在Java中,對象什麼時候可以被垃圾回收?


當對象對當前使用這個對象的應用程序變得不可觸及的時候,這個對象就可以被回收了。java垃圾回收是有jvm自動執行的,不是人爲操作的,所以當不存在對某對象的任何引用時,該對象就處於被jvm回收的狀態,並不是馬上予以銷燬。


43.JVM的永久代中會發生垃圾回收麼?


垃圾回收不會發生在永久代。如果永久代滿了或者是超過了臨界值,會觸發完全垃圾回收(Full GC)。永久代也是被回收的,所以,正確的永久代大小對避免Full GC是非常重要的因素。


44.Java中的兩種異常類型是什麼?他們有什麼區別?


Java中有兩種異常:受檢查的(checked)異常和不受檢查的(unchecked)異常。
不受檢查的異常不需要在方法或者是構造函數上聲明,就算方法或者是構造函數的執行可能會拋出這樣的異常,並且不受檢查的異常可以傳播到方法或者是構造函數的外面。相反,受檢查的異常必須要用throws語句在方法或者是構造函數上聲明。


45.Java中Exception和Error有什麼區別?


Error類定義了不期望被用戶程序捕獲的異常,表示僅靠程序本身無法恢復的嚴重錯誤,比如說內存溢出、動態鏈接異常、虛擬機錯誤。應用程序不應該拋出這種類型的對象。假如出現這種錯誤,除了盡力使程序安全退出外,在其他方面是無能爲力的。所以在進行程序設計時,應該更關注Exception類。
Exception類用於用戶程序可以捕獲的異常情況,是由Java應用程序拋出和處理的非嚴重錯誤,比如所需文件沒有找到、零作除數,數組下標越界等。它的各種不同子類分別對應不同類型異常。可分爲兩類:Checked異常和Runtime異常


46.throw和throws有什麼區別?


1.throw是在代碼塊內針對對象的,即在捕獲方法內的異常並拋出時使用。throws是針對方法的,即將方法的異常信息拋出去。

2.throw是主動(在方法內容裏我們是主動捕獲並throw的),而throws是被動(在方法上是沒有捕獲異常進行處理,直接throws的)。


47.異常處理的時候,finally代碼塊的重要性是什麼?


無論是否拋出異常,finally代碼塊總是會被執行。就算是沒有catch語句同時又拋出異常的情況下,finally代碼塊仍然會被執行。最後要說的是,finally代碼塊主要用來釋放資源,比如:I/O緩衝區,數據庫連接。


48.異常處理完成以後,Exception對象何時回收?


Exception對象會在下一個垃圾回收過程中被回收掉。


49.finally代碼塊和finalize()方法各有什麼作用,區別是什麼?


finally:在異常處理時提供 finally 塊來執行任何清除操作。如果拋出一個異常,那麼相匹配的 catch 子句就會執行,然後控制就會進入 finally 塊(如果有的話)。
finalize:方法名。Java 技術允許使用 finalize() 方法在垃圾收集器將對象從內存中清除出去之前做必要的清理工作。這個方法是由垃圾收集器在確定這個對象沒有被引用時對這個對象調用的。它是在 Object 類中定義的,因此所有的類都繼承了它。子類覆蓋 finalize() 方法以整理系統資源或者執行其他清理工作。finalize() 方法是在垃圾收集器刪除對象之前對這個對象調用的。注意:finalize不一定被jvm調用,只有當垃圾回收器要清除垃圾時才被調用。
區別
無論是否拋出異常,finally代碼塊都會執行,它主要是用來釋放應用佔用的資源。finalize()方法是Object類的一個protected方法,它是在對象被垃圾回收之前由Java虛擬機來調用的。


50.什麼是Applet?


Applet是一種特殊的Java程序,它本身不能單獨運行,需要嵌入在一個HTML文件中,藉助瀏覽器或Appletviewer來解釋執行.Applet可能通過網絡傳輸,由瀏覽器自動裝載並執行。


51.一個Applet有哪些生命週期?


一個Applet的生命週期分爲以下四個階段:
Init
每次加載時都會初始化一個小程序。此方法通知Applet,方法已經被裝入系統,在第一次調用start方法之前總是先調用它。Init方法是Applet運行的起點。如果需要執行初始化任務,可以在Applet的子類中重載該方法,例如,在init方法中創建線程,而在destroy方法中消滅(destroy)相應的線程。
Start
開始執行一個小程序。此方法通知Applet開始執行,當調用init方法或者在Web頁中再次訪問時被調用。在Applet的子類中重載該方法,將每次訪問該WWW頁需執行的操作放入其中,例如,一個含自動畫的Applet可以使用start方法恢復動畫。
Stop
停止applet的執行。此方法通知Applet停止執行,當含有該Applet的Web頁被其他頁代替時調用該方法,也正是在Applet被消滅之前。在Applet的子類中重載該方法,將每次Web頁不再可見時需執行的操作放入其中。
Destroy
在卸載小程序之前執行最後的清理。此方法通知Applet,它正在被收回,應該釋放已分配給它的所有資源,stop方法總是在該方法調用之前被調用。


52.當一個applet被加載時會發生什麼?


當一個applet被加載之後,首先,創建了一個applet控件類的實例。實例創建之後,小程序就開始自動初始化,初始化完成之後,applet開始運行。


53.Applet和Java應用程序有什麼區別?


區別一

Java應用程序可以在瀏覽器之外獨立執行的Java程序。Java Applet需要依託於瀏覽器來執行。
區別二
Java應用程序需要具有特定簽名的主要方法才能開始執行。Java Applet不需要。
區別三
Java應用程序的安全策略比較寬鬆。Java小程序的安全策略通常爲限制性的。


54.對Java小程序有什麼限制?


基於安全的原因,對Java小程序施加了以下限制:
1.小程序無法加載庫或定義本地方法。
2.一個applet通常不能讀寫執行主機上的文件。
3.小程序無法讀取某些系統屬性。
4.一個小程序不能建立網絡連接,除了它來自的主機。
5.一個小程序不能在執行它的主機上啓動任何程序。


55.什麼是不可信任的小程序?


不受信任的小程序是那些無法訪問或執行本地系統文件的Java小程序。默認情況下,下載的所有applet都被認爲是不受信任的。


56.通過網絡加載的Applet和通過文件系統加載的Applet有何區別?


區別一

通過網絡加載的Applet,由小應用程序類加載程序加載,並受小應用程序安全管理程序強制執行的限制。
區別二
通過文件系統加載的Applet,由文件系統加載程序加載。允許通過文件系統加載的小程序讀取文件,寫入文件並在客戶機上加載庫。此外,允許通過文件系統加載的小程序執行進程。
區別三
通過文件系統加載的小程序不會通過字節代碼驗證程序。


57.applet類加載器的作用是什麼?


作用一

當applet是從網絡上加載的時候,它是由applet類加載器載入的。類加載器有自己的java名稱空間等級結構。類加載器會保證來自文件系統的類有唯一的名稱空間,來自網絡資源的類有唯一的名稱空間。
作用二
當瀏覽器通過網絡載入applet的時候,applet的類被放置於和applet的源相關聯的私有的名稱空間中。然後,那些被類加載器載入進來的類都是通過了驗證器驗證的。驗證器會檢查類文件格式是否遵守Java語言規範,確保不會出現堆棧溢出(stack overflow)或者下溢(underflow),傳遞給字節碼指令的參數是正確的。


58.彈出式選擇菜單(Choice)和列表(List)有什麼區別?


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


59.佈局管理器的作用是什麼?常用的有哪些?


佈局管理器用於組織容器中的組件。
常用的有:
FlowLayout 流式佈局
BorderLayout 邊框式佈局
GridLayout 網格佈局
CardLayout 卡片佈局
GridBagLayout 複雜的網格佈局


60.Scrollbar和JScrollPane有什麼區別?


Scrollbar是一個組件,不是容器。
ScrollPane是容器,滾動事件由自己來處理。


61.Swing的方法中,有哪些是線程安全的?


Swing的規則是:當Swing組件被具現化時,所有可能影響或依賴於組件狀態的代碼都應該在事件派發線程中執行。
因此有3個線程安全的方法:
repaint(),revalidate(),andinvalidate()。


62.Component子類中,哪些支持繪畫功能?


在Canvas,Frame,Panel,和小程序類支持的繪畫。


63.MenuItem和CheckboxMenuItem有什麼不同?


CheckboxMenuItem繼承自MenuItem類,支持菜單選項可以選中或未選中。


64.BorderLayout的元素是如何佈局的?


BorderLayout也是一種非常簡單的佈局策略,它把容器內的空間簡單地劃分爲東、西、南、北、中五個區域,每加入一個組件都應該指明把這個組件加在哪個區域中。BorderLayout是頂層容器(Jframe,Jdialog和JApplet)的默認佈局管理器。


65.GridBagLayout的元素是如何佈局的?


GridBagLayout裏面的元素是按照網格進行佈局的。不同大小的元素可能會佔據網格的多於1行或一列。因此,行數和列數可以有不同的大小。


66.在java中面板和框架的區別是什麼?


JFrame上可以根據需要加載各種面板,在Swing中的JFrame窗體與AWT中的Frame窗體有一些不同。
JFrame由他的窗體本身加上其上的JRootPane根面板,JLayeredPane層面板,containPane內容面板,glassPane玻璃面板,JMenuBar菜單欄(可選,不包括在內)四部分組成。
其中根面板在JRootPane類中實現,層面板在JLayeredPane類中實現,他們都是JComponent的子類。而containPane和glassPane沒有專門對應的類。


67.事件偵聽器接口和事件適配器類之間的關係是什麼?


監聽器是接口,而適配器是個實現類。
適配器僅僅是爲了編程的方便而加入的。實現了它所對應的監聽器接口,“實現”的方式就是爲每一個接口方法提供一個實現體。
有時一個接口有很多接口方法,編程時從適配器繼承,可以僅僅實現你所感興趣的事件響應方法。
總而言之,事件偵聽器接口定義了特定事件的事件處理程序必須實現的方法。事件適配器提供事件偵聽器接口的默認實現。


68.GUI組件如何處理自己的事件?


GUI組件通過實現相應的事件偵聽器接口,並將添加自身爲事件偵聽器來處理自己的事件。在JDK中定義了多種事件類,用以描述GUI程序中可能發生的各種事件,組件在與用戶交互時,遇到特定操作則會觸發相應的事件,即自動創建事件類對象並提交給Java運行時系統。


69.Java的佈局管理器比傳統的窗口系統有什麼優勢?


Java使用佈局管理器在所有窗口平臺上佈局組件的方式相同。另外,佈局管理器不受絕對大小和位置的限制,因此它們能夠適應窗口系統之間特定於平臺的差異。


70.什麼是Java用於所有Swing組件的設計模式?


Java中的Swing組件使用了MVC(視圖-模型-控制器)設計模式。
佈局管理器是策略模式;
swing組件是MVC模式、觀察者模式;
邊框是修飾模式。


71.JDBC是什麼?


JDBC(Java DataBase Connectivity,java數據庫連接)是一種用於執行SQL語句的Java API,可以爲多種關係數據庫提供統一訪問,由一組用Java語言編寫的類和接口組成。JDBC提供了一種基準,可以用來構建更高級的工具和接口,使數據庫開發人員能夠編寫數據庫應用程序,同時不必關心特定數據庫的底層細節。


72. Driver在JDBC中有哪些作用?


JDBC驅動提供了特定廠商對JDBCAPI接口類的實現,驅動必須要提供java.sql包下面這些類的實現:Connection,Statement,PreparedStatement,CallableStatement,ResultSet和Driver。


73.解釋一下Class.forName方法?


Class.forName方法是一個靜態方法,用於加載將建立到數據庫的連接的驅動程序,返回與給定的字符串名稱相關聯類或接口的Class對象。
該方法有兩種形式:Class.forName(String name, boolean initialize, ClassLoader loader)和 Class.forName(String className)。第一種形式的參數name表示的是類的全名;initialize表示是否初始化類;loader表示加載時使用的類加載器。第二種形式則相當於設置了參數 initialize的值爲 true,loader的值爲當前類的類加載器。


74.PreparedStatement優於Statement的優點是什麼?


優點一

用PreparedStatement來代替Statement會使代碼多出幾行,但這樣的代碼無論從可讀性還是可維護性上來說.都比直接用Statement的代碼高很多檔次
優點二
PreparedStatement是預編譯語句,盡最大可能提高了性能。預編譯語句有可能被重複調用,語句在被編譯器編譯後的執行代碼被緩存下來,下次調用時只要是相同的預編譯語句就不需要編譯,只要將參數直接傳入編譯過的語句執行代碼中就會得到執行。
優點三
極大地提高了安全性,可以有效的避免SQL注入。
優點四
PreparedStatement對象可以重複使用不同的輸入值到他們的查詢。


75.CallableStatement是什麼,有哪些作用?


CallableStatement 對象爲所有的DBMS提供了一種以標準形式調用已儲存過程的方法。已儲存過程儲存在數據庫中。對已儲存過程的調用是 CallableStatement對象所含的內容。這種調用是用一種換碼語法來寫的,有兩種形式:一種形式帶結果參,另一種形式不帶結果參數。結果參數是一種輸出 (OUT) 參數,是已儲存過程的返回值。兩種形式都可帶有數量可變的輸入(IN 參數)、輸出(OUT 參數)或輸入和輸出(INOUT 參數)的參數。問號將用作參數的佔位符。
存儲過程由數據庫存儲和提供,存儲過程可能會從用戶獲取輸入值,並可能返回結果。存儲過程的使用受到高度鼓勵,因爲它提供了安全性和模塊性。


76.連接池是什麼,有哪些作用?


與數據庫的交互可能是昂貴的,關於數據庫連接的打開和關閉。特別是當數據庫客戶端數量增加時,這個代價非常高,消耗了大量的資源。應用服務器在啓動時獲得一個數據庫連接池,並保存在一個池中。連接請求由駐留在池中的連接提供。在連接結束時,請求將返回到池中,並可用於滿足將來的請求。


77.連接池的工作原理是什麼,有什麼優點?


工作原理
當應用啓動的時候,就初始化一些連接放在池中,如果客戶端請求連接,則先判斷池中是否還有連接:
如果有就返回客戶端。
如果沒有,判斷當前連接數有沒有超過系統允許的最大連接個數。沒有超過的話則創建並返回連接,若超過則出錯。
當用戶用完連接之後,再將連接放回池中。

優點
可以實現連接的複用。


78.RMI是什麼?


RMI(Remote Method Invocation,遠程方法調用)是用Java在JDK1.1中實現的,它大大增強了Java開發分佈式應用的能力,是開發百分之百純Java的網絡分佈式應用系統的核心解決方案之一。
Java遠程方法調用(Java RMI)是一種執行遠程過程調用(RPC)的面向對象的Java API,支持直接傳輸序列化的Java類和分佈式垃圾收集。遠程方法調用(RMI)也可以看作是在遠程運行的對象上激活方法的過程。


79.如何使用RMI開發?


使用RMI開發主要分爲六個步驟:
1.定義一個遠程接口,遠程接口必須繼承接口,每個方法必須拋出遠程異常,方法參數和方法返回值都必須是可序列化的。
2.實現遠程接口。
3.定義使用遠程對象的客戶程序。
4.產生遠程訪問對象的樁和框 。
5.註冊遠程對象。
6.運行服務器和客戶程序。


80.什麼是RMI架構的基本原理?


RMI體系結構是基於一個非常重要的行爲定義和行爲實現相分離的原則。RMI允許定義行爲的代碼和實現行爲的代碼相分離,並且單獨運行在不同的JVM上。


81.RMI架構層的結構是如何組成的?


RMI體系結構由三層組成,分別是:
存根和骨架層(Stub and Skeleton Layer)
遠程引用層(Remote Reference Layer)
傳輸層(Transport Layer)
Stub and Skeleton layer:這一層對於成員來講,是透明的。該層主要負責攔截客戶端向接口發起的方法調用,並將這些調用重定向到遠程RMI服務。
Remote Reference Layer:這一層處理從客戶端到服務器遠程對象的引用的解釋。該層解釋和管理從客戶端到遠程服務對象的引用。連接方式是點到點的。
Transport layer:最後一層負責連接參與服務的兩個JVM。這一層基於網絡中機器之間的TCP / IP連接,提供了基本的連接和一些防火牆滲透策略。


82.RMI中的遠程接口有哪些作用?


遠程接口在RMI主要有以下作用:
1.用來標識接口,目的是爲了辨識哪些接口是可以從非本地虛擬機調用方法的。
2.爲每個遠程對象定義構造函數。
3.爲所有遠程接口中的每個遠程方法提供實現。
4.實現遠程接口的類,應聲明正在實現的遠程接口。
5.所有作爲遠程對象的對象,必須直接或間接地實現這個接口。


83.java.rmi.Naming類的作用是什麼?


java.rmi.Naming類提供了用於存儲和獲取對遠程對象註冊表中遠程對象的引用的方法。Naming類的每個方法都可將某個名稱作爲其一個參數,該名稱是使用以下形式的URL格式(沒有scheme組件)的。


84.在RMI中綁定的意義是什麼?


綁定是關聯或註冊遠程對象的名稱的過程,後面用來查找遠程對象。遠程對象可以使用Naming類的bind或rebind方法與名稱關聯。


85.使用命名類的bind()和rebind()方法有什麼區別?


bind方法綁定負責將指定的名稱綁定到遠程對象。
rebind方法負責將指定的名稱重新綁定到新的遠程對象。若該名稱存在綁定,綁定將被替換。


86.一個RMI程序正常運行的要點是什麼?


爲了使RMI程序正常運行,必須完成下面的工作:
1、彙編所有源文件。
2、用rmic生成存根。
3、開始rmiregistry。
4、啓動RMIServer。
5、運行客戶端程序。


87.存根在RMI中的意義是什麼?


遠程對象的存根充當遠程對象的客戶端本地代理或代理。調用者 調用本地存根上的一個方法,該方法負責在遠程對象上執行該方法。


88.DGC的作用是什麼?


DGC的作用主要有一下兩點:
DGC在RMI中用於自動垃圾收集。
DGC使用引用計數算法爲遠程對象提供自動內存管理。


89.在RMI中使用RMISecurityManager的意義是什麼?


RMISecurityManager用於提供可被RMI應用程序使用的安全管理器。若不設置安全管理器,則RMI的類加載器無法從遠程下載任何的類。


90.Marshalling和Demarshalling是什麼?


當應用程序想要通過網絡將其內存對象傳遞給另一個主機或將其存儲到存儲器時,內存中的表示形式必須轉換爲適當的格式。這個過程被稱爲編組。相反操作被稱爲Demarshalling。


91.Servlet是什麼?


Servlet(Server Applet)是Java Servlet的簡稱,稱爲小服務程序或服務連接器,是用Java編寫的服務器端程序,主要的作用是處理客戶端請求並生成動態Web內容。
一般情況下,Servlet主要用於處理或者存儲由HTML表單提交的數據,提供動態內容並管理狀態信息。


92.Applet和Servlet有什麼區別?


Applet是客戶端Java程序,Servlet是服務器端組件。
Applet運行在客戶機上的Web瀏覽器中,Servlet運行在Web服務器上。
Applet可以使用用戶接口類,servlet沒有用戶接口,等待客戶端的HTTP請求,並在每個請求中產生一個響應。


93.GenericServlet和HttpServlet有什麼區別?


HttpServlet是GenericServlet的子類。
GenericServlet是個抽象類,必須給出子類才能實例化。它給出了設計servlet的一些架構,定義了servlet生命週期,以及一些得到名字、配置、初始化參數的方法,其設計的是和應用層協議無關的。
HttpServlet是子類,所以具有GenericServlet的一切特性,還添加了doGet, doPost, doDelete, doPut, doTrace等方法用來處理http協議裏命令的請求響應過程。


94.一個Servlet在生命週期中經歷了哪些過程?


Servlet 在加載之後依次經歷了實例化、服務、銷燬三個過程。
init()
在服務器裝入Servlet時,將會執行init()方法,目的是爲了初始化Servlet對象。也可以通過配置服務器,在啓動服務器或客戶機首次訪問Servlet時裝入Servlet。Init()方法在整個生命週期中,僅僅執行一次,與訪問Servlet的客戶機數量無關。
service()
負責響應客戶的請求,是Servlet的核心。當一個客戶請求一個HttpServlet對象時,對象就會調用Service()方法,並傳遞給方法一個請求對象和一個響應對象作爲參數。Service()方法在HttpServlet中已存在,默認的服務功能是調用與HTTP請求的方法相應的do功能。
destroy()
在服務器端停止且卸載Servlet時執行該方法,用來釋放佔用的資源。一個Servlet在運行service()方法時可能會產生其他的線程,所以在調用destroy()方法時,需要確認這些線程已經終止或完成。與init()方法一樣,整個生命週期中,僅執行一次。


95.doGet()和doPost()有什麼區別?


區別一

get是從服務器上獲取數據,post是向服務器傳送數據。
區別二
get是把參數數據隊列加到提交表單的ACTION屬性所指的URL中,值和表單內各個字段一一對應,在URL中可以看到。post是通過HTTP post機制,將表單內各個字段與其內容放置在HTML HEADER內一起傳送到ACTION屬性所指的URL地址。過程對用戶不可見。
區別三
對於get方式,服務器端用Request.QueryString獲取變量的值,對於post方式,服務器端用Request.Form獲取提交的數據。
區別四
get傳送的數據量較小,不能大於2KB。post傳送的數據量較大,一般被默認爲不受限制。但理論上,IIS4中最大量爲80KB,IIS5中爲100KB。
區別五
get安全性非常低,post安全性較高。但是Get執行效率卻比Post方法好。


96.什麼是服務器端包含(SSI)?


服務端包含(SSI)是一種簡單的解釋型服務端腳本語言,多數情況下只用在Web上,用servlet標籤嵌入。SSI最常用的場景把一個或多個文件包含到Web服務器的一個Web頁面中。當瀏覽器訪問Web頁面的時候,Web服務器會用對應的servlet產生的文本來替換Web頁面中的servlet標籤。


97.什麼是ServletChaining?


ServletChaining是一種傳輸方法,用來把一個Servlet的輸出發送給另一個Servlet。第二個Servlet的輸出可以發送給第三個Servlet,依次循環。鏈末端Servlet負責把響應發送給客戶端。 


98.如何找出當前向你請求servlet的客戶機?


ServletRequest類具有查找客戶機的IP地址或主機名的功能。
getRemoteAddr()獲取客戶機的IP地址。
getRemoteHost()獲取客戶機的主機名。


99.HTTP響應的結構是什麼?


HTTP響應由三部分組成:
狀態代碼:描述響應的狀態。它可以用來檢查請求是否已經成功完成。在請求失敗的情況下,狀態碼可以用來找出失敗的原因。如果您的servlet沒有返回狀態碼,則默認返回成功狀態碼HttpServletResponse.SC_OK。
HTTP標頭:它們包含更多關於響應的信息。例如,標題可以指定響應被視爲陳舊的日期/時間,或用於安全地將實體傳送給用戶的編碼形式。
Body:它包含響應的內容。正文可能包含HTML代碼,圖像等。主體由緊接在標題之後的HTTP事務消息中傳輸的數據字節組成。


100.sendRedirect和forward方法有什麼區別?


區別一
sendRedirect方法可以定位到同一個web站點的其他應用,甚至可以通過傳入絕對路徑定位到別的web站點。forward方法只能轉發給同一個web站點的資源。
區別二
sendRedirect轉發後,瀏覽器url地址變爲目的url地址。forward重定向後,瀏覽器url地址不變。
區別三
使用sendRedirect轉發的過程,瀏覽器先向目的Servlet發送一次請求,Servlet看到sendRedirect將目的url返回到瀏覽器,瀏覽器再去請求目的url,目的url再返回response到瀏覽器。瀏覽器和服務器兩次請求響應。
使用forward重定向的過程,是瀏覽器先向目的Servlet發送一次Request請求,然後再服務器端由Servlet再將請求發送到目的url,再由服務器端Servlet返回Response到瀏覽器端。瀏覽器和服務器一次請求響應。
區別四
sendRedirect方法由於兩次瀏覽器服務器請求,所以有兩個Request和Response。
forward方法的調用者與被調用者之間共享Request和Response。


101.什麼是JSP?


JSP(Java Server Page)是一個文本文檔,是一種將靜態內容和動態生成內容混合在一起的技術。
JSP包含兩種類型的文本:靜態數據和JSP元素。靜態數據可以用任何基於文本的格式表示,如HTML或XML。


102.如何處理JSP請求?


1.收到JSP請求之後,瀏覽器首先請求一個擴展名爲.jsp的頁面。
2.Web服務器讀取請求,並使用JSP編譯器將JSP頁面轉換爲一個servlet類。需要注意的是,只有第一次請求或者是JSP文件變化的時候,纔會編譯JSP文件。
3.調用生成的servlet類處理瀏覽器的請求。
4.請求執行結束,servlet將響應發送回客戶端。


103.JSP有哪些優點?


使用JSP技術有下面的一些優點:
1.頁面可以預編譯。
2.代碼更新容易,因爲JSP頁面被動態地編譯成了servlet。
3.可以將JSP頁面輕鬆地與包含HTML或XML片段的靜態模板組合,並生成動態內容。
4.可以提供定製的JSP標籤庫,頁面作者可以使用類似XML的語法進行訪問。
5.無需編輯使用應用程序邏輯的各個頁面,可以在組件級別進行邏輯更改。


104.JSP中指令(Directive)的作用是什麼?JSP中有哪些不同類型的指令?


指令用於設置頁面級指令,從外部文件插入數據,指定自定義標籤庫。
指令定義<%@ and %>。
具體的指令如下表所示:


105.什麼是JSP動作?有哪些作用?


使用XML語法的結構來控制servlet引擎的行爲,是JSP動作。
JSP頁面被請求時,執行JSP動作。JSP動作可以動態插入到文件中,重用JavaBeans組件,將用戶轉發到其它頁面或爲Java插件生成HTML。


106.JSP動作的語法是什麼?有哪些標準動作元素?


語法只有一種:
<jsp:action_name attribute=”value”>
標準動作元素如下:


107.Scriptlet是什麼?有哪些作用?


定義

在JSP技術中,scriptlet是一段有效的Java程序,程序嵌入在JSP頁面中。當Web容器處理JSP頁面時執行,通常會產生輸出,並將輸出發送到客戶的輸出流裏。
標籤(<% %>)中除了不能定義類和方法、不能用import引入類外,可以包含任何有效的Java代碼。Java類在Jsp外部定義,可以使用page指令的import屬性引入,或者以Java Bean的形式使用。Java中的方法必須在類內定義,但Jsp允許使用聲明定義方法。需要注意的是,窗體(GUI)設計代碼在Jsp中無效。
任何文本,HTML標記,JSP元素必須在scriptlet之外,當JSP收到客戶的請求時,scriptlet就會被執行,如果scriptlet有顯示的內容,這些顯示的內容就被存在out對象中。
作用
1.用來聲明將要用到的變量或方法;
2.用來編寫JSP表達式;
3.使用任何隱含的對象和任何用<jsp:useBean>聲明過的對象。


108.JSP中的Decalarations是什麼?


JSP聲明與Java中的變量聲明類似。聲明用於聲明變量,以便隨後在表達式或腳本中使用。注意,添加聲明時,必須使用序列來包含添加的聲明。


109.JSP中的表達式的作用是什麼?


JSP表達式的作用是將腳本語言表達式的值(轉換爲字符串)插入Web服務器返回給客戶端的數據流中。表達式是在<% = and %>標籤之間定義的。既可以用來創建算術表達式,同樣可以用來創建邏輯表達式。


110.JSP隱式對象是什麼?有哪些?


JSP隱式對象是JSP容器在每個頁面中提供給開發人員的Java對象,開發人員可以無需明確聲明直接調用。JSP隱式對象也稱爲預定義變量。
JSP所支持的隱式對象:




發佈了3 篇原創文章 · 獲贊 4 · 訪問量 7577
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章