深入java面試題目

0、Oracle-那些列可以建索引,那些列不可以建索引  

 
什麼字段應該建立索引
在作爲主鍵的列上,強制該列的唯一性和組織表中數據的排列結構;
在經常用在連接的列上,這些列主要是一些外鍵,可以加快連接的速度;
在經常需要根據範圍進行搜索的列上創建索引,因爲索引已經排序,其指定的範圍是連續的;
在經常需要排序的列上創建索引,因爲索引已經排序,這樣查詢可以利用索引的排序,加快排序查詢時間;
在經常使用在WHERE子句中的列上面創建索引,加快條件的判斷速度。

 

什麼字段不適合建立索引

在查詢中很少使用或者參考的列

只有很少數據值的列 ,例如性別

更新頻繁,檢索不頻繁的列

大數據對象類型的列


1、多態的實現機制

◆強制的:一種隱 式做類型轉換的方法。

◆重載的:將一個標誌符用作多個意義。

◆參數的:爲不同類型的參數提供相同的操作。

◆包含的:類包含關係的抽象操作。

2、類加載的原理
JVM在加載類時默認採用的是雙親委派機制。通俗的講,就是某個特定的類加載器在接到加載類的請求時,首先
將加載任務委託給父類加載器,依次遞歸,如果父類加載器可以完成類加載任務,就成功返回;只有父類加載器無法完成此加載任務時,才自己去加載。

3、舉一個線程同步的例子

4、對SOA的理解
類似玩積木,模塊拼接
5、用過什麼開源web框架
Struts2、hibernate、spring、ibatis。
6、講述各種排序算法的特點
插入、希爾、冒泡、合併、選擇、堆、快速、桶式排序

7、如何處理對數據庫某張表的大量併發處理,性能提高
Oracle只在修改時纔對數據加行級鎖

8、數據庫中各種表的關聯關係的理解
一對一、一對多、多對多
9、面向對象的特徵
封裝、繼承、多態、抽象
1、Lucene和Nutch的區別
 Lucene 不是完整的應用程序,而是一個用於實現全文檢索的軟件庫。
Nutch  是一個應用程序,可以以 Lucene 爲基礎實現搜索引擎應用。
2、通過什麼途徑瞭解最新的技術發展

3、HashMap和HashTable的區別
HashMap是Hashtable的輕量級實現(非線程安全的實現),他們都完成了Map接口,主要區別在於HashMap允許空(null)鍵值(key),由於非線程安全,效率上可能高於Hashtable。
HashMap允許將null作爲一個entry的key或者value,而Hashtable不允許。
HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因爲contains方法容易讓人引起誤解。
Hashtable繼承自Dictionary類,而HashMap是Java1.2引進的Map interface的一個實現。
最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多個線程訪問Hashtable時,不需要自己爲它的方法實現同步,而HashMap 就必須爲之提供外同步。
Hashtable和HashMap採用的hash/rehash算法都大概一樣,所以性能不會有很大的差異。

4、Hibernate工作原理及爲什麼要用?

原理:
1.通過Configuration().configure();讀取並解析hibernate.cfg.xml配置文件
2.由hibernate.cfg.xml中的<mapping resource=”com/xx/User.hbm.xml”/>讀取並解析映射信息
3.通過config.buildSessionFactory();//創建SessionFactory
4.sessionFactory.openSession();//打開Sesssion
5.session.beginTransaction();//創建事務Transation
6.persistent operate持久化操作
7.session.getTransaction().commit();//提交事務
8.關閉Session
9.關閉SesstionFactory

爲什麼要用:
1. 對JDBC訪問數據庫的代碼做了封裝,大大簡化了數據訪問層繁瑣的重複性代碼。

2. Hibernate是一個基於JDBC的主流持久化框架,是一個優秀的ORM實現。他很大程度的簡化DAO層的編碼工作

3. hibernate使用Java反射機制,而不是字節碼增強程序來實現透明性。

4. hibernate的性能非常好,因爲它是個輕量級框架。映射的靈活性很出色。它支持各種關係數據庫,從一對一到多對多的各種複雜關係。
 

