java只会用不知道原理6_程序员面试宝典之14道初级Java面试题分享
程序員面試寶典之14道初級Java面試題分享
程序員面試寶典之14道初級Java面試題分享!
關于贏在面試的Java題系列基本收集整理完成了,所有題目都是經過精心挑選的,很基礎又考驗求職者的基本功,應該說被面試到的幾率很大。這里我整理挑選出來供大家面試前拿來看一看。
1、a.hashCode() 有什么用?與 a.equals(b) 有什么關系?
hashCode() 方法對應對象整型的 hash 值。它常用于基于 hash 的集合類,如 Hashtable、HashMap、LinkedHashMap等等。它與 equals() 方法關系特別緊密。根據 Java 規范,兩個使用 equal() 方法來判斷相等的對象,必須具有相同的 hash code。
2、字節流與字符流的區別
要把一段二進制數據數據逐一輸出到某個設備中,或者從某個設備中逐一讀取一段二進制數據,不管輸入輸出設備是什么,我們要用統一的方式來完成這些操作,用一種抽象的方式進行描述,這個抽象描述方式起名為IO流,對應的抽象類為OutputStream和InputStream,不同的實現類就代表不同的輸入和輸出設備,它們都是針對字節進行操作的。
計算機中的一切最終都是二進制的字節形式存在。對于經常用到的中文字符,首先要得到其對應的字節,然后將字節寫入到輸出流。讀取時,首先讀到的是字節,可是我們要把它顯示為字符,我們需要將字節轉換成字符。由于這樣的需求很廣泛,Java專門提供了字符流包裝類。
底層設備永遠只接受字節數據,有時候要寫字符串到底層設備,需要將字符串轉成字節再進行寫入。字符流是字節流的包裝,字符流則是直接接受字符串,它內部將串轉成字節,再寫入底層設備,這為我們向IO設備寫入或讀取字符串提供了一點點方便。
字符向字節轉換時,要注意編碼的問題,因為字符串轉成字節數組,其實是轉成該字符的某種編碼的字節形式,讀取也是反之的道理。
3、什么是Java序列化,如何實現Java序列化?或者請解釋Serializable接口的作用。
我們有時候將一個Java對象變成字節流的形式傳出去或者從一個字節流中恢復成一個Java對象,例如,要將Java對象存儲到硬盤或者傳送給網絡上的其他計算機,這個過程我們可以自己寫代碼去把一個Java對象變成某個格式的字節流再傳輸。
但是,jre本身就提供了這種支持,我們可以調用OutputStream的writeObject方法來做,如果要讓Java幫我們做,要被傳輸的對象必須實現serializable接口,這樣,Javac編譯時就會進行特殊處理,編譯的類才可以被writeObject方法操作,這就是所謂的序列化。需要被序列化的類必須實現Serializable接口,該接口是一個mini接口,其中沒有需要實現方法,implements Serializable只是為了標注該對象是可被序列化的。
例如,在web開發中,如果對象被保存在了Session中,tomcat在重啟時要把Session對象序列化到硬盤,這個對象就必須實現Serializable接口。如果對象要經過分布式系統進行網絡傳輸,被傳輸的對象就必須實現Serializable接口。
4、描述一下JVM加載class文件的原理機制?
JVM中類的裝載是由ClassLoader和它的子類來實現的,Java ClassLoader是一個重要的Java運行時系統組件。它負責在運行時查找和裝入類文件的類。
5、heap和stack有什么區別。
Java的內存分為兩類,一類是棧內存,一類是堆內存。棧內存是指程序進入一個方法時,會為這個方法單獨分配一塊私屬存儲空間,用于存儲這個方法內部的局部變量,當這個方法結束時,分配給這個方法的棧會釋放,這個棧中的變量也將隨之釋放。
堆是與棧作用不同的內存,一般用于存放不在當前方法棧中的那些數據,例如,使用new創建的對象都放在堆里,所以,它不會隨方法的結束而消失。方法中的局部變量使用final修飾后,放在堆中,而不是棧中。
6、GC是什么?為什么要有GC?
GC是垃圾收集的意思(Gabage Collection),內存處理是編程人員容易出現問題的地方,忘記或者錯誤的內存回收會導致程序或系統的不穩定甚至崩潰,Java提供的GC功能可以自動監測對象是否超過作用域從而達到自動回收內存的目的,Java語言沒有提供釋放已分配內存的顯示操作方法。
7、垃圾回收的優點和原理。并考慮2種回收機制。
Java語言中一個顯著的特點就是引入了垃圾回收機制,使c++程序員最頭疼的內存管理的問題迎刃而解,它使得Java程序員在編寫程序的時候不再需要考慮內存管理。由于垃圾回收機制,Java中的對象不再有"作用域"的概念,只有對象的引用才有"作用域"。
垃圾回收可以有效的防止內存泄露,有效的使用可以使用的內存。垃圾回收器通常是作為一個單獨的低級別的線程運行,不可預知的情況下對內存堆中已經死亡的或者長時間沒有使用的對象進行清除和回收,程序員不能實時的調用垃圾回收器對某個對象或所有對象進行垃圾回收。
回收機制有分代復制垃圾回收和標記垃圾回收,增量垃圾回收。
8、垃圾回收器的基本原理是什么?垃圾回收器可以馬上回收內存嗎?有什么辦法主動通知虛擬機進行垃圾回收?
對于GC來說,當程序員創建對象時,GC就開始監控這個對象的地址、大小以及使用情況。通常,GC采用有向圖的方式記錄和管理堆(heap)中的所有對象。通過這種方式確定哪些對象是"可達的",哪些對象是"不可達的"。當GC確定一些對象為"不可達"時,GC就有責任回收這些內存空間。
程序員可以手動執行System.gc(),通知GC運行,但是Java語言規范并不保證GC一定會執行。
9、Java中throw和throws有什么區別?
throw 用于拋出 Java.lang.Throwable 類的一個實例化對象,意思是說你可以通過關鍵字 throw 拋出一個Exception,如:
throw new IllegalArgumentException(“XXXXXXXXX″)
而throws 的作用是作為方法聲明和簽名的一部分,方法被拋出相應的異常以便調用者能處理。Java 中,任何未處理的受檢查異常強制在 throws 子句中聲明。
10、Java中會存在內存泄漏嗎?請簡單描述。
先解釋什么是內存泄漏:所謂內存泄露就是指一個不再被程序使用的對象或變量一直被占據在內存中。Java中有垃圾回收機制,它可以保證當對象不再被引用的時候,對象將自動被垃圾回收器從內存中清除掉。
由于Java使用有向圖的方式進行垃圾回收管理,可以消除引用循環的問題,例如有兩個對象,相互引用,只要它們和根進程不可達,那么GC也是可以回收它們的。
Java中的內存泄露的情況:長生命周期的對象持有短生命周期對象的引用就很可能發生內存泄露,盡管短生命周期對象已經不再需要,但是因為長生命周期對象持有它的引用而導致不能被回收,這就是Java中內存泄露的發生場景,通俗地說,就是程序員可能創建了一個對象,以后一直不再使用這個對象,這個對象卻一直被引用,即這個對象無用但是卻無法被垃圾回收器回收的,這就是Java中可能出現內存泄露的情況,例如,緩存系統,我們加載了一個對象放在緩存中(例如放在一個全局map對象中),然后一直不再使用它,這個對象一直被緩存引用,但卻不再被使用。
11 、說一說Servlet的生命周期?
Servlet有良好的生存期的定義,包括加載和實例化、初始化、處理請求以及服務結束。這個生存期由Javax.servlet.Servlet接口的init(),service()和destroy方法表達。
Servlet被服務器實例化后,容器運行其init方法,請求到達時運行其service方法,service方法自動派遣運行與請求對應的doXXX方法(doGet,doPost)等,當服務器決定將實例銷毀的時候調用其destroy方法。
web容器加載servlet,生命周期開始。通過調用servlet的init()方法進行servlet的初始化。通過調用service()方法實現,根據請求的不同調用不同的do***()方法。結束服務,web容器調用servlet的destroy()方法。
12、Servlet API中forward()與redirect()的區別?
(1).從地址欄顯示來說
forward是服務器請求資源,服務器直接訪問目標地址的URL,把那個URL的響應內容讀取過來,然后把這些內容再發給瀏覽器.瀏覽器根本不知道服務器發送的內容從哪里來的,所以它的地址欄還是原來的地址.
redirect是服務端根據邏輯,發送一個狀態碼,告訴瀏覽器重新去請求那個地址.所以地址欄顯示的是新的URL.所以redirect等于客戶端向服務器端發出兩次request,同時也接受兩次response。
(2).從數據共享來說
forward:轉發頁面和轉發到的頁面可以共享request里面的數據.
redirect:不能共享數據.
redirect不僅可以重定向到當前應用程序的其他資源,還可以重定向到同一個站點上的其他應用程序中的資源,甚至是使用絕對URL重定向到其他站點的資源.
forward方法只能在同一個Web應用程序內的資源之間轉發請求.forward 是服務器內部的一種操作.
redirect 是服務器通知客戶端,讓客戶端重新發起請求.
所以,你可以說 redirect 是一種間接的請求, 但是你不能說"一個請求是屬于forward還是redirect "
(3).從運用地方來說
forward:一般用于用戶登陸的時候,根據角色轉發到相應的模塊.
redirect:一般用于用戶注銷登陸時返回主頁面和跳轉到其它的網站等.
(4).從效率來說
forward:高.
redirect:低.
13、request.getAttribute()和 request.getParameter()有何區別?
(1),request.getParameter()取得是通過容器的實現來取得通過類似post,get等方式傳入的數據。
request.setAttribute()和getAttribute()只是在web容器內部流轉,僅僅是請求處理階段。
(2),getAttribute是返回對象,getParameter返回字符串
(3),getAttribute()一向是和setAttribute()一起使用的,只有先用setAttribute()設置之后,才能夠通過getAttribute()來獲得值,它們傳遞的是Object類型的數據。而且必須在同一個request對象中使用才有效。,而getParameter()是接收表單的get或者post提交過來的參數
14、jsp靜態包含和動態包含的區別
(1)、為jsp中的編譯指令,其文件的包含是發生在jsp向servlet轉換的時期,而是jsp中的動作指令,其文件的包含是發生在編譯時期,也就是將Java文件編譯為class文件的時期
(2)、使用靜態包含只會產生一個class文件,而使用動態包含會產生多個class文件
(3)、使用靜態包含,包含頁面和被包含頁面的request對象為同一對象,因為靜態包含只是將被包含的頁面的內容復制到包含的頁面中去;而動態包含包含頁面和被包含頁面不是同一個頁面,被包含的頁面的request對象可以取到的參數范圍要相對大些,不僅可以取到傳遞到包含頁面的參數,同樣也能取得在包含頁面向下傳遞的參數。
總結
以上就我總結的這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值。
程序員面試寶典之14道初級Java面試題分享相關教程
總結
以上是生活随笔為你收集整理的java只会用不知道原理6_程序员面试宝典之14道初级Java面试题分享的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 抽象类 模板_Java抽象类的
- 下一篇: php 真实访问次数,PHP将访问次数写