標籤:
1、overload和override的區別
overload:
方法的重載
只在方法之間發生
方法名相同,並且區分大小寫
參數列表不同,具體是指參數的類型,個數,順序不同
傳回值類型沒有要求,可以相同,也可以不同
override:
方法的覆蓋
發生在父子類之間
方法名稱,參數表,傳回值都相同
修飾符一樣或者更寬
靜態方法只能被靜態方法覆蓋,沒有多態
子類不能拋出比父類更多的異常<指的是範圍>
2、介面和抽象類別的區別
抽象類別(abstract-class):
1).抽象類別不能建立對象,只可以聲明引用
2).抽象類別有建構函式
3).抽象類別裡面可以有抽象方法,也可以沒有
4).如果一個類裡面有抽象方法,則該類是抽象類別
5).如果一個類繼承抽象類別,則該類不想成為抽象類別,則必須實現抽象類別裡面的所有抽象方法
介面(interface):
是一個特殊的抽象類別
修飾屬性:
3、string 和StringBuffer StringBuilder的區別
String的長度是不可變的; StringBuffer的長度是可變的, 如果你對字串中的內容經常進行操作,特別是內容要修改時,那麼使用StringBuffer,如果最後需要String,那麼使用StringBuffer的toString()方法;安全執行緒;
StringBuilder是從 JDK 5 開始,為StringBuffer該類補充了一個單個線程使用的等價類別;
通常應該優先使用 StringBuilder類,因為它支援所有相同的操作,但由於它不執行同步,所以速度更快。
4、arrayList linkedList vector 的區別
ArrayList 和 Vector 都是使用數組方式儲存資料,此數組元素數大於實際儲存的資料以便增加和插入元素,它們都允許直接按序號索引元
素,但是插入元素要涉及數組元素移動等記憶體操作,所以索引資料快而插入資料慢,Vector 由於使用了 synchronized 方法(安全執行緒),
通常效能上較 ArrayList 差,而 LinkedList 使用雙向鏈表實現儲存,按序號索引資料需要進行前向或後向遍曆,但是插入資料時只需要記
錄本項的前後項即可,所以插入速度較快。
LinkedList 也是線程不安全的,LinkedList 提供了一些方法,使得
LinkedList 可以被當作堆棧和隊列來使用。
5、list和set 的區別
list:有序,有下標,可重複,實作類別有三種:ArrayList、Vector、LinkedList,遍曆方式有三種:for迴圈遍曆、迭代器遍曆、foreach迴圈遍曆
ArrayList、Vector底層由數組實現,預設數組長度為0
set:無序,無下標,不可重複,實作類別為HashSet,遍曆方式有兩種:迭代器遍曆、foreach迴圈遍曆
6、寫一個singleton類。
單例模式 一個類只能有一個執行個體對象
a 餓漢式
b 懶漢式
package entity;
public class Test {
public static void main(String[] args) {
// Student s= new Student();
Student s1 = Student.getStudent();
Student s2 = Student.getStudent();
System.out.println(s1==s2);
}
}
//餓漢式 類載入時就被建立對象
//class Student{
// private static Student s = new Student();
// private Student(){}
// public static Student getStudent(){
// return s;
// }
//}
//懶漢式 鎖類對象
class Student{
private static Student s;
private Student(){}
public synchronized static Student getStudent(){
if(s==null){
s = new Student();
}
return s;
}
}
7、資料庫連接池的工作機制
J2EE 伺服器啟動時會建立一定數量的池串連,並一直維持不少於此數目的池串連。用戶端程式需要串連時,池驅動程式會返回一個未使用的池串連並將其表 記為忙。如果當前沒有空閑串連,池驅動程式就建立一定數量的串連,建立串連的數量有配置參數決定。當使用的池串連調用完成後,池驅動程式將此串連表
記為空白閑,其他調用就可以使用這個串連。實現方式,返回的 Connection是原始Connection的代理,代理Connection的close方法不是真正關串連,而是把它
代理的 Connection 對象還回到串連池中。
8、說出servlet的生命週期
servlet是單例的,servlet是當第一次發出請求時執行個體化一個servlet。
servlet 有良好的生存期的定義,包括載入和執行個體化、初始化、處理請求以及服務結束。
這個生存期由 javax.servlet.Servlet 介面的 init,service 和 destroy 方法表達。Servlet 被伺服器執行個體化後,容器運行其 init 方法,請求到達時運行其 service方法,service 方法自動派遣運行與請求對應的 doXXX 方法(doGet,doPost)等,當伺服器決定將執行個體銷毀的時候調用其 destroy 方法。web 容器載入 servlet,生命週期開始。通過調用 servlet 的 init()方法進行 servlet的初始化。通過調用 service()方法實現,根據請求的不同調用不同的 do***()方法。結束服務,web 容器調用 servlet 的 destroy()方法。
10、struts mvc的介紹
M(Model)層,就相當於後台,V(View),相當於前台,C(Controller)層,相當於控制頁面跳轉;MVC 模式的目的就是實現 Web 系統的職能分工。
Model層實現系統中的商務邏輯,通常可以用 JavaBean 或 EJB來實現。
View 層用於與使用者的互動,通常用 JSP 來實現。 Controller層是Model與View之間溝通的橋樑,它可以指派使用者的請求並選擇恰當的視圖以用於顯示,同時它也可以解釋使用者的輸入並將它們映射為模型層可執行檔操作。
各個層的實現技術舉例:
M(Model)javaBean 中 DAO+Service 構成 Model 層一般由hibernate/mybatis 技術實現。模型是應用程式的主體部分。模型表示業務資料,或者商務邏輯.
C(servlet/struts action/spring action) Struts/SpringMVC 等技術。控制器工作就是根據使用者的輸入,控制使用者介面資料顯示和更新 model對象狀態。
V(View) jsp/FreeMarker 等技術,視圖是應用程式中使用者介面相關的部分,是使用者看到並與之互動的介面。
MVC的好處:分層開發,便於系統的升級
對於一個新的架構,如何學習?
首Crowdsourced Security Testing道該架構是幹嘛的,能解決什麼問題。
11、介紹hibernate
1)、hibernate 是一個開源的、採用物件導向的思想實現 ORM 映射架構,它對 jdbc 進行了一層封裝,對於資料庫的串連、關閉、資料的持久化(增刪改查)、事務的管理都進行了封裝,使得程式開發的時候可以用物件導向的思想來操作資料庫。
2)、hibernate 可以用於 jdbc 應用的任何場合。優點是,使用物件導向的思想操作資料庫;對 jdbc 的封裝,使得開發中不需要寫大量的sql 語句,大大提高了開發效率;採用資料庫方言等方式使得資料庫移植十分方便,也使得在開發中不需要考慮資料之間的差異;提供緩衝機制,提高查詢效率等。
3)、缺點是,hibernate 並不支援大量操作。對 jdbc 的封裝失去了對sql 的控制,而如果執行本地 sql 則失去了 hibernate 的可移植性的優勢。消耗記憶體較大。
12、spring 的主要作用。
SSH架構的流程:Jsp頁面——struts——Service(商務邏輯處理類)——Hibernate(左到右)struts負責控制Service的聲明周期,這樣層與層之間的依賴性強,屬於耦合。這時,使用spring架構就起到了控制Action和Service類的作用,由於上層不再控制下層的生命週期,層與層之間實現了完全脫耦,使程式運行起來效果更高,維護起來也方便。
總的來說,spring的作用是解耦合(IOC—翻轉控制或者DI—依賴注入)和事務的處理(即AOP應用)
spring的IOC(控制反轉和依賴注入)
控制反轉:就是由容器控製程序之間的(依賴)關係,而非傳統實現中,由程式員代碼直接操控(由new關鍵字來產生對象)
依賴注入:組件之間的依賴關係由容器在運行期決定,由容器動態將某種依賴注入到組件之中。
事務的處理: 在以往的JDBCTemplate中事務提交成功,異常處理都是通過Try/Catch來完成,而在Spring中,容器整合了TransactionTemplate,它封裝了所有對交易處理的功能,包括異常時交易回復,操作成功時資料提交等複雜業務功能。Hibernate中也有對事務的管理,Hibernate中交易管理是通過SessionFactory建立和維護session來完成,而Spring對SessionFactory也進行了整合,不需要再通過配置hibernate.cfg.xml來對SessionFactory進行設定。這樣可以很好的利用Spring對交易管理的強大功能。避免了每次對資料操作都要獲得Session執行個體來啟動事務/提交/復原事務還有繁瑣的Try/Catch操作。這些也就是Spring中的AOP機制很好的應用。一方面使業務開發邏輯更清晰、專業分工更加容易進行。另一方面就是應用Spring-AOP隔離降低了程式的耦合性使我們可以在不同的應用中將各個切面結合起來使用,大大提高了代碼重用度。
13、HashTable和HashMap的區別。
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 演算法都大概一樣,所以效能不會有很大的差異。
就 HashMap 與 HashTable 主要從三方面來說:
一.曆史原因:Hashtable 是基於陳舊的 Dictionary 類的,HashMap 是Java 1.2 引進的 Map 介面的一個實現
二.同步性:Hashtable是安全執行緒的,也就是說是同步的,而HashMap是線程式不安全的,不是同步的
三.值:只有 HashMap 可以讓你將空值作為一個表的條目的 key 或value
14.SERVLETAPI 中 forward() 與 redirect()的區別?
forward:請求轉寄
redirect:請求重新導向
前者僅是容器中控制權的轉向,在用戶端瀏覽器地址欄中不會顯示出轉向後的地址;後者則是完全的跳轉,瀏覽器將會得到跳轉的地址,並重新發送請求連結。這樣,從瀏覽器的地址欄中可以看到跳轉後的連結地址。所以,前者更加高效,在前者可以滿足需要時,盡量使用 forward()方法,並且,這樣也有助於隱
藏實際的連結。在有些情況下,比如,需要跳轉到一個其它伺服器上的資源,則必須使用sendRedirect()方法。
15.多態:編譯時間多態,運行時多態
方法的重載沒有多態,是指運行時多態
16.什麼是hibernate懶載入?為什麼要用懶載入?
所謂懶載入,就是延時載入或者消極式載入。
當我們訪問的資料量過大時,明顯用緩衝不合適,因為內容容量有限,為了減少並發量,減少系統資源的消耗,我們讓資料在需要的時候才進行載入,這時我們就用到了懶載入。
hibernate提供了對屬性的消極式載入
A.實體物件的消極式載入
如果想對實體物件使用消極式載入,必須要在實體的映射設定檔中進行相應的配置,如下所示:
<hibernate-mapping>
<class name=”com.neusoft.entity.User” table=”user” lazy=”true”>
……
</class>
</hibernate-mapping>
通過將class的lazy屬性設定為true,來開啟實體的消極式載入特性。如果運行下面的代碼:User user = (User)session.load();(1)
17.如何理解HIbernate?
屬於DAO層,叫持久層;封裝了JDBC
使用HQL語句,屏蔽了底層資料庫的差異
hibernate自身的懶載入機制
hibernate的三種狀態:瞬時態(Transient)<>、 持久態(Persistent)、脫管態(Detached)
java面試題002