5、一個請求在Struts2框架中的處理大概分爲以下幾個步驟
1 客戶端初始化一個指向Servlet容器(例如Tomcat)的請求
2 這個請求經過一系列的過濾器(Filter)(這些過濾器中有一個叫做ActionContextCleanUp的可選過濾器,這個過濾器對於Struts2和其他框架的集成很有幫助,例如:SiteMesh Plugin)
3 接着FilterDispatcher被調用,FilterDispatcher詢問ActionMapper來決定這個請是否需要調用某個Action
4 如果ActionMapper決定需要調用某個Action,FilterDispatcher把請求的處理交給ActionProxy
5 ActionProxy通過Configuration Manager詢問框架的配置文件,找到需要調用的Action類
6 ActionProxy創建一個ActionInvocation的實例。
7 ActionInvocation實例使用命名模式來調用,在調用Action的過程前後,涉及到相關攔截器(Intercepter)的調用。
8 一旦Action執行完畢,ActionInvocation負責根據struts.xml中的配置找到對應的返回結果。返回結果通常是(但不總是,也可 能是另外的一個Action鏈)一個需要被表示的JSP或者FreeMarker的模版。在表示的過程中可以使用Struts2 框架中繼承的標籤。在這個過程中需要涉及到ActionMapper

6、常用設計模式
1.單例模式:如果一個類始終只能創建一個實例,則這個類被稱爲單例類,這種模式就被稱爲單例模式。
單例模式主要有如下兩個優勢:
1)減少創建Java實例所帶來的系統開銷
2)便於系統跟蹤單個Java實例的生命週期、實例狀態等。
 
2.簡單工廠模式:是由一個工廠對象決定創建出哪一種產品類的實例。
缺陷:當產品修改時,工廠類也要做相應的修改。
優勢:讓對象的調用者和對象創建過程分離,當對象調用者需要對象時,直接向工廠請求即可。從而避免了對象的
調用者與對象的實現類以硬編碼方式耦合,以提高系統的可維護性、可擴展性。

3.工廠方法:如果我們不想在工廠類中進行邏輯判斷,程序可以爲不同產品類提供不同的工廠,不同的工廠類和
產不同的產品。當使用工廠方法設計模式時,對象調用者需要與具體的工廠類耦合。

4.代理模式:當客戶端代碼需要調用某個對象時,客戶端實際上不關心是否準確得到該對象,
它只要一個能提供該功能的對象即可,此時我們就可返回該對象的代理。
Spring所創建的AOP代理就是這種動態代理。但是Spring AOP更靈活。

5.命令模式:某個方法需要完成某一個功能,完成這個功能的大部分步驟已經確定了,但可能有少量具體步驟無
法確定,必須等到執行該方法時纔可以確定。傳入該方法的是某個接口的匿名實現類的實例,該接口通常被稱爲命令接口,這種設計方式也被稱爲命令模式
HibernateTemplate使用了executeXxx()方法彌補了HibernateTemplate的不足,該方法需要接受一個HibernateCallback接口

6.策略模式用於封裝系列的算法,這些算法通常被封裝在一個被稱爲Context的類中,客戶端程序可以自由選擇其中一種算法,或讓Context爲客戶端選擇一種最佳算法。
優勢是爲了支持算法的自由切換。
缺點:客戶端代碼
需要和不同的策略耦合。

7。門面模式(Facade)也被稱爲正面模式、外觀模式,這種模式用於將一組複雜的類包裝到一個簡單的外部接口中。

8.橋接模式:橋接模式的做法是把變化部分抽象出來,使變化部分與主類分離開來,從而將多個的變化徹底分離。最後提供一個管理類來組合不同維度上的變化,
通過這種組合來滿足業務的需要。
Java EE應用中常見的DAO模式正是橋接模式的應用。

9.觀察者模式:觀察者模式定義了對象間的一對多依賴關係,讓一個或多個觀察者對象觀察一個主題對象。
當主題對象的狀態發生變化時,系統能通知所有的依賴於此對象的觀察者對象,從而使得觀察者對象能夠自動更新。

10.State模式:允許一個對象在其內部狀態改變時改變它的行爲

7、比如spring有哪些常用技術:
Spring是一個輕型容器(light-weight container),其核心是Bean工廠(Bean Factory),用以構造我們
所需要的M(Model)。在此基礎之上,Spring提供了AOP(Aspect-Oriented Programming, 面向層面的編程)
的實現,用它來提供非管理環境下申明方式的事務、安全等服務;對Bean工廠的擴展ApplicationContext更
加方便我們實現J2EE的應用;DAO/ORM的實現方便我們進行數據庫的開發;Web MVC和Spring Web提供了Java Web應用的框架或與其他流行的Web框架進行集成。

8、AOP面向切面–Proxy模式:AOP爲Aspect Oriented Programming的縮寫,意爲:面向切面編程。
可以通過預編譯方式和運行期動態代理實現在不修改源代碼的情況下給程序動態統一添加功能的一種技術,我
們可以理解爲在一個服務的流程中,插入與該服務的業務邏輯無關的系統服務邏輯,如日誌、安全認證等等

