1. 程式人生 > >武漢光迅科技Java筆試題

武漢光迅科技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#