a.hashCode() 有什麼用?與 a.equals(b) 有什麼關係?
hashCode() 方法對應物件整數的 hash 值。它常用於基於 hash 的集合類,如 Hashtable、HashMap、LinkedHashMap等等。它與 equals() 方法關係特別緊密。根據 Java 規範,兩個使用 equal() 方法來判斷相等的對象,必須具有相同的 hash code。
位元組流與字元流的差異 (推薦學習:java面試題目)
要把一段二進位資料資料逐一輸出到某個設備中,或從某個設備中逐一讀取一段二進位數據,不管輸入輸出設備是什麼,我們要用統一的方式來完成這些操作。
用一種抽象的方式來描述,這個抽象描述方式起名為IO流,對應的抽象類別為OutputStream和InputStream,不同的實作類別就代表不同的輸入和輸出設備,它們都是針對位元組進行操作的。
計算機中的一切最終都是二進位的位元組形式存在。對於常用到的中文字符,首先要得到其對應的字節,然後將位元組寫入到輸出流。
讀取時,首先讀到的是字節,可是我們要把它顯示為字符,我們需要將字節轉換成字符。由於這樣的需求很廣泛,Java專門提供了字元流包裝類別。
底層設備永遠只接受位元組數據,有時候要寫字串到底層設備,需要將字串轉成位元組再寫入。字元流是位元組流的包裝,字元流則是直接接受字串,它內部將串轉成字節,再寫入底層設備,這為我們向IO設備寫入或讀取字串提供了一點方便。
字元轉換成位元組時,要注意編碼的問題,因為字串轉成位元組數組,其實是轉成該字元的某種編碼的位元組形式,讀取也是反之的道理。
什麼是java序列化,如何實現java序列化?或者請解釋Serializable介面的作用。
我們有時候將一個java物件變成位元組流的形式傳出去或從一個位元組流中恢復成一個java對象,例如,要將java物件儲存到硬碟或傳送給網路上的其他計算機,這個過程我們可以自己寫程式碼去把一個java物件變成某個格式的位元組流再傳輸。
但是,jre本身就提供了這種支持,我們可以呼叫OutputStream的writeObject方法來做,如果要讓java幫我們做,要被傳輸的物件必須實作serializable接口,這樣,javac編譯時就會進行特殊處理,編譯的類別才可以被writeObject方法操作,這就是所謂的序列化。
需要被序列化的類別必須實現Serializable接口,該接口是一個mini接口,其中沒有需要實現方法,implements Serializable只是為了標註該對像是可被序列化的。
例如,在web開發中,如果物件被保存在了Session中,tomcat在重啟時要把Session物件序列化到硬碟,這個物件就必須實作Serializable介面。如果物件要經過分散式系統進行網路傳輸,被傳輸的物件就必須實作Serializable介面。
描述JVM載入class檔案的原理機制?
JVM中類別的裝載是由ClassLoader和它的子類別來實現的,Java ClassLoader是一個重要的Java執行時間系統組件。它負責在運行時查找和裝入類別文件的類別。
heap和stack有什麼差別。
java的記憶體分為兩類,一類是堆疊內存,一類是堆疊記憶體。棧記憶體是指程式進入一個方法時,會為這個方法單獨分配一塊私屬儲存空間,用於儲存這個方法內部的局部變量,當這個方法結束時,分配給這個方法的棧會釋放,這個棧中的變數也會隨之釋放。
堆是與堆疊作用不同的內存,一般用於存放不在目前方法堆疊中的那些資料。
例如,使用new建立的物件都放在堆裡,所以,它不會隨方法的結束而消失。方法中的局部變數使用final修飾後,放在堆中,而不是堆疊中。
GC是什麼?為什麼要有GC?
GC是垃圾收集的意思(Gabage Collection),記憶體處理是程式設計人員容易出現問題的地方,忘記或者錯誤的記憶體回收會導致程式或系統的不穩定甚至崩潰。
Java提供的GC功能可以自動監控物件是否超過作用域以達到自動回收記憶體的目的,Java語言並沒有提供釋放已指派記憶體的顯示操作方法。
垃圾回收的優點和原則。並考慮2種回收機制。
Java语言中一个显著的特点就是引入了垃圾回收机制,使c 程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存管理。由于垃圾回收机制,Java中的对象不再有"作用域"的概念,只有对象的引用才有"作用域"。
垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。
垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。
回收机制有分代复制垃圾回收和标记垃圾回收,增量垃圾回收。
垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收?
对于GC来说,当程序员创建对象时,GC就开始监控这个对象的地址、大小以及使用情况。通常,GC采用有向图的方式记录和管理堆(heap)中的所有对象。
通过这种方式确定哪些对象是"可达的",哪些对象是"不可达的"。当GC确定一些对象为"不可达"时,GC就有责任回收这些内存空间。
程序员可以手动执行System.gc(),通知GC运行,但是Java语言规范并不保证GC一定会执行。
Java 中,throw 和 throws 有什么区别
throw 用于抛出 java.lang.Throwable 类的一个实例化对象,意思是说你可以通过关键字 throw 抛出一个Exception,如:
throw new IllegalArgumentException(“XXXXXXXXX″)
而throws 的作用是作为方法声明和签名的一部分,方法被抛出相应的异常以便调用者能处理。Java 中,任何未处理的受检查异常强制在 throws 子句中声明。
java中会存在内存泄漏吗,请简单描述。
先解释什么是内存泄漏:所谓内存泄露就是指一个不再被程序使用的对象或变量一直被占据在内存中。java中有垃圾回收机制,它可以保证当对象不再被引用的时候,对象将自动被垃圾回收器从内存中清除掉。
由于Java使用有向图的方式进行垃圾回收管理,可以消除引用循环的问题,例如有两个对象,相互引用,只要它们和根进程不可达,那么GC也是可以回收它们的。
java中的内存泄露的情况:长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄露,尽管短生命周期对象已经不再需要,但是因为长生命周期对象持有它的引用而导致不能被回收,这就是java中内存泄露的发生场景。
通俗地说,就是程序员可能创建了一个对象,以后一直不再使用这个对象,这个对象却一直被引用,即这个对象无用但是却无法被垃圾回收器回收的,这就是java中可能出现内存泄露的情况。
例如,缓存系统,我们加载了一个对象放在缓存中(例如放在一个全局map对象中),然后一直不再使用它,这个对象一直被缓存引用,但却不再被使用。
以上是Java的基礎面試題目(4)的詳細內容。更多資訊請關注PHP中文網其他相關文章!