面試整理(Java基礎5)

82、JDBC 能否處理 Blob 和 Clob?

可以處理,其中Blob是指數據庫存儲打的二進制數據。Clob是指存儲大的文本數據,JDBC 的 PreparedStatement 和ResultSet 都提供了相應的方法來支持 Blob 和 Clob 操作。

85、獲得一個類的類對象有哪些方式?

1:類.class[例如:String.class;]
2:對象.getClass()[例如:”hello”.getClass()]
3:Class.forName()[例如:Class.forName(“java.lang.String”)]

89:簡述一下面向對象的”六原則一法則”

(1)單一職責原則:一個類只做它該做的事情。(單一職責原則想表達的就是”高內聚”,寫代碼最終極的原則只有六個字”高內聚、低耦合”,就如同葵花寶典或辟邪劍譜的中心思想就八個字”欲練此功必先自宮”,所謂的高內聚就是一個代碼模塊只完成一項功能,在面向對象中,如果只讓一個類完成它該做的事,而不涉及與它無關的領域就是踐行了高內聚的原則,這個類就只有單一職責。我們都知道一句話叫”因爲專注,所以專業”,一個對象如果承擔太多的職責,那麼註定它什麼都做不好。這個世界上任何好的東西都有兩個特徵,一個是功能單一,好的相機絕對不是電視購物裏面賣的那種一個機器有一百多種功能的,它基本上只能照相;另一個是模塊化,好的自行車是組裝車,從減震叉、剎車到變速器,所有的部件都是可以拆卸和重新組裝的,好的乒乓球拍也不是成品拍,一定是底板和膠皮可以拆分和自行組裝的,一個好的軟件系統,它裏面的每個功能模塊也應該是可以輕易的拿到其他系統中使用的,這樣才能實現軟件複用的目標。)
 
(2)開閉原則:軟件實體應當對擴展開放,對修改關閉。(在理想的狀態下,當我們需要爲一個軟件系統增加新功能時,只需要從原來的系統派生出一些新類就可以,不需要修改原來的任何一行代碼。要做到開閉有兩個要點:①抽象是關鍵,一個系統中如果沒有抽象類或接口系統就沒有擴展點;②封裝可變性,將系統中的各種可變因素封裝到一個繼承結構中,如果多個可變因素混雜在一起,系統將變得複雜而換亂,如果不清楚如何封裝可變性,可以參考《設計模式精解》一書中對橋樑模式的講解的章節。)
 
(3)依賴倒轉原則:面向接口編程。(該原則說得直白和具體一些就是聲明方法的參數類型、方法的返回類型、變量的引用類型時,儘可能使用抽象類型而不用具體類型,因爲抽象類型可以被它的任何一個子類型所替代,請參考下面的里氏替換原則。)
 
(4)里氏替換原則:任何時候都可以用子類型替換掉父類型。(關於里氏替換原則的描述,Barbara Liskov 女士的描述比這個要複雜得多,但簡單的說就是能用父類型的地方就一定能使用子類型。里氏替換原則可以檢查繼承關係是否合理,如果一個繼承關係違背了里氏替換原則,那麼這個繼承關係一定是錯誤的,需要對代碼進行重構。例如讓貓繼承狗,或者狗繼承貓,又或者讓正方形繼承長方形都是錯誤的繼承關係,因爲你很容易找到違反里氏替換原則的場景。需要注意的是:子類一定是增加父類的能力而不是減少父類的能力,因爲子類比父類的能力更多,把能力多的對象當成能力少的對象來用當然沒有任何問題。)
 
(5)接口隔離原則:接口要小而專,絕不能大而全。(臃腫的接口是對接口的污染,既然接口表示能力,那麼一個接口只應該描述一種能力,接口也應該是高度內聚的。例如,琴棋書畫就應該分別設計爲四個接口,而不應設計成一個接口中的四個方法,因爲如果設計成一個接口中的四個方法,那麼這個接口很難用,畢竟琴棋書畫四樣都精通的人還是少數,而如果設計成四個接口,會幾項就實現幾個接口,這樣的話每個接口被複用的可能性是很高的。Java 中的接口代表能力、代表約定、代表角色,能否正確的使用接口一定是編程水平高低的重要標識。)
 
