某公司Java面試題及部分解答(難度較大) 1。請大概描述一下Vector和ArrayList的區(qū)別,Hashtable和HashMap的區(qū)別。(5) 2。請問你在什么情況下會(huì)在你的JAVA代碼中使用可序列化?(5) 為什么放到HttpSession中的對象必須要是可序列化的?(5) 3。為什么在重寫了equals()方法之后也必須重寫hashCode()方法?(10) 4。sleep()和wait()有什么區(qū)別?(10) 5。編程題:用最有效率的方法算出2乘以17等于多少?(5) 6。JAVA是不是沒有內(nèi)存泄漏問題?看下面的代碼片段,并指出這些代碼隱藏的問題。(10) Object[] elements = new Object[10]; int size; ... public Object pop() { if (size == 0) return null; Object o = elements[--size]; return o; } 7。請闡述一下你對JAVA多線程中“鎖”的概念的理解。(10) 8。所有的遞歸實(shí)現(xiàn)都可以用循環(huán)的方式實(shí)現(xiàn),請描述一下這兩種實(shí)現(xiàn)方式各自的優(yōu)劣。 并舉例說明在什么情況下可以使用遞歸,而在什么情況下只能使用循環(huán)而不能使用遞歸?(5) 9。請簡要講一下你對測試驅(qū)動(dòng)開發(fā)(TDD)的認(rèn)識(shí)。(10) 10。請闡述一下你對“面向接口編程”的理解。(10) 11。在J2EE中有一個(gè)“容器(Container)”的概念,不管是EJB、PICO還是Spring都有他們 各自實(shí)現(xiàn)的容器,受容器管理的組件會(huì)具有有生命周期的特性,請問,為什么需要容器? 它的好處在哪里?它會(huì)帶來什么樣的問題?(15) 12。請闡述一下你對IOC(Inversion of Control)的理解。(可以以PICO和Spring的IOC作為例子說明他們在實(shí)現(xiàn)上各自的特點(diǎn))(10) 13。下面的代碼在絕大部分時(shí)間內(nèi)都運(yùn)行得很正常,請問在什么情況下會(huì)出現(xiàn)問題?問題的根源在哪里?(10) import java.util.LinkedList; public class Stack { LinkedList list = new LinkedList(); public synchronized void push(Object x) { synchronized(list) { list.addLast( x ); notify(); } } public synchronized Object pop() throws Exception { synchronized(list) { if( list.size() <= 0 ) { wait(); } return list.removeLast(); } } } 解答: 。請大概描述一下Vector和ArrayList的區(qū)別,Hashtable和HashMap的區(qū)別。(5)線程安全與否 2。請問你在什么情況下會(huì)在你的JAVA代碼中使用可序列化?(5)cluster中session復(fù)制,緩存persist與reload 為什么放到HttpSession中的對象必須要是可序列化的?(5)沒必須,不過session反序列化過程會(huì)導(dǎo)致對象不可用. 3。為什么在重寫了equals()方法之后也必須重寫hashCode()方法?(10)API規(guī)范 4。sleep()和wait()有什么區(qū)別?(10)前者占用CPU,后者空閑CPU 5。編程題:用最有效率的方法算出2乘以17等于多少?(5)17>>1 6。JAVA是不是沒有內(nèi)存泄漏問題?看下面的代碼片段,并指出這些代碼隱藏的問題。(10)不是 ... ...沒發(fā)現(xiàn)內(nèi)存泄漏的問題 7。請闡述一下你對JAVA多線程中“鎖”的概念的理解。(10)同步因子,在某段代碼上增加同步因子,那么整個(gè)JVM內(nèi)部只能最多有一個(gè)線程執(zhí)行這段,其余的線程按FIFO方式等待執(zhí)行. 8。所有的遞歸實(shí)現(xiàn)都可以用循環(huán)的方式實(shí)現(xiàn),請描述一下這兩種實(shí)現(xiàn)方式各自的優(yōu)劣。 并舉例說明在什么情況下可以使用遞歸,而在什么情況下只能使用循環(huán)而不能使用遞歸?(5)沒發(fā)現(xiàn)所有的遞歸都可以用循環(huán)實(shí)現(xiàn)的,尤其是那種不知道循環(huán)重?cái)?shù)的遞歸算法.遞歸的優(yōu)點(diǎn)是簡煉,抽象性好;循環(huán)則更直觀.遞歸一般用于處理一級事務(wù)能轉(zhuǎn)化成更簡的二級事務(wù)的操作.歸納不出二級事務(wù)或者二級事務(wù)更復(fù)雜的情況不能用. 9。請簡要講一下你對測試驅(qū)動(dòng)開發(fā)(TDD)的認(rèn)識(shí)。(10)不認(rèn)識(shí) 10。請闡述一下你對“面向接口編程”的理解。(10)1,利于擴(kuò)展;2,暴露更少的方法; 11。在J2EE中有一個(gè)“容器(Container)”的概念,不管是EJB、PICO還是Spring都有他們 各自實(shí)現(xiàn)的容器,受容器管理的組件會(huì)具有有生命周期的特性,請問,為什么需要容器? 它的好處在哪里?它會(huì)帶來什么樣的問題?(15)組件化,框架設(shè)計(jì)... 12。請闡述一下你對IOC(Inversion of Control)的理解。(可以以PICO和Spring的IOC作為例子說明他們在實(shí)現(xiàn)上各自的特點(diǎn))(10)不理解 13。下面的代碼在絕大部分時(shí)間內(nèi)都運(yùn)行得很正常,請問在什么情況下會(huì)出現(xiàn)問題?問題的根源在哪里?(10)wait和notify使用目的不能達(dá)到,wait()的obj,自身不能notify().出題人對wait和notify機(jī)制不夠理解. import java.util.LinkedList; public class Stack { LinkedList list = new LinkedList(); public synchronized void push(Object x) { synchronized(list) { list.addLast( x ); notify(); } } public synchronized Object pop() throws Exception { synchronized(list) { if( list.size() <= 0 ) { wait(); } return list.removeLast(); } } } 你拿了多少分? 1。請大概描述一下Vector和ArrayList的區(qū)別,Hashtable和HashMap的區(qū)別。(5) // thread-safe or unsafe, could contain null values or not 2。請問你在什么情況下會(huì)在你的JAVA代碼中使用可序列化?(5) 為什么放到HttpSession中的對象必須要是可序列化的?(5) // save, communicate 3。為什么在重寫了equals()方法之后也必須重寫hashCode()方法?(10) // implementations of dictionaries need hashCode() and equals() 4。sleep()和wait()有什么區(qū)別?(10) // threads communication: wait() and notifyAll() 5。編程題:用最有效率的方法算出2乘以17等于多少?(5) // 2<<4+2 6。JAVA是不是沒有內(nèi)存泄漏問題?看下面的代碼片段,并指出這些代碼隱藏的問題。(10) ... Object[] elements = new Object[10]; int size; ... public Object pop() { if (size == 0) return null; Object o = elements[--size]; return o; } // elements[size] = null; 7。請闡述一下你對JAVA多線程中“鎖”的概念的理解。(10) // optimistic lock, pessimistic lock, signal, dead lock, starvation, synchronization 8。所有的遞歸實(shí)現(xiàn)都可以用循環(huán)的方式實(shí)現(xiàn),請描述一下這兩種實(shí)現(xiàn)方式各自的優(yōu)劣。 并舉例說明在什么情況下可以使用遞歸,而在什么情況下只能使用循環(huán)而不能使用遞歸?(5) // recursive: when you need a stack and stack memory is enough // non-recursive: when you need a queue 9。請簡要講一下你對測試驅(qū)動(dòng)開發(fā)(TDD)的認(rèn)識(shí)。(10) // write unit testing code first 10。請闡述一下你對“面向接口編程”的理解。(10) // adapter, listener, bridge, decorator, proxy... patterns 11。在J2EE中有一個(gè)“容器(Container)”的概念,不管是EJB、PICO還是Spring都有他們 各自實(shí)現(xiàn)的容器,受容器管理的組件會(huì)具有有生命周期的特性,請問,為什么需要容器? 它的好處在哪里?它會(huì)帶來什么樣的問題?(15) // encapsulation 12。請闡述一下你對IOC(Inversion of Control)的理解。(可以以PICO和Spring的IOC作為例子說明他們在實(shí)現(xiàn)上各自的特點(diǎn))(10) // reduce classes‘ dependencies 13。下面的代碼在絕大部分時(shí)間內(nèi)都運(yùn)行得很正常,請問在什么情況下會(huì)出現(xiàn)問題?問題的根源在哪里?(10) import java.util.LinkedList; public class Stack { LinkedList list = new LinkedList(); public synchronized void push(Object x) { synchronized(list) { list.addLast( x ); notify(); } } public synchronized Object pop() throws Exception { synchronized(list) { if( list.size() <= 0 ) { wait(); } return list.removeLast(); } } } // dead lock, synchronized on both ‘list‘ and ‘this‘ |
|