Java面試題總結之OOA/D,UML,和XML
全文字數: 2732
閱讀時間: 大約9 分鐘
1、UML 是什麼?常用的幾種UML圖?
統一建模語言(Unified Modeling Language,UML)又稱標準建模語言;常用圖包括:用例圖,靜態圖(包括類圖、物件圖和包圖),行為圖,互動圖(順序圖, 協作圖),實現圖。
2、程式設計題: 寫一個Singleton(單例模式) 出來。
Singleton 模式主要作用是保證在Java 應用程式中,一個類Class 只有一個例項存在。舉例:定義一個類,它的建構函式為private 的,它有一個static的private 的該類變數,在類初始化時例項話,通過一個public 的getInstance方法獲取對它的引用,繼而呼叫其中的方法。
第一種餓漢式:
//懶漢式 public class Singleton { //私有化建構函式 private Singleton() { } //建立一個物件 private static Singleton instance = new Singleton(); //提供公有方法返回該物件 public static Singleton getInstance() { return instance; } }
第二種懶漢式:
//懶漢式 public class Singleton { //私有化建構函式 private Singleton(){} //建立一個空物件 private static Singleton instance = null; //建立公有方法呼叫,物件如果為空建立物件,否則直接返回當前物件 public static synchronized Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }
3、Java 中常用的設計模式?簡述工廠模式?
Java 中的23 種設計模式可以分為三類:
建立型模式(5種):
Factory( 工廠模式),Builder( 建造者模式), Factory Method(工廠方法模式),Prototype(原型模式),Singleton(單例模式)。
結構型模式(7種):
Facade(外觀模式),Adapter(介面卡模式), Bridge(橋接模式), Composite(組合模式),Decorator(裝飾器模式), Flyweight(享元模式), Proxy(代理模式)。
行為型模式(11種):
Command(命令模式), Interpreter(直譯器模式), Visitor(訪問者模式),Iterator(迭代子模式), Mediator(中介者模式), Memento(備忘錄模式),Observer(觀察者模式),State(狀態模式),Strategy(策略模式),Template Method(模板方法模式), Chain Of Responsibleity(責任鏈模式)。
工廠模式:工廠模式是一種經常被使用到的模式,根據工廠模式實現的類可以根據提供的資料生成一組類中某一個類的例項,通常這一組類有一個公共的抽象父類並且實現了相同的方法,但是這些方法針對不同的資料進行了不同的操作。首先需要定義一個基類,該類的子類通過不同的方法實現了基類中的方法。然後需要定義一個工廠類,工廠類可以根據條件生成不同的子類例項。當得到子類的例項後,開發人員可以呼叫基類中的方法而不必考慮到底返回的是哪一個子類的例項。
23種模式簡單說明:
單例模式:某個類只能有一個例項,提供一個全域性的訪問點。
簡單工廠:一個工廠類根據傳入的參量決定創建出那一種產品類的例項。
工廠方法:定義一個建立物件的介面,讓子類決定例項化那個類。
建造者模式:封裝一個複雜物件的構建過程,並可以按步驟構造。
原型模式:通過複製現有的例項來建立新的例項。
介面卡模式:將一個類的方法介面轉換成客戶希望的另外一個介面。
組合模式:將物件組合成樹形結構以表示“”部分-整體“”的層次結構。
裝飾模式:動態的給物件新增新的功能。
代理模式:為其他物件提供一個代理以便控制這個物件的訪問。
亨元(蠅量)模式:通過共享技術來有效的支援大量細粒度的物件。
外觀模式:對外提供一個統一的方法,來訪問子系統中的一群介面。
橋接模式:將抽象部分和它的實現部分分離,使它們都可以獨立的變化。
模板模式:定義一個演算法結構,而將一些步驟延遲到子類實現。
直譯器模式:給定一個語言,定義它的文法的一種表示,並定義一個直譯器。
策略模式:定義一系列演算法,把他們封裝起來,並且使它們可以相互替換。
狀態模式:允許一個物件在其物件內部狀態改變時改變它的行為。
觀察者模式:物件間的一對多的依賴關係。
備忘錄模式:在不破壞封裝的前提下,保持物件的內部狀態。
中介者模式:用一箇中介物件來封裝一系列的物件互動。
命令模式:將命令請求封裝為一個物件,使得可以用不同的請求來進行引數化。
訪問者模式:在不改變資料結構的前提下,增加作用於一組物件元素的新功能。
責任鏈模式:將請求的傳送者和接收者解耦,使的多個物件都有處理這個請求的機會。
迭代器模式:一種遍歷訪問聚合物件中各個元素的方法,不暴露該物件的內部結構。
4、開發中都用到了那些設計模式?用在什麼場合?
所謂設計模式,就是一套被反覆使用的程式碼設計經驗的總結(情境中一個問題經過證實的一個解決方案)。使用設計模式是為了可重用程式碼、讓程式碼更容易被他人理解、保證程式碼可靠性。設計模式使人們可以更加簡單方便的複用成功的設計和體系結構。每個模式都描述了一個在我們的環境中不斷出現的問題,然後描述了該問題的解決方案的核心。通過這種方式,你可以無數次地使用那些已有的解決方案,無需在重複相同的工作。
(1) MVC模式,在JavaEE專案開發中主要用在表示層框架中,很好解決檢視和流程控制。在專案中採用的Struts、SpringMVC等框架。
(2) DAO模式,在專案開發中主要用在資料層,封裝資料的訪問操作,為業務層提供資料服務。
(3) IoC模式,在專案開發中業務層有大量物件,他們之間存在依賴關係,可以使用IoC模式減少他們之間的程式碼耦合,提高系統的可擴充套件性。實際專案中使用的Spring框架來實現業務元件的裝配。
(4) Observer模式,在Servlet的監聽器中應用到了觀察者模式。
(5) singleton單例模式和Factory工廠模式結合使用在專案中無需使用者瞭解過多的細節就可獲取有關的物件例項。比如Hibernate專案中通過SessionFactory來獲取Session。
(6) bridge模式,在專案中使用JDBC驅動訪問資料庫。
5、你對軟體開發中迭代的含義的理解。
軟體開發中,各個開發階段不是順序執行的,各個階段都是並行執行也就是迭代的意思。這樣能更好的適應,開發中的需求變化,及人員的變動
6、XML 文件定義有幾種形式?它們之間有何本質區別?解析XML 文件有哪幾種方式?
1)兩種形式:dtd 以及schema;
2)本質區別:schema 本身是xml 的,可以被XML 解析器解析(這也是從DTD上發展schema 的根本目的);
3)解析方式:
1.DOM解析: DOM的全稱是Document Object Model,也即文件物件模型。在應用程式中,基於DOM的XML分析器將一個XML文件轉換成一個物件模型的集合(通常稱DOM樹),應用程式正是通過對這個物件模型的操作,來實現對XML文件資料的操作。通過DOM介面,應用程式可以在任何時候訪問XML文件中的任何一部分資料,因此,這種利用DOM介面的機制也被稱作隨機訪問機制。
2.SAX解析:SAX的全稱是Simple APIs for XML,也即XML簡單應用程式介面。與DOM不同,SAX提供的訪問模式是一種順序模式,這是一種快速讀寫XML資料的方式。當使用SAX分析器對XML文件進行分析時,會觸發一系列事件,並激活相應的事件處理函式,應用程式通過這些事件處理函式實現對XML文件的訪問,因而SAX介面也被稱作事件驅動介面。
3.JDOM解析:JDOM採用了Java中的Collection架構來封裝集合,是Java愛好者更加熟悉的模式
4.DOM4J解析:xml解析器一次性把整個xml文件載入進記憶體,然後在記憶體中構建一顆Document的物件樹,通過Document物件,得到樹上的節點物件,通過節點物件訪問(操作)到xml文件的內容
7、你在專案中用到了xml 技術的哪些方面?怎麼實現的?
用到了資料存貯,資訊配置兩方面。
1.在做資料交換平臺時,將不能資料來源的資料組裝成XML 檔案,然後將XML 檔案壓縮打包加密後通過網路傳送給接收者,接收解密與解壓縮後再同XML 檔案中還原相關資訊進行處理。
2.在做軟體配置時,利用XML 可以很方便的進行,軟體的各種配置引數都存貯在XML 檔案中。
8、用jdom 解析xml 檔案時如何解決中文問題?如何解析?
程式碼如下,用編碼方式加以解決
public class DOMTest { // 檔案路徑 private String outFile = "F:\\people.xml"; public static void main(String args[]) { new DOMTest(); } public DOMTest() { try { // 1、獲取DOM解析器工廠,以便產生解析器;2、獲取DOM解析器,以便解析DOM DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); Document doc = builder.newDocument(); // 3.建立元素 Element root = doc.createElement("老師"); Element wang = doc.createElement("許"); // 4.向指定元素節點中增加子元素節點或增加元素到子節點 wang.appendChild(doc.createTextNode("我是許老師")); root.appendChild(wang); doc.appendChild(root); // 5.設定然後把DOM寫回XML檔案 Transformer transformer = TransformerFactory.newInstance().newTransformer(); // 6.指定Transformer應該使用的首選字元編碼,將字元序列作為位元組序列進行編碼 transformer.setOutputProperty(OutputKeys.ENCODING, "gb2312"); // 7.指定Transformer是否可以新增額外的空白,同時輸出 transformer.setOutputProperty(OutputKeys.INDENT, "yes"); transformer.transform(new DOMSource(doc), new StreamResult(outFile)); } catch (Exception e) { System.out.println(e.getMessage()); } } }
檔案效果: