Java開發面試題一

  昨天在北京參加了一個公司的面試,面試的是Java開發工程師的職位,現在把面試題整理出來:

  1. Java中幾種集合(List、Set、Map)的區別:(具體可以參考:http://blog.csdn.net/speedme/article/details/22398395)

       1.1 集合分類:

                  Collection: List、Set

                  Map: HashMap、 HashTable

       1.2  具體實現:

               1.21 Set(集合)

                        Set具有與Collection完全一樣的接口,沒有額外的功能,只是表現行爲不同。存入Set的每個元素都必須是唯一的,因爲Set不保存重複元素。

                        Set不保存重複元素的原因是它的add()方法有判斷對象是否存在集合的邏輯:                           

  1. boolean isExists=false;  
  2.  
  3. Iterator iterator=set.iterator();  
  4.  
  5. while(it.hasNext())           {  
  6.  
  7. String oldStr=it.next();  
  8.  
  9. if(newStr.equals(oldStr)){  
  10.  
  11. isExists=true;  
  12.  
  13. }  
  14.  

                      因此加入Set的元素必須定義equals()方法以確保對象的唯一性。Set接口不保證維護元素的次序。

                Set接口的實現類有:

                       HashSet:爲快速查找設計的Set。存入HashSet的對象必須定義HashCode()

                       TreeSet: 保存次序的Set,底層爲樹結構,使用它可以從Set中提取有序的序列。

                       LinkedHashSet:: 具有HashSet的查詢速度,且內部使用鏈表維護元素的順序(插入次序).

              1.22  List

                        List的特徵是其元素以線性方式存儲,集合中可以存放重複對象。

                        List接口實現類:

                            ArrayList(): 代表長度可以改變的數組。可以對元素進行隨機的訪問,向ArrayList()中插入與刪除元素的速度慢。

                            LinkedList(): 在實現中採用鏈表的數據結構。插入和刪除速度快,訪問速度慢。

              1.23 Map

                        Map是一種把鍵對象和值對象映射的集合,它的每一個元素都包含一對鍵對象和值對象。Map集合中的鍵對象不允許重複,

                        但可以將任意多個鍵獨享映射到同一個值對象上。

                       Map接口的實現類:       

HashMap:Map基於散列表的實現。插入和查詢“鍵值對”的開銷是固定的。可以通過構造器設置容量capacity和負載因子load factor,以調整容器的性能。 

LinkedHashMap: 類似於HashMap,但是迭代遍歷它時,取得“鍵值對”的順序是其插入次序,或者是最近最少使用(LRU)的次序。只比HashMap慢一點。

                                   而在迭代訪問時發而更快,因爲它使用鏈表維護內部次序。 

TreeMap : 基於紅黑樹數據結構的實現。查看“鍵”或“鍵值對”時,它們會被排序(次序由Comparabel或Comparator決定)。 

                      TreeMap的特點在 於,你得到的結果是經過排序的。TreeMap是唯一的帶有subMap()方法的Map,它可以返回一個子樹。 

WeakHashMao :弱鍵(weak key)Map,Map中使用的對象也被允許釋放: 這是爲解決特殊問題設計的。

                                 如果沒有map之外的引用指向某個“鍵”,則此“鍵”可以被垃圾收集器回收。 

IdentifyHashMap: : 使用==代替equals()對“鍵”作比較的hash map。專爲解決特殊問題而設計。

2. Jsp和Serverlet的區別和聯繫:

     JSP是Servlet技術的擴展,本質上是Servlet的簡易方式,更強調應用的外表表達。JSP編譯後是"類servlet"。Servlet和JSP最主要的不同點在於,

Servlet的應用邏輯是在Java 文件中,並且完全從表示層中的HTML裏分離開來。而JSP的情況是Java和HTML可以組合成一個擴展名爲.jsp的文件。

JSP側重於視圖,Servlet主要用於控制邏輯。

3.簡述攔截器、過濾器、監聽器:(可以參考:http://blog.csdn.net/lzwjavaphp/article/details/13771109)

   過濾器,是在java web中,你傳入的request,response提前過濾掉一些信息,或者提前設置一些參數,然後再傳入servlet或者struts的 action進行業務邏輯,

    比如過濾掉非法url(不是login.do的地址請求,如果用戶沒有登陸都過濾掉),或者在傳入servlet或者 struts的action前統一設置字符集,或者去除掉一些非法字符

   攔截器,是在面向切面編程的就是在你的service或者一個方法,前調用一個方法,或者在方法後調用一個方法比如動態代理就是攔截器的簡單實現,

   在你調用方法前打印出字符串(或者做其它業務邏輯的操作),也可以在你調用方法後打印出字符串,甚至在你拋出異常的時候做業務邏輯的操作。

   監聽器Listener,它是實現了javax.servlet.ServletContextListener 接口的服務器端程序,它也是隨web應用的啓動而啓動,只初始化一次,隨web應用的停止而銷燬。
   主要作用是:做一些初始化的內容添加工作、設置一些基本的內容、比如一些參數或者是一些固定的對象等等。

4. 數據庫的索引:http://blog.csdn.net/ant_ren/article/details/2932068 和 

   爲什麼要創建索引呢?這是因爲,創建索引可以大大提高系統的性能。 轉自(http://blog.csdn.net/pang040328/article/details/4164874

   第一,通過創建唯一性索引,可以保證數據庫表中每一行數據的唯一性。 
  第二,可以大大加快 數據的檢索速度,這也是創建索引的最主要的原因。 
  第三,可以加速表和表之間的連接,特別是在實現數據的參考完整性方面特別有意義。 
  第四,在使用分組和排序 子句進行數據檢索時,同樣可以顯著減少查詢中分組和排序的時間。 
  第五,通過使用索引,可以在查詢的過程中,使用優化隱藏器,提高系統的性能。

  也許會有人要問:增加索引有如此多的優點,爲什麼不對錶中的每一個列創建一個索引呢?這種想法固然有其合理性,然而也有其片面性。雖然,索引有許多優點, 但是,爲  表中的每一個列都增加索引,是非常不明智的。這是因爲,增加索引也有許多不利的一個方面。

  第一,創建索引和維護索引要耗費時間,這種時間隨着數據 量的增加而增加。 
  第二,索引需要佔物理空間,除了數據表佔數據空間之外,每一個索引還要佔一定的物理空間,如果要建立聚簇索引,那麼需要的空間就會更大。 
  第三,當對錶中的數據進行增加、刪除和修改的時候,索引也要動態的維護,這樣就降低了數據的維護速度。

  索引是建立在數據庫表中的某些列的上面。因此,在創建索引的時候,應該仔細考慮在哪些列上可以創建索引,在哪些列上不能創建索引。一般來說,應該在這些列 上創建索   引,例如:

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

  同樣,對於有些列不應該創建索引。一般來說,不應該創建索引的的這些列具有下列特點:

  第一,對於那些在查詢中很少使用或者參考的列不應該創建索引。這是因 爲,既然這些列很少使用到,因此有索引或者無索引,並不能提高查詢速度。相反,由於增加了索      引,反而降低了系統的維護速度和增大了空間需求。 
 第二,對於那 些只有很少數據值的列也不應該增加索引。這是因爲,由於這些列的取值很少,例如人事表的性別列,在查詢的結果中,結果集的數據行佔了表中數據行的很大  比 例,即需要在表中搜索的數據行的比例很大。增加索引,並不能明顯加快檢索速度。 
 第三,對於那些定義爲text, image和bit數據類型的列不應該增加索引。這是因爲,這些列的數據量要麼相當大,要麼取值很少。 
 第四,當修改性能遠遠大於檢索性能時,不應該創建索 引。這是因爲,修改性能和檢索性能是互相矛盾的。當增加索引時,會提高檢索性能,但是會降低修改性能。當減少索  引時,會提高修改性能,降低檢索性能。因 此,當修改性能遠遠大於檢索性能時,不應該創建索引。

 創建索引的方法和索引的特徵 
 創建索引的方法 
 創建索引有多種方法,這些方法包括直接創建索引的方法和間接創建索引的方法。直接創建索引,例如使用CREATE INDEX語句或者使用創建索引向導,間接創建索引,例如  在表中定義主鍵約束或者唯一性鍵約束時,同時也創建了索引。雖然,這兩種方法都可以創建索引,但 是,它們創建索引的具體內容是有區別的。 
 使用CREATE INDEX語句或者使用創建索引向導來創建索引,這是最基本的索引創建方式,並且這種方法最具有柔性,可以定製創建出符合自己需要的索引。在使用這種方式  創建索引時,可以使用許多選項,例如指定數據頁的充滿度、進行排序、整理統計信息等,這樣可以優化索引。使用這種方法,可以指定索引的類型、唯一性和複合 性,也就  是說,既可以創建聚簇索引,也可以創建非聚簇索引,既可以在一個列上創建索引,也可以在兩個或者兩個以上的列上創建索引。

 通過定義主鍵約束或者唯一性鍵約束,也可以間接創建索引。主鍵約束是一種保持數據完整性的邏輯,它限制表中的記錄有相同的主鍵記錄。在創建主鍵約束時,系 統自動創  建了一個唯一性的聚簇索引。雖然,在邏輯上,主鍵約束是一種重要的結構,但是,在物理結構上,與主鍵約束相對應的結構是唯一性的聚簇索引。換句話 說,在物理實現  上,不存在主鍵約束,而只存在唯一性的聚簇索引。同樣,在創建唯一性鍵約束時,也同時創建了索引,這種索引則是唯一性的非聚簇索引。因此, 當使用約束創建索引時,  索引的類型和特徵基本上都已經確定了,由用戶定製的餘地比較小。

 當在表上定義主鍵或者唯一性鍵約束時,如果表中已經有了使用CREATE INDEX語句創建的標準索引時,那麼主鍵約束或者唯一性鍵約束創建的索引覆蓋以前創建的標準索  引。也就是說,主鍵約束或者唯一性鍵約束創建的索引的優先 級高於使用CREATE INDEX語句創建的索引。

 索引的特徵 
 索引有兩個特徵,即唯一性索引和複合索引。 
 唯一性索引保證在索引列中的全部數據是唯一的,不會包含冗餘數據。如果表中已經有一個主鍵約束或者唯一性鍵約束,那麼當創建表或者修改表時,SQL Server自動創建一 個唯一性索引。然而,如果必須保證唯一性,那麼應該創建主鍵約束或者唯一性鍵約束,而不是創建一個唯一性索引。當創建唯一性索引 時,應該認真考慮這些規則:當在表中創建主鍵約束或者唯一性鍵約束時,SQL Server自動創建一個唯一性索引;如果表中已經包含有數據,那麼當創建索引時,SQL Server檢查表中已有數據的冗餘性;每當使用插入語句插入數據或者使用修改語句修改數據時,SQL Server檢查數據的冗餘性:如果有冗餘值,那麼SQL Server取消該語句的執行,並且返回一個錯誤消息;確保表中的每一行數據都有一個唯一值,這樣可以確保每一個實體都可以唯一確認;只能在可以保證實體 完整性的列上創建唯一性索引,例如,不能在人事表中的姓名列上創建唯一性索引,因爲人們可以有相同的姓名。

複合索引就是一個索引創建在兩個列或者多個列上。在搜索時,當兩個或者多個列作爲一個關鍵值時,最好在這些列上創建複合索引。當創建複合索引時,應該考慮 這些規則:最多可以把16個列合併成一個單獨的複合索引,構成複合索引的列的總長度不能超過900字節,也就是說複合列的長度不能太長;在複合索引中,所 有的列必須來自同一個表中,不能跨表建立複合列;在複合索引中,列的排列順序是非常重要的,因此要認真排列列的順序,原則上,應該首先定義最唯一的列,例 如在(COL1,COL2)上的索引與在(COL2,COL1)上的索引是不相同的,因爲兩個索引的列的順序不同;爲了使查詢優化器使用複合索引,查詢語 句中的WHERE子句必須參考複合索引中第一個列;當表中有多個關鍵列時,複合索引是非常有用的;使用複合索引可以提高查詢性能,減少在一個表中所創建的 索引數量。

               


      

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章