武漢光迅科技Java筆試題
1.Java中的override和overload的區別?
override(重寫):指子類繼承父類,重寫父類中的方法。 overload(過載):指用一個類中,方法名相同,傳參個數不同、引數型別不同、傳參順序不同的方法,與方法返回型別無關。
2.什麼是值傳遞什麼是引用傳遞?
值傳遞:傳遞的是儲存單元中的內容,而非地址或者引用!
引用傳遞:引用傳遞是指在呼叫函式時將實際引數的地址傳遞到函式中,那麼在函式中對引數所進行的修改,將影響到實際引數。
Java中只有按值傳遞,沒有按引用傳遞!
3.建立執行緒有幾種方式?你喜歡哪一種,為什麼?
建立執行緒有三種方法:
1.繼承Thread類,重寫run方法;
2.實現Runnable的方法;
3.使用ExecutorService、Callable、Future實現有返回結果的多執行緒;
但多數時間我們實現Runnable,因為java支援多實現,但不支援多繼承。
4.ES是什麼?簡述他的優點。
ES(Elasticsearch)是一個基於Lucene的搜尋伺服器。 ES是分散式的不需要其他元件,分發是實時的; ES實時搜尋非常快; ES處理多租戶不需要特殊配置,學習成本較低;
5.簡述你所知道的mysql的分庫分表方案?
垂直拆分
垂直分表
也就是“大表拆小表”,基於列欄位進行的。一般是表中的欄位較多,將不常用的, 資料較大,長度較長(比如text型別欄位)的拆分到“擴充套件表“。一般是針對那種幾百列的大表,也避免查詢時,資料量太大造成的“跨頁”問題。
垂直分庫 垂直分庫針對的是一個系統中的不同業務進行拆分,比如使用者User一個庫,商品Producet一個庫,訂單Order一個庫。 切分後,要放在多個伺服器上,而不是一個伺服器上。為什麼? 我們想象一下,一個購物網站對外提供服務,會有使用者,商品,訂單等的CRUD。沒拆分之前, 全部都是落到單一的庫上的,這會讓資料庫的單庫處理能力成為瓶頸。按垂直分庫後,如果還是放在一個數據庫伺服器上, 隨著使用者量增大,這會讓單個數據庫的處理能力成為瓶頸,還有單個伺服器的磁碟空間,記憶體,tps等非常吃緊。 所以我們要拆分到多個伺服器上,這樣上面的問題都解決了,以後也不會面對單機資源問題。
水平拆分
水平分表
針對資料量巨大的單張表(比如訂單表),按照某種規則(RANGE,HASH取模等),切分到多張表裡面去。 但是這些表還是在同一個庫中,所以庫級別的資料庫操作還是有IO瓶頸。不建議採用。
水平分庫分表 將單張表的資料切分到多個伺服器上去,每個伺服器具有相應的庫與表,只是表中資料集合不同。 水平分庫分表能夠有效的緩解單機和單庫的效能瓶頸和壓力,突破IO、連線數、硬體資源等的瓶頸。
水平分庫分表切分規則
RANGE
從0到10000一個表,10001到20000一個表;
HASH取模
一個商場系統,一般都是將使用者,訂單作為主表,然後將和它們相關的作為附表,這樣不會造成跨庫事務之類的問題。 取使用者id,然後hash取模,分配到不同的資料庫上。
地理區域
比如按照華東,華南,華北這樣來區分業務,七牛雲應該就是如此。
時間
按照時間切分,就是將6個月前,甚至一年前的資料切出去放到另外的一張表,因為隨著時間流逝,這些表的資料 被查詢的概率變小,所以沒必要和“熱資料”放在一起,這個也是“冷熱資料分離”。
6.簡述shrio實現許可權控制的原理。
- 應用程式碼呼叫Subject(當前登入使用者)控制期限
- Subject在shiro框架內部呼叫Shiro在shiro框架裡呼叫Shiro SecurityManager 安全管理器
- 安全管理器呼叫 Realm (程式和安全資料聯結器 )。
- Subject如果要進行任何操作都西亞喲呼叫安全管理(底層自動實現),而安全管理器會呼叫指定的Realms物件,來連線安全資料。
- Realms用來編寫安全程式碼邏輯和訪問安全資料,是連線程式和安全資料的橋樑。
7.IOC和AOP分別是什麼,原理呢?
IOC:控制反轉,一種思想,將建立Bean的工作交給框架去完成; 例項化一個 java 物件有三種方式:使用類構造器,使用靜態工廠方法,使用例項工廠方法,當使用 spring 時我們就不需要關心通過何種方式例項化一個物件,spring 通過控制反轉機制自動為我們例項化一個 物件。
AOP:面向切面程式設計,一種思想,將服務,模組,方法,想象成一個個的切面,在前面的前後進行一些操作,,許可權驗證,事物管理,記錄日誌等公用操作處理的過程就是面向切面程式設計的思想。
8.三根不均勻的繩子,每根繩子燒完是一個小時,如何實現計時一個小時十五分鐘。
第一根和第二根同時點,第一根點一頭,第二根點兩頭 在第二根燃完後(30分鐘),點燃第一根的另一頭 前兩根燃完後(15分鐘),點燃第三根的兩頭 全部燃完後(30分鐘) 一共就是1小時15分鐘.
9.資料庫:
Student(S#,Sname,Sage,Ssex)學生表,
Course(C#,Cname,T#)課程表,
SC(S#,C#,score)成績表,
Teacher(T#,Tname)教師表。
問題
1.查詢“001”課程比“002”課程成績高的所有學生的學號;
select a.S#
from
(select s#,score from SC where C#='001')a,
(select s#,score,from SC where C#='002') b
where
a.score>b.score
and
a.s#=b.s#;
2、查詢平均成績大於60分的同學的學號和平均成績;
select S#,avg(score)
from sc
group by S#
having avg(score) >60;
3、查詢所有同學的學號、姓名、選課數、總成績;
select Student.S#,Student.Sname,count(SC.C#),sum(score)
from Student
left Outer join SC
on
Student.S#=SC.S#
group by Student.S#,Sname
4、查詢各科成績最高和最低的分:以如下形式顯示:課程ID,最高分,最低分
SELECT L.C# As 課程ID,L.score AS 最高分,R.score AS 最低分
FROM SC L ,SC AS R
WHERE L.C# = R.C# and
L.score = (SELECT MAX(IL.score)
FROM SC AS IL,Student AS IM
WHERE L.C# = IL.C# and IM.S#=IL.S#
GROUP BY IL.C#)
AND
R.Score = (SELECT MIN(IR.score)
FROM SC AS IR
WHERE R.C# = IR.C#
GROUP BY IR.C#