(6)合成聚合複用原則:優先使用聚合或合成關係複用代碼。(通過繼承來複用代碼是面向對象程序設計中被濫用得最多的東西,因爲所有的教科書都無一例外的對繼承進行了鼓吹從而誤導了初學者,類與類之間簡單的說有三種關係,Is-A 關係、Has-A 關係、Use-A 關係,分別代表繼承、關聯和依賴。其中,關聯關係根據其關聯的強度又可以進一步劃分爲關聯、聚合和合成,但說白了都是Has-A 關係,合成聚合複用原則想表達的是優先考慮 Has-A 關係而不是 Is-A 關係複用代碼,原因嘛可以自己從百度上找到一萬個理由,需要說明的是,即使在Java 的 API 中也有不少濫用繼承的例子,例如 Properties 類繼承了 Hashtable類,Stack 類繼承了 Vector 類,這些繼承明顯就是錯誤的,更好的做法是在Properties 類中放置一個 Hashtable 類型的成員並且將其鍵和值都設置爲字符串來存儲數據,而 Stack 類的設計也應該是在 Stack 類中放一個 Vector 對象來存儲數據。記住:任何時候都不要繼承工具類,工具是可以擁有並可以使用的,而不是拿來繼承的。)
 
(7)迪米特法則:迪米特法則又叫最少知識原則,一個對象應當對其他對象有儘可能少的瞭解。(迪米特法則簡單的說就是如何做到”低耦合”,門面模式和調停者模式就是對迪米特法則的踐行。對於門面模式可以舉一個簡單的例子,你去一家公司洽談業務,你不需要了解這個公司內部是如何運作的,你甚至可以對這個公司一無所知,去的時候只需要找到公司入口處的前臺美女,告訴她們你要做什麼,她們會找到合適的人跟你接洽,前臺的美女就是公司這個系統的門面。再複雜的系統都可以爲用戶提供一個簡單的門面,Java Web 開發中作爲前端控制器的 Servlet 或 Filter 不就是一個門面嗎,瀏覽器對服務器的運作方式一無所知,但是通過前端控制器就能夠根據你的請求得到相應的服務。調停者模式也可以舉一個簡單的例子來說明,例如一臺計算機,CPU、內存、硬盤、顯卡、聲卡各種設備需要相互配合才能很好的工作,但是如果這些東西都直接連接到一起,計算機的佈線將異常複雜,在這種情況下,主板作爲一個調停者的身份出現,它將各個設備連接在一起而不需要每個設備之間直接交換數據,這樣就減小了系統的耦合度和複雜度,如下圖所示。迪米特法則用通俗的話來將就是不要和陌生人打交道,如果真的需要,找一個自己的朋友,讓他替你和陌生人打交道。)

91、用 Java 寫一個單例類。

兩種單例模式

95、用 Java 寫一個折半查找。

折半查找,也稱二分查找、二分搜索,是一種在有序數組中查找某一特定元素的搜索算法。搜素過程從數組的中間元素開始,如果中間元素正好是要查找的元素,則搜素過程結束;如果某一特定元素大於或者小於中間元素,則在數組大於或小於中間元素的那一半中查找,而且跟開始一樣從中間元素開始比較。如果在某一步驟數組已經爲空,則表示找不到指定的元素。這種搜索算法每一次比較都使搜索範圍縮小一半,其時間複雜度是 O(logN)。

import java.util.Comparator;
public class MyUtil {
	public static <T extends Comparable<T>> int binarySearch(T[] x, T
	key) {
		return binarySearch(x, 0, x.length- 1, key);
	}
	// 使用循環實現的二分查找
	public static <T> int binarySearch(T[] x, T key, Comparator<T> comp)
	{
		int low = 0;
		int high = x.length - 1;
		while (low <= high) {
			int mid = (low + high) >>> 1;
			int cmp = comp.compare(x[mid], key);
			if (cmp < 0) {
				low= mid + 1;
			} else if (cmp > 0) {
				high= mid - 1;
			} else {
				return mid;
			}
		}
		return -1;
	}
	// 使用遞歸實現的二分查找
	private static<T extends Comparable<T>> int binarySearch(T[] x, int
	low, int high, T key) {
		if(low <= high) {
			int mid = low + ((high -low) >> 1);
			if(key.compareTo(x[mid])== 0) {
				return mid;
			} else if(key.compareTo(x[mid])< 0) {
				return binarySearch(x,low, mid - 1, key);
			} else {
				return binarySearch(x,mid + 1, high, key);
			}
		}
		return -1;
	}
}

說明:上面的代碼中給出了折半查找的兩個版本,一個用遞歸實現,一個用循環實現。需要注意的是計算中間位置時不應該使用(high+ low) / 2 的方式,因爲加法運算可能導致整數越界,這裏應該使用以下三種方式之一:low + (high - low)/ 2 或 low + (high – low) >> 1 或(low + high) >>> 1(>>>是邏輯右移,是不帶符號位的右移)

面試整理(Java基礎4)

轉載自;https://juejin.im/post/5decd3e16fb9a0164d45f999#heading-35

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