31、 s = new ("xyz");創建了幾個?是否可以繼承類?
兩個或一個都有可能,”xyz”對應一個對象,這個對象放在字符串常量緩沖區,常量”xyz”不管出現多少遍,都是緩沖區中的那一個。每寫一遍,就創建一個新的對象,它使用常量”xyz”對象的內容來創建出一個新對象。如果以前就用過’xyz’,那么這里就不會創建”xyz”了,直接從緩沖區拿,這時創建了一個;但如果以前沒有用過"xyz",那么此時就會創建一個對象并放入緩沖區出現未結束字符串常量錯誤,重裝瀏覽器能解決嗎,這種情況它創建兩個對象。至于類是否繼承,答案是否定的,因為默認final修飾,是不可繼承的。
32、和的區別
JAVA平臺提供了兩個類:和,它們可以儲存和操作字符串,即包含多個字符的字符數據。這個類提供了數值不可改變的字符串。而這個類提供的字符串可以進行修改。當你知道字符數據要改變的時候你就可以使用。典型地,你可以使用來動態構造字符數據。
33、下面這條語句一共創建了多少個對象: s="a"+"b"+"c"+"d";
對于如下代碼:
s1 = "a";
s2 = s1 + "b";
s3 = "a" + "b";
.out.(s2 == "ab");
.out.(s3 == "ab");
第一條語句打印的結果為false,第二條語句打印的結果為true,這說明javac編譯可以對字符串常量直接相加的表達式進行優化,不必要等到運行期再去進行加法運算處理,而是在編譯時去掉其中的加號,直接將其編譯成一個這些常量相連的結果。
題目中的第一行代碼被編譯器在編譯時優化后,相當于直接定義了一個”abcd”的字符串,所以,上面的代碼應該只創建了一個對象。寫如下兩行代碼,
s ="a" + "b" +"c" + "d";
.out.(s== "abcd");
最終打印的結果應該為true。
大家覺得本次面試題總結的寫得不錯的朋友,大家可以轉發+關注,然后掃描下方二維碼獲取更多面試題以及答案—掃描添加暗號:【CSDN】
34、try {}里有一個語句,那么緊跟在這個try后的{}里的code會不會被執行,什么時候被執行,在前還是后?
我們知道{}中的語句是一定會執行的,那么這個可能正常脫口而出就是之前,之后可能就出了這個方法了,鬼知道跑哪里去了,但更準確的應該是在中間執行,請看下面程序代碼的運行結果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
public classTest { ? ??? public static void main(String[]args) { ? ?????? System.out.println(newTest().test());; ? ??? } ? ??? static int test() ? ??? { ? ?????? intx = 1; ? ?????? try ? ?????? { ? ??????????returnx; ? ?????? } ? ?????? finally ? ?????? { ? ??????????++x; ? ?????? } ? ??? } ? ?? ? }
---------執行結果 ---------
1
運行結果是1,為什么呢?主函數調用子函數并得到結果的過程,好比主函數準備一個空罐子,當子函數要返回結果時,先把結果放在罐子里,然后再將程序邏輯返回到主函數。所謂返回,就是子函數說,我不運行了,你主函數繼續運行吧,這沒什么結果可言,結果是在說這話之前放進罐子里的。
35、final, , 的區別。
final 用于聲明屬性,方法和類,分別表示屬性不可變,方法不可覆蓋,類不可繼承。內部類要訪問局部變量,局部變量必須定義成final類型。
是異常處理語句結構的一部分,表示總是執行。
是類的一個方法,在垃圾收集器執行的時候會調用被回收對象的此方法,可以覆蓋此方法提供垃圾收集時的其他資源回收,例如關閉文件等。但是JVM不保證此方法總被調用
36、運行時異常與一般異常有何異同?
異常表示程序運行過程中可能出現的非正常狀態,運行時異常表示虛擬機的通常操作中可能遇到的異常,是一種常見運行錯誤。java編譯器要求方法必須聲明拋出可能發生的非運行時異常,但是并不要求必須聲明拋出未被捕獲的運行時異常。
37、error和有什么區別?
error 表示恢復不是不可能但很困難的情況下的一種嚴重問題。比如說內存溢出。不可能指望程序能處理這樣的情況。表示一種設計或實現問題。也就是說,它表示如果程序運行正常,從不會發生的情況。
38、簡單說說Java中的異常處理機制的簡單原理和應用。
異常是指java程序運行時(非編譯)所發生的非正常情況或錯誤,與現實生活中的事件很相似,現實生活中的事件可以包含事件發生的時間、地點、人物、情節等信息,可以用一個對象來表示,Java使用面向對象的方式來處理異常,它把程序中發生的每個異常也都分別封裝到一個對象來表示的,該對象中包含有異常的信息。
Java對異常進行了分類,不同類型的異常分別用不同的Java類表示,所有異常的根類為java.lang.,下面又派生了兩個子類:
Error和,Error表示應用程序本身無法克服和恢復的一種嚴重問題,程序只有奔潰了,例如,說內存溢出和線程死鎖等系統問題。
表示程序還能夠克服和恢復的問題,其中又分為系統異常和普通異常:
系統異常是軟件本身缺陷所導致的問題,也就是軟件開發人員考慮不周所導致的問題,軟件使用者無法克服和恢復這種問題,但在這種問題下還可以讓軟件系統繼續運行或者讓軟件掛掉,例如,數組腳本越界(),空指針異常()、類轉換異常();
普通異常是運行環境的變化或異常所導致的問題,是用戶能夠克服的問題,例如,網絡斷線,硬盤空間不夠,發生這樣的異常后,程序不應該死掉。
java為系統異常和普通異常提供了不同的解決方案,編譯器強制普通異常必須try..catch處理或用聲明繼續拋給上層調用方法處理,所以普通異常也稱為異常,而系統異常可以處理也可以不處理,所以,編譯器不強制用try..catch處理或用聲明,所以系統異常也稱為異常。
39、Java 中堆和棧有什么區別?
JVM 中堆和棧屬于不同的內存區域,使用目的也不同。棧常用于保存方法幀和局部變量,而對象總是在堆上分配。棧通常都比堆小,也不會在多個線程之間共享,而堆被整個 JVM 的所有線程共享。
棧:在函數中定義的一些基本類型的變量和對象的引用變量都是在函數的棧內存中分配,當在一段代碼塊定義一個變量時,Java 就在棧中為這個變量分配內存空間,當超過變量的作用域后,Java 會自動釋放掉為該變量分配的內存空間,該內存空間可以立即被另作它用。
堆:堆內存用來存放由 new 創建的對象和數組,在堆中分配的內存,由 Java 虛擬機的自動垃圾回收器來管理。在堆中產生了一個數組或者對象之后,還可以在棧中定義一個特殊的變量,讓棧中的這個變量的取值等于數組或對象在堆內存中的首地址,棧中的這個變量就成了數組或對象的引用變量,以后就可以在程序中使用棧中的引用變量來訪問堆中的數組或者對象,引用變量就相當于是為數組或者對象起的一個名稱。
40、能將 int 強制轉換為 byte 類型的變量嗎?如果該值大于 byte 類型的范圍,將會出現什么現象?
我們可以做強制轉換,但是 Java 中 int 是 32 位的,而 byte 是 8 位的,所以,如果強制轉化,int 類型的高 24 位將會被丟棄,因為byte 類型的范圍是從 -128 到 128。這里筆誤:-128到127
41、a.() 有什么用?與 a.(b) 有什么關系?
() 方法對應對象整型的 hash 值。它常用于基于 hash 的集合類,如 、、等等。它與 () 方法關系特別緊密。根據 Java 規范,兩個使用 equal() 方法來判斷相等的對象,必須具有相同的 hash code。
42、字節流與字符流的區別
要把一段二進制數據數據逐一輸出到某個設備中,或者從某個設備中逐一讀取一段二進制數據,不管輸入輸出設備是什么,我們要用統一的方式來完成這些操作,用一種抽象的方式進行描述,這個抽象描述方式起名為IO流,對應的抽象類為和,不同的實現類就代表不同的輸入和輸出設備,它們都是針對字節進行操作的。
計算機中的一切最終都是二進制的字節形式存在。對于經常用到的中文字符,首先要得到其對應的字節,然后將字節寫入到輸出流。讀取時,首先讀到的是字節,可是我們要把它顯示為字符,我們需要將字節轉換成字符。由于這樣的需求很廣泛,Java專門提供了字符流包裝類。
底層設備永遠只接受字節數據,有時候要寫字符串到底層設備,需要將字符串轉成字節再進行寫入。字符流是字節流的包裝,字符流則是直接接受字符串,它內部將串轉成字節,再寫入底層設備,這為我們向IO設備寫入或讀取字符串提供了一點點方便。
字符向字節轉換時,要注意編碼的問題,因為字符串轉成字節數組,其實是轉成該字符的某種編碼的字節形式,讀取也是反之的道理。
43、什么是java序列化,如何實現java序列化?或者請解釋接口的作用。
我們有時候將一個java對象變成字節流的形式傳出去或者從一個字節流中恢復成一個java對象,例如,要將java對象存儲到硬盤或者傳送給網絡上的其他計算機出現未結束字符串常量錯誤,重裝瀏覽器能解決嗎,這個過程我們可以自己寫代碼去把一個java對象變成某個格式的字節流再傳輸。
但是,jre本身就提供了這種支持,我們可以調用的方法來做,如果要讓java幫我們做,要被傳輸的對象必須實現接口,這樣,javac編譯時就會進行特殊處理,編譯的類才可以被方法操作,這就是所謂的序列化。需要被序列化的類必須實現接口,該接口是一個mini接口,其中沒有需要實現方法, 只是為了標注該對象是可被序列化的。
例如,在web開發中,如果對象被保存在了中,在重啟時要把對象序列化到硬盤,這個對象就必須實現接口。如果對象要經過分布式系統進行網絡傳輸,被傳輸的對象就必須實現接口。
44、描述一下JVM加載class文件的原理機制?
JVM中類的裝載是由和它的子類來實現的,Java 是一個重要的Java運行時系統組件。它負責在運行時查找和裝入類文件的類。
45、heap和stack有什么區別。
java的內存分為兩類,一類是棧內存,一類是堆內存。棧內存是指程序進入一個方法時,會為這個方法單獨分配一塊私屬存儲空間,用于存儲這個方法內部的局部變量,當這個方法結束時,分配給這個方法的棧會釋放,這個棧中的變量也將隨之釋放。
堆是與棧作用不同的內存,一般用于存放不在當前方法棧中的那些數據,例如,使用new創建的對象都放在堆里,所以,它不會隨方法的結束而消失。方法中的局部變量使用final修飾后,放在堆中,而不是棧中。
46、GC是什么?為什么要有GC?
GC是垃圾收集的意思( ),內存處理是編程人員容易出現問題的地方,忘記或者錯誤的內存回收會導致程序或系統的不穩定甚至崩潰,Java提供的GC功能可以自動監測對象是否超過作用域從而達到自動回收內存的目的,Java語言沒有提供釋放已分配內存的顯示操作方法。
47、垃圾回收的優點和原理。并考慮2種回收機制。
Java語言中一個顯著的特點就是引入了垃圾回收機制,使c++程序員最頭疼的內存管理的問題迎刃而解,它使得Java程序員在編寫程序的時候不再需要考慮內存管理。由于垃圾回收機制,Java中的對象不再有"作用域"的概念,只有對象的引用才有"作用域"。
垃圾回收可以有效的防止內存泄露,有效的使用可以使用的內存。垃圾回收器通常是作為一個單獨的低級別的線程運行,不可預知的情況下對內存堆中已經死亡的或者長時間沒有使用的對象進行清除和回收,程序員不能實時的調用垃圾回收器對某個對象或所有對象進行垃圾回收。
回收機制有分代復制垃圾回收和標記垃圾回收,增量垃圾回收。
48、垃圾回收器的基本原理是什么?垃圾回收器可以馬上回收內存嗎?有什么辦法主動通知虛擬機進行垃圾回收?
對于GC來說,當程序員創建對象時,GC就開始監控這個對象的地址、大小以及使用情況。通常,GC采用有向圖的方式記錄和管理堆(heap)中的所有對象。通過這種方式確定哪些對象是"可達的",哪些對象是"不可達的"。當GC確定一些對象為"不可達"時,GC就有責任回收這些內存空間。
程序員可以手動執行.gc(),通知GC運行,但是Java語言規范并不保證GC一定會執行。
49、Java 中,throw 和 有什么區別
throw 用于拋出 java.lang. 類的一個實例化對象,意思是說你可以通過關鍵字 throw 拋出一個,如:
throw new tion(“″)
而 的作用是作為方法聲明和簽名的一部分,方法被拋出相應的異常以便調用者能處理。Java 中,任何未處理的受檢查異常強制在 子句中聲明。
50,java中會存在內存泄漏嗎,請簡單描述。
先解釋什么是內存泄漏:所謂內存泄露就是指一個不再被程序使用的對象或變量一直被占據在內存中。java中有垃圾回收機制,它可以保證當對象不再被引用的時候,對象將自動被垃圾回收器從內存中清除掉。
由于Java使用有向圖的方式進行垃圾回收管理,可以消除引用循環的問題,例如有兩個對象,相互引用,只要它們和根進程不可達,那么GC也是可以回收它們的。
java中的內存泄露的情況:長生命周期的對象持有短生命周期對象的引用就很可能發生內存泄露,盡管短生命周期對象已經不再需要,但是因為長生命周期對象持有它的引用而導致不能被回收,這就是java中內存泄露的發生場景,通俗地說,就是程序員可能創建了一個對象,以后一直不再使用這個對象,這個對象卻一直被引用,即這個對象無用但是卻無法被垃圾回收器回收的,這就是java中可能出現內存泄露的情況,例如,緩存系統,我們加載了一個對象放在緩存中(例如放在一個全局map對象中),然后一直不再使用它,這個對象一直被緩存引用,但卻不再被使用。
51、說一說的生命周期?
有良好的生存期的定義,包括加載和實例化、初始化、處理請求以及服務結束。這個生存期由javax..接口的init(),()和方法表達。
被服務器實例化后,容器運行其init方法,請求到達時運行其方法,方法自動派遣運行與請求對應的doXXX方法(doGet,)等,當服務器決定將實例銷毀的時候調用其方法。
web容器加載,生命周期開始。通過調用的init()方法進行的初始化。通過調用()方法實現,根據請求的不同調用不同的do***()方法。結束服務,web容器調用的()方法。
52、 API中()與()的區別?
1.從地址欄顯示來說
是服務器請求資源,服務器直接訪問目標地址的URL,把那個URL的響應內容讀取過來,然后把這些內容再發給瀏覽器.瀏覽器根本不知道服務器發送的內容從哪里來的,所以它的地址欄還是原來的地址.
是服務端根據邏輯,發送一個狀態碼,告訴瀏覽器重新去請求那個地址.所以地址欄顯示的是新的URL.所以等于客戶端向服務器端發出兩次,同時也接受兩次。
2.從數據共享來說
:轉發頁面和轉發到的頁面可以共享里面的數據.
:不能共享數據.
不僅可以重定向到當前應用程序的其他資源,還可以重定向到同一個站點上的其他應用程序中的資源,甚至是使用絕對URL重定向到其他站點的資源.
方法只能在同一個Web應用程序內的資源之間轉發請求. 是服務器內部的一種操作.
是服務器通知客戶端,讓客戶端重新發起請求.
所以,你可以說 是一種間接的請求, 但是你不能說"一個請求是屬于還是 "
3.從運用地方來說
:一般用于用戶登陸的時候,根據角色轉發到相應的模塊.
:一般用于用戶注銷登陸時返回主頁面和跳轉到其它的網站等.
4.從效率來說
:高.
:低.
53、.()和 .()有何區別?
1,.()取得是通過容器的實現來取得通過類似post,get等方式傳入的數據。
.()和()只是在web容器內部流轉,僅僅是請求處理階段。
2,是返回對象,返回字符串
3,()一向是和()一起使用的,只有先用()設置之后,才能夠通過()來獲得值,它們傳遞的是類型的數據。而且必須在同一個對象中使用才有效。,而()是接收表單的get或者post提交過來的參數
54,jsp靜態包含和動態包含的區別
1、為jsp中的編譯指令,其文件的包含是發生在jsp向轉換的時期,而是jsp中的動作指令,其文件的包含是發生在編譯時期,也就是將java文件編譯為class文件的時期
2、使用靜態包含只會產生一個class文件,而使用動態包含會產生多個class文件
3、使用靜態包含,包含頁面和被包含頁面的對象為同一對象,因為靜態包含只是將被包含的頁面的內容復制到包含的頁面中去;而動態包含包含頁面和被包含頁面不是同一個頁面,被包含的頁面的對象可以取到的參數范圍要相對大些,不僅可以取到傳遞到包含頁面的參數,同樣也能取得在包含頁面向下傳遞的參數
55,MVC的各個部分都有那些技術來實現?如何實現?
MVC是Model-View-的簡寫。Model代表的是應用的業務邏輯(通過,EJB組件實現),View是應用的表示面(由JSP頁面產生),是提供應用的處理過程控制(一般是一個),通過這種設計模型把應用邏輯,處理過程和顯示邏輯分成不同的組件實現。這些組件可以進行交互和重用。
56,jsp有哪些內置對象?作用分別是什么?
JSP共有以下9個內置的對象:
1, 用戶端請求,此請求會包含來自GET/POST請求的參數
2, 網頁傳回用戶端的回應
3, 網頁的屬性是在這里管理
4, 與請求有關的會話期
5, 正在執行的內容
6,out 用來傳送回應的輸出
7, 的構架部件
8,page JSP網頁本身
9, 針對錯誤網頁,未捕捉的例外