Java面試題-基礎篇五__Java

來源:互聯網
上載者:User
                                      Java面試題-基礎篇五

41、a.hashCode() 有什麼用。與 a.equals(b) 有什麼關係。
        hashCode() 方法對應對象整型的 hash 值。它常用於基於 hash 的集合類,如 Hashtable、HashMap、LinkedHashMap等等。它與 equals() 方法關係特別緊密。根據 Java 規範,兩個使用 equal() 方法來判斷相等的對象,必須具有相同的 hash code。


42、位元組流與字元流的區別

       要把一段位元據資料逐一輸出到某個裝置中,或者從某個裝置中逐一讀取一段位元據,不管輸入輸出裝置是什麼,我們要用統一的方式來完成這些操作,用一種抽象的方式進行描述,這個抽象描述方式起名為IO流,對應的抽象類別為OutputStream和InputStream,不同的實作類別就代表不同的輸入和輸出裝置,它們都是針對位元組進行操作的。

       電腦中的一切最終都是二進位的位元組形式存在。對於經常用到的中文字元,首先要得到其對應的位元組,然後將位元組寫入到輸出資料流。讀取時,首先讀到的是位元組,可是我們要把它顯示為字元,我們需要將位元組轉換成字元。由於這樣的需求很廣泛,Java專門提供了字元流封裝類。

      底層裝置永遠只接受位元組資料,有時候要寫字串到底層裝置,需要將字串轉成位元組再進行寫入。字元流是位元組流的封裝,字元流則是直接接受字串,它內部將串轉成位元組,再寫入底層裝置,這為我們向IO裝置寫入或讀取字串提供了一點點方便。

      字元向位元組轉換時,要注意編碼的問題,因為字串轉成位元組數組,其實是轉成該字元的某種編碼的位元組形式,讀取也是反之的道理。


43、什麼是java序列化,如何?java序列化。或者請解釋Serializable介面的作用。

        我們有時候將一個java對象變成位元組流的形式傳出去或者從一個位元組流中恢複成一個java對象,例如,要將javaObject Storage Service到硬碟或者傳送給網路上的其他電腦,這個過程我們可以自己寫代碼去把一個java對象變成某個格式的位元組流再傳輸。

        但是,jre本身就提供了這種支援,我們可以調用OutputStream的writeObject方法來做,如果要讓java幫我們做,要被傳輸的對象必須實現serializable介面,這樣,javac編譯時間就會進行特殊處理,編譯的類才可以被writeObject方法操作,這就是所謂的序列化。需要被序列化的類必須實現Serializable介面,該介面是一個mini介面,其中沒有需要實現方法,implements Serializable只是為了標註該對象是可被序列化的。

        例如,在web開發中,如果對象被儲存在了Session中,tomcat在重啟時要把Session對象序列化到硬碟,這個對象就必須實現Serializable介面。如果對象要經過分布式系統進行網路傳輸,被傳輸的對象就必須實現Serializable介面。

 

44、描述一下JVM載入class檔案的原理機制?

        JVM中類的裝載是由ClassLoader和它的子類來實現的,Java ClassLoader是一個重要的Java運行時系統組件。它負責在運行時尋找和裝入類檔案的類。

 

45、heap和stack有什麼區別。

        java的記憶體分為兩類,一類是棧記憶體,一類是堆記憶體。棧記憶體是指程式進入一個方法時,會為這個方法單獨分配一塊私屬儲存空間,用於儲存這個方法內部的局部變數,當這個方法結束時,分配給這個方法的棧會釋放,這個棧中的變數也將隨之釋放。

        堆是與棧作用不同的記憶體,一般用於存放不在當前方法棧中的那些資料,例如,使用new建立的對象都放在堆裡,所以,它不會隨方法的結束而消失。方法中的局部變數使用final修飾後,放在堆中,而不是棧中。

 

46、GC是什麼?為什麼要有GC?

        GC是垃圾收集的意思(Gabage Collection),記憶體處理是編程人員容易出現問題的地方,忘記或者錯誤的記憶體回收會導致程式或系統的不穩定甚至崩潰,Java提供的GC功能可以自動監測對象是否超過範圍從而達到自動回收記憶體的目的,Java語言沒有提供釋放已指派記憶體的顯示操作方法。

 

47、記憶體回收的優點和原理。並考慮2種回收機制。

        Java語言中一個顯著的特點就是引入了記憶體回收機制,使c++程式員最頭疼的記憶體管理的問題迎刃而解,它使得Java程式員在編寫程式的時候不再需要考慮記憶體管理。由於記憶體回收機制,Java中的對象不再有"範圍"的概念,只有對象的引用才有"範圍"。

        記憶體回收可以有效防止記憶體泄露,有效使用可以使用的記憶體。記憶體回收行程通常是作為一個單獨的低層級的線程運行,不可預知的情況下對記憶體堆中已經死亡的或者長時間沒有使用的對象進行清除和回收,程式員不能即時的調用記憶體回收行程對某個對象或所有對象進行記憶體回收。

        回收機制有分代複製記憶體回收和標記記憶體回收,增量記憶體回收。

 

48、記憶體回收行程的基本原理是什麼。記憶體回收行程可以馬上回收記憶體嗎。有什麼辦法主動通知虛擬機器進行記憶體回收。

        對於GC來說,當程式員建立對象時,GC就開始監控這個對象的地址、大小以及使用方式。通常,GC採用有向圖的方式記錄和管理堆(heap)中的所有對象。通過這種方式確定哪些對象是"可達的",哪些對象是"不可達的"。當GC確定一些對象為"不可達"時,GC就有責任回收這些記憶體空間。

        程式員可以手動執行System.gc(),通知GC運行,但是Java語言規範並不保證GC一定會執行。


49、Java 中,throw 和 throws 有什麼區別

        throw 用於拋出 java.lang.Throwable 類的一個執行個體化對象,意思是說你可以通過關鍵字 throw 拋出一個Exception,如:
throw new IllegalArgumentException(“XXXXXXXXX″)

        而throws 的作用是作為方法聲明和簽名的一部分,方法被拋出相應的異常以便調用者能處理。Java 中,任何未處理的受檢查異常強制在 throws 子句中聲明。


50,java中會存在記憶體流失嗎,請簡單描述。

        先解釋什麼是記憶體流失:所謂記憶體泄露就是指一個不再被程式使用的對象或變數一直被佔據在記憶體中。java中有記憶體回收機制,它可以保證當對象不再被引用的時候,對象將自動被記憶體回收行程從記憶體中清除掉。

        由於Java使用有向圖的方式進行記憶體回收管理,可以消除引用迴圈的問題,例如有兩個對象,相互引用,只要它們和根進程不可達,那麼GC也是可以回收它們的。

        java中的記憶體泄露的情況:長生命週期的對象持有短生命週期對象的引用就很可能發生記憶體泄露,儘管短生命週期對象已經不再需要,但是因為長生命週期對象持有它的引用而導致不能被回收,這就是java中記憶體泄露的發生情境,通俗地說,就是程式員可能建立了一個對象,以後一直不再使用這個對象,這個對象卻一直被引用,即這個對象無用但是卻無法被記憶體回收行程回收的,這就是java中可能出現記憶體泄露的情況,例如,緩衝系統,我們載入了一個對象放在緩衝中(例如放在一個全域map對象中),然後一直不再使用它,這個對象一直被緩衝引用,但卻不再被使用。


Java知音公眾號整理一些各大公司常用的面試筆試題,供大家在每天閑暇之餘學習其中幾道題目,日積月累,等到出去面試時,一切都水到渠成,面試時就自然會遊刃有餘了。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.