更新時間:2019-08-15 15:00:03 來源:動力節點 瀏覽2420次
1、Java如何實現多態,實現的主要方法。
java是借助方法的重寫和重載實現多態。
重載的特性,方法名相同.返回類型,傳入方法的參數不同(包括個數和類型)。
重寫的特性,方法名相同,返回類型,參數均相同,必須發生在子類。
2、Hashtable\HashMap有什么區別,HashMap實現的算法思想,多個任意長度的值進行hash操作,得出的hash值是否相等?
(1)Hashtable是繼承自陳舊的Dictionary類的,HashMap繼承自AbstractMap類同時是Java
1.2引進的Map接口的一個實現。
(2)也許最重要的不同是Hashtable的方法是同步的,而HashMap的方法不是。
(3)第三點不同是,只有HashMap可以讓你將空值作為一個表的條目的key或value。HashMap中只有一條記錄可以是一個空的key,但任意數量的條目可以是空的value。這就是說,如果在表中沒有發現搜索鍵,或者如果發現了搜索鍵,但它是一個空的值,那么get()將返回null。如果有必要,用containKey()方法來區別這兩種情況。
(4)HashMap去掉了Hashtable的contains方法,保留了containsValue和containsKey方法。
(5)Hashtable中hash數組默認大小是11,增加的方式是 old*2+1。HashMap中hash數組的默認大小是16,而且一定是2的指數。
1)首先HashMap里面實現一個靜態內部類Entry 其重要的屬性有 key , value, next,從屬性key,value我們就能很明顯的看出來Entry就是HashMap鍵值對實現的一個基礎bean,我們上面說到HashMap的基礎就是一個線性數組,這個數組就是Entry[],Map里面的內容都保存在Entry[]里面。
2)既然是線性數組,為什么能隨機存取?這里HashMap用了一個小算法,大致是這樣實現:
Java代碼
A:存儲時:
B:int hash = key.hashCode();--> 這個hashCode方法這里不詳述,只要理解每個key的hash是一個固定的int值
C:int index = hash % Entry[].length;
D:Entry[index] = value;
E:取值時:
F:int hash = key.hashCode();
G:int index = hash % Entry[].length;
H: return Entry[index]
3、說明inputstream和inputstreamreader的區別
InputStream是字節流
reader是字符流
inputstreamreader是將字節流轉換成字符流,是上面兩者的轉換類。
4、 Java實現多線程的方法有哪些?什么情況需實現線程同步,線程同步的方法有哪幾種?
多線程有兩種實現方法。一種是繼承Thread類,一種是實現Runnable接口!
在多個線程同時訪問互斥(可交換)數據時,應該同步以保護數據,確保兩個線程不會同時修改更改它。
同步有兩種方法。一種同步方法,一種同步代碼!分別是synchronized,wait與notify
5、Xml解析方式有哪幾種,有什區別?
Dom解析在內存中創建一個DOM樹,該結構通常需要加載整個文檔然后才能做工作。由于它是基于信息層次的,因而DOM被認為是基于樹或基于對象的,樹在內存中是持久的,因此可以修改它以便應用程序能對數據和結構作出更改能隨機訪問文件內容,也可以修改原文件內容。
SAX解析 SAX處理的優點非常類似于流媒體的優點。分析能夠立即開始,而不是等待所有的數據被處理。SAX解析器采用了基于事件的模型,它在解析XML文檔的時候可以觸發一系列的事件,當發現給定的tag的時候,它可以激活一個回調方法,告訴該方法制定的標簽已經找到。而且,由于應用程序只是在讀取數據時檢查數據,因此不需要將數據存儲在內存中。這對于大型文檔來說是個巨大的優點線性解析,不能隨機訪問,也無法修改原文件。
JDOM解析 JDOM的目的是成為Java特定文檔模型,它簡化與XML的交互并且比使用DOM實現更快.JDOM僅使用具體類而不使用接口。這在某些方面簡化了API,但是也限制了靈活性。第二,API大量使用了Collections類,簡化了那些已經熟悉這些類的Java開發者的使用。
DOM4j解析 DOM4J使用接口和抽象基本類方法。DOM4J大量使用了API中的Collections類,但是在許多情況下,它還提供一些替代方法以允許更好的性能或更直接的編碼方法。直接好處是,雖然DOM4J付出了更復雜的API的代價,但是它提供了比JDOM大得多的靈活性。
6、使用過的觸發器有哪幾種?有什么區別?
觸發器是一種特殊類型的存儲過程,主要是通過事件進行觸發而被執行的。
SQL Server 2000 支持兩種類型的觸發器:AFTER 觸發器和INSTEAD OF 觸發器。其中AFTER 觸發器即為SQL Server 2000 版本以前所介紹的觸發器。該類型觸發器要求只有執行某一操作(INSERT UPDATE DELETE)之后,觸發器才被觸發,且只能在表上定義。可以為針對表的同一操作定義多個觸發器。對于AFTER 觸發器,可以定義哪一個觸發器被最先觸發,哪一個被最后觸發,通常使用系統過程sp_settriggerorder來完成此任務。
INSTEAD OF 觸發器表示并不執行其所定義的操作(INSERT、 UPDATE、 DELETE),而僅是執行觸發器本身。既可在表上定義INSTEAD OF 觸發器,也可以在視圖上定義INSTEAD OF 觸發器,但對同一操作只能定義一個INSTEAD OF 觸發器。
7、Struts和struts2.0有什么區別,使用時需要注意什么?
/**Action類
Struts1要求Action類繼承一個抽象類,Struts1使用抽象類編程而不是接口
Struts2可以實現Action接口也可以不實現,Struts2提供一個ActionSuport基類去實現常用接口。Action接口不是必須的,任何有execute的標識的POJO都有可能成為struts2的Action的對象
/**線程模式
Struts1的Action是單例模式并且是線程安全的,僅有Action一個實例來處理所有請求。單策略模式限制了Struts1 Action能做的事。比且在開發時要注意Action資源必須是線程安全比且是同步的。
Struts2的Action對象為每個請求產生一個實例,因此沒有線程安全問題。
/**Servlet依賴
Struts1 Action依賴與Servlet API,因為當一個Action被調用時HttpServletRequest和HttpServletResponse被傳遞給execute方法。
Struts2 Action不依賴與容器,允許Action脫離容器被單獨測試。如果需要,struts2依然可以訪問初始的request和response。但是,其他的元素減少或者消除了直接訪問
HttpServletRequest和HttpServletResponse的必要性。
/**可測性:
測試Struts1 Action的一個主要問題是execute方法暴漏了Servlet API(這使得測試要依賴于容器)。一個第三方擴展--Struts TestCase--提供了一套Struts1的模擬對象(來進行測試)
struts2 Action可以通過初始化、設置屬性、調用方法來測試,“依賴注入”支持也使測試更容易。
/**捕獲輸入:
struts1使用ActionForm對象捕獲輸入。所有ActionForm必須繼承一個基類。因為其他JavaBean不能用作ActionForm,開發者經常創建多余的基類不或輸入。動態Bean(DynaBeans)可以作為創建傳統ActionForm的選擇,但是,開發者可能是在重新描述(創建)已經存在的JavaBean(仍然會導致有沉余的JavaBean)。
Struts2直接使用Acrtion屬性作為輸入屬性,消除了對第二個輸入對象的請求。輸入屬性可能是有自己(子)屬性的Rich對象類型。Action屬性能過通過web頁面上的Taglibs訪問。
struts2也支持ActionForm模式。Richard對象類型,包括業務對象,能夠用作輸入/輸出對象。這種ModelDriven特性簡化了Taglib對POJO輸入對象的引用
/**表達式語言
Struts1整合了JSTL,因此使用JSTL EL。這種EL有基本對象圖遍歷,但是對集合和索引屬性的支持很脆弱。
Struts2可以使用JSTL,但是也支持一個更強大和靈活的表達式語言--“object graph Notation Language”(OGNL)
/**綁定值到頁面(view)
Struts1使用標準JSP機制吧對象綁定到頁面中來訪問。
struts2使用ValueStack技術,使taglib能夠訪問值而不需要把你的頁面(view)和對象綁定起來。ValueStack策略允許通過一系列名稱相同但類型不同的屬性重同頁面(view)
/**類型轉換
Struts1 ActionForm屬性通常都是String類型。struts1使用Commons-Beanutils進行類型轉換。每個類一個轉換器,對每一個實例來說是不可配置的
struts2 使用OGNL進行類型轉換,提供基本和常用對象的轉換器。
/**效驗
Struts1支持在ActionForm的validate方法中手動效驗,或者通過Commons Validator的擴展來效驗。同一個類可以有不同的效驗內容,但不能效驗子對象。
Struts2支持通過validate方法和XWork效驗框架進行效驗。XWork效驗框架使用為屬性類類型定義的效驗和內容效驗,來支持Chain效驗子屬性。
/**Action執行的控制
Struts1支持每一個模塊有單獨的Request Processors(生命周期),但是模塊中的所有Action必須共享相同的生命周期。
struts2支持通過攔截器堆棧(Interceptor Stacks)為每一個Action創建不能的生命周期。堆棧能夠根據需要和不同的Action一起使用。
10. 使用Java定義一個單鏈表結構,編程實現對定義的單鏈表結構的反轉。
/**
* @author luochengcheng
* 定義一個單鏈表
*/
class Node {
//變量
privateint record;
//指向下一個對象
private Node nextNode;
public Node(int record) {
super();
this.record = record;
}
publicintgetRecord() {
return record;
}
public void setRecord(int record) {
this.record = record;
}
public Node getNextNode() {
returnnextNode;
}
public void setNextNode(Node nextNode) {
this.nextNode = nextNode;
}
}
/**
* @author luochengcheng
* 兩種方式實現單鏈表的反轉(遞歸、普通)
* 新手強烈建議旁邊拿著紙和筆跟著代碼畫圖(便于理解)
*/
public class ReverseSingleList {
/**
* 遞歸,在反轉當前節點之前先反轉后續節點
*/
public static Node reverse(Node head) {
if (null == head || null == head.getNextNode()) {
return head;
}
Node reversedHead = reverse(head.getNextNode());
head.getNextNode().setNextNode(head);
head.setNextNode(null);
returnreversedHead;
}
/**
* 遍歷,將當前節點的下一個節點緩存后更改當前節點指針
*
*/
public static Node reverse2(Node head) {
if (null == head) {
return head;
}
Node pre = head;
Node cur = head.getNextNode();
Node next;
while (null != cur) {
next = cur.getNextNode();
cur.setNextNode(pre);
pre = cur;
cur = next;
}
//將原鏈表的頭節點的下一個節點置為null,再將反轉后的頭節點賦給head
head.setNextNode(null);
head = pre;
return head;
}
public static void main(String[] args) {
Node head = new Node(0);
Node tmp = null;
Node cur = null;
// 構造一個長度為10的鏈表,保存頭節點對象head
for (int i = 1; i < 10; i++) {
tmp = new Node(i);
if (1 == i) {
head.setNextNode(tmp);
} else {
cur.setNextNode(tmp);
}
cur = tmp;
}
//打印反轉前的鏈表
Node h = head;
while (null != h) {
System.out.print(h.getRecord() + " ");
h = h.getNextNode();
}
//調用反轉方法
head = reverse2(head);
System.out.println("\n**************************");
//打印反轉后的結果
while (null != head) {
System.out.print(head.getRecord() + " ");
head = head.getNextNode();
}
}
}
運行:
C:\ex>java ReverseSingleList
0 1 2 3 4 5 6 7 8 9
**************************
9 8 7 6 5 4 3 2 1 0
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習