標籤:面試題 java
1、序列化有什麼用?為什麼要用序列化?我回答是按照中國大多數BLOG上說的那樣回答的,貌似他們不贊同。
序列化就是一種用來處理物件流程的機制,所謂物件流程也就是將對象的內容進行流化。
可以對流化後的對象進行讀寫操作,也可將流化後的對象傳輸於網路之間。
序列化是為瞭解決在對物件流程進行讀寫操作時所引發的問題。
序列化的實現:將需要被序列化的類實現Serializable介面,該介面沒有需要實現的方法,
implements Serializable只是為了標註該對象是可被序列化的,
然後使用一個輸出資料流(如:FileOutputStream)來構造一個ObjectOutputStream(物件流程)對象,
接著,使用ObjectOutputStream對象的writeObject(Object obj)方法就可以將參數為obj的對象寫出(即儲存其狀態),要恢複的話則用輸入資料流。
序列化:序列化是將對象轉換為容易傳輸的格式的過程。例如,可以序列化一個對象,
然後使用 HTTP 通過 Internet 在用戶端和伺服器之間傳輸該對象。在另一端,還原序列化將從該流重新構造對象。是對象永久化的一種機制。
確切的說應該是對象的序列化,一般程式在運行時,產生對象,這些對象隨著程式的停止運行而消失,
但如果我們想把某些對象(因為是對象,所以有各自不同的特性)儲存下來,在程式終止運行後,這些對象仍然存在,
可以在程式再次運行時讀取這些對象的值,或者在其他程式中利用這些儲存下來的對象。這種情況下就要用到對象的序列化。
對象序列化的最主要的用處就是在傳遞,和儲存對象(object)的時候,保證對象的完整性和可傳遞性。
譬如通過網路傳輸,或者把一個對象儲存成一個檔案的時候,要實現序列化介面 。
2、new一個JAVA對象的時候,記憶體是怎麼分配的?
new 對象的時候,對象存在堆中,對象引用則存在棧中
◆寄存器:我們在程式中無法控制
◆棧:存放基本類型的資料和對象的引用,但對象本身不存放在棧中,而是存放在堆中
◆堆:存放用new產生的資料
◆靜態域:存放在對象中用static定義的靜態成員
◆常量池:存放常量
◆非RAM儲存:硬碟等永久儲存空間
3、容器是怎麼管理session的?
參考 http://jingyan.baidu.com/article/25648fc1bf0da29191fd0020.html
4、Spring的AOP是用什麼原理實現的?我回答動態代理,他說還有一個,不知道是什嗎?
Spring AOP是依賴JDK動態代理和CGLIB代理實現的。
在Spring中,有介面時將採用JDK的方式實現proxy代理對象,當沒有介面時,將採用cglib中的方式實現prixy代理對象。
JDK動態代理:其代理對象必須是某個介面的實現,它是通過在運行期間建立一個介面的實作類別來完成對目標對象的代理。
CGLIB代理:實現原理類似於JDK動態代理,只是它在運行期間產生的代理對象是針對目標類擴充的子類。
CGLIB是高效的代碼產生包,底層是依靠ASM(開源的java位元組碼編輯類庫)操作位元組碼實現的,效能比JDK強。
1、JDK方式:PersonService為介面,PersonServiceBean為實作類別
public class JDKProxyFactory implements InvocationHandler { private Object targetObject; public Object createProxyIntance(Object targetObject) { this.targetObject=targetObject; return Proxy.newProxyInstance(this.targetObject.getClass().getClassLoader(), this.targetObject.getClass().getInterfaces(), this); }public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { PersonServiceBean person=(PersonServiceBean)this.targetObject; Object result=null; if(person.getUser()!=null) { result = method.invoke(targetObject, args); } return result;}}
2、使用CGlib包實現:PersonServiceBean為實作類別, 而沒有PersonService介面
public class CGlibProxyFactory implements MethodInterceptor{ private Object targetObject; public Object createProxyInstance(Object targetObject) { this.targetObject=targetObject; Enhancer enhancer=new Enhancer(); enhancer.setSuperclass(this.targetObject.getClass());//設定目標類的子類,該子類會覆蓋所有父類中的非final方法 enhancer.setCallback(this);//設定回調 return enhancer.create(); }public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { PersonServiceBean person=(PersonServiceBean)this.targetObject; Object result=null; if(person.getUser()!=null) { result = methodProxy.invoke(targetObject, args); } return null;}}
5、JVM的工作原理?注意不是工作流程,這誰都知道
JVM工作原理和特點主要是指作業系統裝入JVM是通過jdk中Java.exe來完成,通過下面4步來完成JVM環境.
1.建立JVM裝載環境和配置
2.裝載JVM.dll
3.初始化JVM.dll並掛界到JNIENV(JNI調用介面)執行個體
4.調用JNIEnv執行個體裝載並處理class類。
持續更新...
java中級面試題