8、IOC(Inversion of Control)控制反轉(DI–Dependency Injection依賴注入)–State模式:容器動態的將某種依賴注入到組件之中。

9、JNDI(Java Naming and Directory Interface,Java命名和目錄接口)是一組在Java應用中訪問命名和目錄服務的API。

0、樂觀鎖和悲觀鎖的區別:悲觀鎖假定其他用戶企圖訪問或者改變你正在訪問、更改的對象的概率是很高的,因此
在悲觀鎖的環境中,在你開始改變此對象之前就將該對象鎖住,並且直到你提交了所作的更改之後才釋放鎖。悲
觀的缺陷是不論是頁鎖還是行鎖,加鎖的時間可能會很長,這樣可能會長時間的限制其他用戶的訪問,也就是說
悲觀鎖的併發訪問性不好。與悲觀鎖相反,樂觀鎖則認爲其他用戶企圖改變你正在更改的對象的概率是很小的,
因此樂觀鎖直到你準備提交所作的更改時纔將對象鎖住,當你讀取以及改變該對象時並不加鎖。

1、transient和volatile是java關鍵字嗎?(瞬聯)
transient是修飾變量不被序列化
volatile是修飾變量局部的線程同步
2、能說一下java的反射機制嗎?(瞬聯)
開放性和原因連接(causally-connected)是反射系統的兩大基本要素
反射機制:所謂的反射機制就是java語言在運行時擁有一項自觀的能力。通過這種能力可以徹底的瞭解自身的情況爲下一步的動作做準備。
下面具體介紹一下java的反射機制。這裏你將顛覆原來對java的理解。
Java的反射機制的實現要藉助於4個類:class,Constructor,Field,Method;其中class代表的時類對 象

3、如果類a繼承類b,實現接口c,而類b和接口c中定義了同名變量,請問會出現什麼問題?
ambiguous 引起歧義的
4、請說一下java中爲什麼要引入內部類?還有匿名內部類?
nner class得以讓你控制“某個class在另一個class中的可視性”。
anonymous inner class 爲可實現一個功能或者實例化一個對象, 需要實現一個接口, 但是接口應用的地方很多, 但是每個地方的實現
都不盡相同, 而且需要實例化的地方就只只有那麼一兩處, 這個時候, 如果爲了這些地方, 每個聲明一個類來
實現接口的話, 就會浪費很多空間, 還得費時編譯, 匿名內部類可以在需要的地方使用接口, 可以在使用的同
時實現, 這樣不但節省了空間, 還可以使代碼更加明瞭

5、請說一下HTTP請求的基本過程

http1

http1.1

6、java中存在內存泄漏問題嗎?請舉例說明?(IBM)
會。java導致內存泄露的原因很明確:長生命週期的對象持有短生命週期對象的引用就很可能發生內存泄露,
儘管短生命週期對象已經不再需要,但是因爲長生命週期對象持有它的引用而導致不能被回收,這就是java中內存泄露的發生場景。
7、請說一下java中的內存回收機制所採用的算法(IBM,瞬聯)
標記-清除算法:

經典方法,網上有很多,這裏只說一下finalize。

1.在finalize()中再次引用自己,可以避免對象被回收掉;

2.finalize()方法只會被調用一次,如果對象面臨下一次回收,finalize是不會執行第二遍的;

3.需要執行finalize()的對象會被放入一個F-Queue中,由一個優先級比較低的線程去執行。(需注意多線程同步)

複製算法:

將內存劃分爲大小相等的兩塊,每次只使用其中的一塊,當這一塊用完了,就將還存活着的對象複製到另一塊,

然後清理掉使用過的內存。非活動的對象就被回收了,並且內存分配時也不用考慮內存碎片,只需按順序分配即可。

這種實現比較簡單、高效。缺點是每次浪費一半內存空間。

優化:

1.實踐中可以根據每次會被回收的比例,安排一個合適的內存空間比例,比如9:1,90%的內存可被使用,僅有10%的空閒。

2.向一端移動:有點類似memcpy,將所有存活對象向一端移動,覆蓋可回收對象,邊界以外的內存空間都是可用內存空間。

8.精簡指令集與複雜指令集的區別比較

    複雜指令集CPU內部爲將較複雜的指令譯碼,也就是指令較長,分成幾個微指令去執行,正是如此開發程序比較
