前言
本來想著給自己放鬆一下,刷刷部落格,突然被幾道面試題難倒!java反射的作用於原理?說說List,Set,Map三者的區別?Object 有哪些常用方法?大致說一下每個方法的含義?Java 建立物件有幾種方式?似乎有點模糊了,那就大概看一下Java基礎面試題吧。好記性不如爛鍵盤
*** 12萬字的java面試題整理 ***
java反射的作用於原理
1、定義:
反射機制是在執行時,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意個物件,都能夠呼叫它的任意一個方法。在java中,只要給定類的名字,就可以透過反射機制來獲得類的所有資訊。
這種動態獲取的資訊以及動態呼叫物件的方法的功能稱為Java語言的反射機制。
2、哪裡會用到反射機制?
jdbc就是典型
Class.forName('com.mysql.jdbc.Driver.class');//載入MySQL的驅動類
這就是反射。如hibernate,struts等框架使用反射實現的。
3、反射的實現方式:
第一步:獲取Class物件,有4中方法:
1)Class.forName(“類的路徑”);
2)類名.class
3)物件名.getClass()
4)基本型別的包裝類,可以呼叫包裝類的Type屬性來獲得該包裝類的Class物件
4、實現Java反射的類:
1)Class:表示正在執行的Java應用程式中的類和介面 注意: 所有獲取物件的資訊都需要Class類來實現。
2)Field:提供有關類和介面的屬性資訊,以及對它的動態訪問許可權。
3)Constructor:提供關於類的單個構造方法的資訊以及它的訪問許可權
4)Method:提供類或介面中某個方法的資訊
5、反射機制的優缺點:
優點:
1)能夠執行時動態獲取類的例項,提高靈活性;
2)與動態編譯結合
缺點:
1)使用反射效能較低,需要解析位元組碼,將記憶體中的物件進行解析。
2)相對不安全,破壞了封裝性(因為透過反射可以獲得私有方法和屬性)
解決方案:
1、透過setAccessible(true)關閉JDK的安全檢查來提升反射速度;
2、多次建立一個類的例項時,有快取會快很多
3、ReflectASM工具類,透過位元組碼生成的方式加快反射速度
說說List,Set,Map三者的區別?
- List(對付順序的好幫手): List介面儲存一組不唯一(可以有多個元素引用相同的物件),有序
的物件 - Set(注重獨一無二的性質): 不允許重複的集合。不會有多個元素引用相同的物件。
- Map(用Key來搜尋的專家): 使用鍵值對儲存。Map會維護與Key有關聯的值。兩個Key可以引用相同的物件,但Key不能重複,典型的Key是String型別,但也可以是任何物件
Object 有哪些常用方法?大致說一下每個方法的含義
java.lang.Object
下面是對應方法的含義。
-
clone 方法
保護方法,實現物件的淺複製,只有實現了 Cloneable 介面才可以呼叫該方法,否則丟擲CloneNotSupportedException 異常,深複製也需要實現 Cloneable,同時其成員變數為引用型別的也需要實現 Cloneable,然後重寫 clone 方法。 -
finalize 方法
該方法和垃圾收集器有關係,判斷一個物件是否可以被回收的最後一步就是判斷是否重寫了此方法。 -
equals 方法
該方法使用頻率非常高。一般 equals 和 == 是不一樣的,但是在 Object 中兩者是一樣的。子類一般都要重寫這個方法。 -
hashCode 方法
該方法用於雜湊查詢,重寫了 equals 方法一般都要重寫 hashCode 方法,這個方法在一些具有雜湊功能的 Collection 中用到。
一般必須滿足 obj1.equals(obj2)true 。可以推出 obj1.hashCode()obj2.hashCode() ,但是hashCode 相等不一定就滿足 equals。不過為了提高效率,應該儘量使上面兩個條件接近等價。- JDK 1.6、1.7 預設是返回隨機數;
- JDK 1.8 預設是透過和當前執行緒有關的一個隨機數 + 三個確定值,運用 Marsaglia’s xorshiftscheme 隨機數演算法得到的一個隨機數
-
wait 方法
配合 synchronized 使用,wait 方法就是使當前執行緒等待該物件的鎖,當前執行緒必須是該物件的擁有者,也就是具有該物件的鎖。wait() 方法一直等待,直到獲得鎖或者被中斷。wait(long timeout)設定一個超時間隔,如果在規定時間內沒有獲得鎖就返回。
呼叫該方法後當前執行緒進入睡眠狀態,直到以下事件發生。- 其他執行緒呼叫了該物件的 notify 方法;
- 其他執行緒呼叫了該物件的 notifyAll 方法;
- 其他執行緒呼叫了 interrupt 中斷該執行緒;
- 時間間隔到了。
此時該執行緒就可以被排程了,如果是被中斷的話就丟擲一個 InterruptedException 異常。notify 方法
-
notify 方法
配合 synchronized 使用,該方法喚醒在該物件上等待佇列中的某個執行緒(同步佇列中的執行緒是給搶佔 CPU 的執行緒,等待佇列中的執行緒指的是等待喚醒的執行緒)。 -
notifyAll 方法
配合 synchronized 使用,該方法喚醒在該物件上等待佇列中的所有執行緒。
總結
只要把上面幾個方法熟悉就可以了,toString 和 getClass 方法可以不用去討論它們。該題目考察的是對 Object 的熟悉程度,平時用的很多方法並沒看其定義但是也在用,比如說:wait() 方法,equals() 方法等。
Java 建立物件有幾種方式?
這題目看似簡單,要好好回答起來還是有點小複雜的,我們來看看,到底有哪些方式可以建立物件?
- 使用 new 關鍵字,這也是我們平時使用的最多的建立物件的方式,示例:
User user=new User();
- 使用反射方式建立物件,使用 newInstance(),但是得處理兩個異常 InstantiationException、IllegalAccessException:
User user=User.class.newInstance();
Object object=(Object)Class.forName("java.lang.Object").newInstance()
-
使用 clone 方法,前面題目中 clone 是 Object 的方法,所以所有物件都有這個方法。
-
使用反序列化建立物件,呼叫 ObjectInputStream 類的 readObject() 方法。
我們反序列化一個物件,JVM 會給我們建立一個單獨的物件。JVM 建立物件並不會呼叫任何建構函式。一個物件實現了 Serializable 介面,就可以把物件寫入到檔案中,並透過讀取檔案來建立物件。
總結
建立物件的方式關鍵字:new、反射、clone 複製、反序列化。