19年5月份面試題集合【反射、拷貝】

四、反射
1. 什麼是反射機制?
JAVA反射機制是在運行狀態中,對於任意一個實體類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意方法和屬性;這種動態獲取信息以及動態調用對象方法的功能稱爲java語言的反射機制。
2. 什麼是 java 序列化?什麼情況下需要序列化?
3. 動態代理是什麼?有哪些應用?
4. 怎麼實現動態代理?

Java程序中的各個Java類屬於同一類事物,描寫敘述這類事物的Java類名就是Class.

public class ReflectTest {
	public static void main(String[] args) throws ClassNotFoundException {
		String str1 = "abc";
		Class cls1 = String.class;
		Class cls2 = str1.getClass();
		Class cls3 = Class.forName("java.lang.String");
		
		System.out.println(cls1 == cls2);
		System.out.println(cls2 == cls3);
	}
}

獲取Class類的實例方法有三種:
1、類名.class
2、對象.getClass()
3、Class.forName("String path);

反射實例化構造方法 //獲取構造方法,再根據構造方法newInstance
Object beanObj = class.getConstructor(String[].class) .newInstance(參數)
反射調用方法
c.getMethod(“main”, String[].class).invoke(beanObj, new Object[]{argv});

五、對象拷貝(詳見PDF)
61. 爲什麼要使用克隆?
62. 如何實現對象克隆?
63. 深拷貝和淺拷貝區別是什麼?

數據庫的三範式是什麼?
1.1 第一範式(1NF)無重複的列,字段不可分
1.2 第二範式(2NF)屬性完全依賴於主鍵[消除部分子函數依賴](有主鍵,非主鍵字段依賴主鍵)
1.3 第三範式(3NF)屬性不依賴於其它非主屬性[消除傳遞依賴](非主鍵字段不能相互依賴)

數據庫邏輯設計的規範化
數據庫邏輯設計的規範化就是我們一般所說的範式,我們可以這樣來簡單理解範式:
第1規範:沒有重複的組或多值的列,這是數據庫設計的最低要求。
第2規範: 每個非關鍵字段必須依賴於主關鍵字,不能依賴於一個組合式主關鍵字的某些組成部分。消除部分依賴,大部分情況下,數據庫設計都應該達到第二範式。
第3規範: 一個非關鍵字段不能依賴於另一個非關鍵字段。消除傳遞依賴,達到第三範式應該是系統中大部分表的要求,除非一些特殊作用的表。
更高的範式要求這裏就不再作介紹了,個人認爲,如果全部達到第二範式,大部分達到第三範式,系統會產生較少的列和較多的表,因而減少了數據冗餘,也利於性能的提高。

mysql面試題: 一張表裏面有ID自增主鍵,當insert了17條記錄之後,刪除了第15,16,17條記錄,再把mysql重啓,再insert一條記錄,這條記錄的ID是18還是15
1、一般情況下,我們創建的表的類型是InnoDB,如果新增一條記錄(不重啓mysql的情況下),這條記錄的id是18;但是如果重啓(文中提到的)MySQL的話,這條記錄的ID是15。因爲InnoDB表只把自增主鍵的最大ID記錄到內存中,所以重啓數據庫或者對錶OPTIMIZE操作,都會使最大ID丟失。
2、但是,如果我們使用表的類型是MylSAM,那麼這條記錄的ID就是18。因爲MylSAM表會把自增主鍵的最大ID記錄到數據文件裏面,重啓MYSQL後,自增主鍵的最大ID也不會丟失。

SQL語句優化【詳見專貼】
怎麼加快查詢速度,優化查詢效率,主要原則就是應儘量避免全表掃描,應該考慮在where及order by 涉及的列上建立索引。
建立索引不是建的越多越好,原則是:

第一:一個表的索引不是越多越好,也沒有一個具體的數字,根據以往的經驗,一個表的索引最多不能超過6個,因爲索引越多,對update和insert操作也會有性能的影響,涉及到索引的新建和重建操作。

第二:建立索引的方法論爲:
1、多數查詢經常使用的列;
2、很少進行修改操作的列;
3、索引需要建立在數據差異化大的列上

利用以上的基礎我們討論一下如何優化sql.

a. ORDER BY + LIMIT組合的索引優化
如果一個SQL語句形如:SELECT [column1],[column2],…. FROM [TABLE] ORDER BY [sort] LIMIT [offset],[LIMIT];
這個SQL語句優化比較簡單,在[sort]這個欄位上建立索引即可。

b. WHERE + ORDER BY + LIMIT組合的索引優化
如果一個SQL語句形如:SELECT [column1],[column2],…. FROM [TABLE] WHERE [columnX] = [VALUE] ORDER BY [sort] LIMIT [offset],[LIMIT];

這個語句,如果你仍然採用第一個例子中建立索引的方法,雖然可以用到索引,但是效率不高。更高效的方法是建立一個聯合索引(columnX,sort)

c. WHERE+ORDER BY多個欄位+LIMIT
如果一個SQL語句形如:SELECT * FROM [table] WHERE uid=1 ORDER x,y LIMIT 0,10;
對於這個語句,大家可能是加一個這樣的索引:(x,y,uid)。但實際上更好的效果是(uid,x,y)。這是由MySQL處理排序的機製造成




1、分佈式鎖的幾種實現方式

2、RabbitMQ的相關特點和模式
在這裏主要介紹RabbitMQ消息隊列,支持開放的高級消息隊列協議 (AMQP)。RabbitMQ的特點:強大的應用程序消息傳遞;使用方便;運行在所有主要操作系統上;支持大量開發人員平臺;開源和商業支持。消息隊列的模式有兩種模式:P2P(Point to Point),P2P模式包含三個角色:消息隊列(Queue),發送者(Sender),接收者(Receiver)。每個消息都被髮送到一個特定的隊列,接收者從隊列中獲取消息。隊列保留着消息,直到他們被消費或超時。Publish/Subscribe(Pub/Sub),包含三個角色主題(Topic),發佈者(Publisher),訂閱者(Subscriber) 。多個發佈者將消息發送到Topic,系統將這些消息傳遞給多個訂閱者。

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