容易(指令多的緣故),但是由於指令複雜,執行工作效率較差,處理數據速度較慢,PC 中 Pentium的結構都
爲CISC CPU。
RISC是精簡指令集CPU,指令位數較短,內部還有快速處理指令的電路,使得指令的譯碼與數據的處理較快,所
以執行效率比CISC高,不過,必須經過編譯程序的處理,才能發揮它的效率,

9.對於單鏈表的逆置有兩種方法可以實現:

(1)利用輔助指針
    基本思想:在遍歷結點過程中,設置輔助指針,用於記錄先前遍歷的結點。這樣依次編譯的過程中只需修改其後繼結點的next域即可。
(2)遞歸
     基本思想:在對當前結點逆置時,先遞歸地逆置其後繼結點,然後將後繼結點指向當前結點。
0.兩個有序的數組,如何高效地判斷相同字編程實現?

    O(n)算法。因爲兩個數組都是排好序的。所以只要一次遍歷就行了。首先設兩個下標,分別初始化爲兩個數組
的起始地址,依次向前推進 。推進的規則是比較兩個數組中的數字,小的那個數組的下標向前推進一步,直
到任何一個數組的下標到達數組末尾時,如果這時還沒碰到相同的數字,說明數組中沒有相同的數字。

1.有1000桶酒,其中1桶有毒。而一旦吃了,毒性會在1周後發作。現在我們用小老鼠做實驗,要在1周後找出那桶
毒酒,問最少需要多少老鼠

    10只老鼠按順序排好,每桶酒按照編號轉換成二進制,給相應位置上是1的老鼠喝。最後按死掉的老鼠是哪幾只,然後排成二進制,再轉成十進制就是第幾桶酒。

比如:第70桶酒,70轉換成二進制就是0001000110,那麼就給第四、八、九隻老鼠喝。如果最後死掉第三、七、八隻老鼠,那麼就是0010001100,轉換成十進制就是140,即140桶酒有毒。

2.topn指的是從已經存在的數組中,找出最大(或最小)的前n個元素。
    topn算法實現思路(找最大的n個元素)
1:取出數組的前n個元素,創建長度爲n的最小堆。
2:從n開始循環數組的剩餘元素,如果元素(a)比最小堆的根節點大,將a設置成最小堆的根節點,並讓堆保持最小堆的特性。
3:循環完成後,最小堆中的所有元素就是需要找的最大的n個元素。
堆的定義是:n個元素的序列{k1,k2,…,kn},當且僅當滿足如下關係時被成爲堆

    (1)Ki <= k2i 且 ki <= k2i-1        

  或 (2) Ki >= k2i 且 ki >= k2i-1

          (i = 1,2,…[n/2])

當滿足(1)時,爲最小堆,當滿足(2)時,爲最大堆。

3.java語言特點
1.Java是面嚮對象語言
2.Java是靜態類型
3.Java是編譯型的
4.Java是跨平臺的
5.Java的魯棒性
6.Java是多線程的
7.Java自動收集無用的垃圾對象
8.Java是快速的安全的
9.Java是可擴展的

4.Thread.setDaemon的用法,經過學習以後瞭解:

1. setDaemon需要在start方法調用之前使用

2. 線程劃分爲用戶線程和後臺(daemon)進程,setDaemon將線程設置爲後臺進程

3. 如果jvm中都是後臺進程,當前jvm將exit。(隨之而來的,所有的一切煙消雲散,包括後臺線程啦)

4. 主線程結束後,

      1) 用戶線程將會繼續運行

      2) 如果沒有用戶線程,都是後臺進程的話,那麼jvm結束

 

另外:

setDaemon方法把java的線程設置爲守護線程,此方法的調用必須在線程啓動之前執行。只有在當前jvm中所有的線程都爲守護線程時,jvm纔會退出。
如果創建的線程沒有顯示調用此方法,這默認爲用戶線程。

5.java語言的魯棒性(robustness)

    控制系統在其特性或參數發生攝動時仍可使品質指標保持不變的性能。
 Java在編譯和運行程序時 ,都要對可能出現的問題進行檢查 ,以消除錯誤的產生。它提供自動垃圾收集來進
行內存管理 ,防止程序員在管理內存時容易產生的錯誤。通過集成的面向對象的例外處理機制 ,在編譯時,
Java提示出可能出現但未被處理的例外 ,幫助程序員正確地進行選擇以防止系統的崩潰。另外, Java在編譯
時還可捕獲類型聲明中的許多常見錯誤,防止動態運行時不匹配問題的出現。

点赞