面試實題:No.8

1、X=X+1,X+=1以及X++的效率哪個最高?爲什麼?
三條語句的效率是x = x + 1 < x += 1 < x++
x=x+1 最低,因爲它的執行過程如下:
1. 讀取右邊變量 x 的內存地址;
2. 執行 x+1;
3. 讀取左邊變量 x 的內存地址;
4. 將右邊的值傳給左邊的變量 x(編譯器並不認爲左右兩邊的變量 x 的內存地址相同)。
 
首先尋找右面x的地址,然後讀取地址中x的值,再在寄存器中將x的值加1,接着尋找左面x的地址(計算機是不知道左面的x就是右面的x的),再講剛計算的結果存到左面的x的地址中。
x=+1 其次,它的執行過程如下:
1. 讀取右邊變量 x 的內存地址;
2. 執行 x=1;
3. 將得到的值傳給變量 x (因爲變量 x 的內存地址已經讀出)。
 
尋找x的地址,然後讀取地址中x的值,再在寄存器中將x的值加1,接着將計算結果存到x的地址中(這裏計算機知道讀與寫兩個操作的地址是相同的)。
x++ 最高,它的執行如下:
1. 讀取右邊變量 x 的內存地址;
2. 變量 x 自增1。
 
尋找x的地址,然後讀取地址中x的值,然後直接將地址中的值加1。
從上面的過程可以看出,x++比x+=1少了一個寫的過程,而x+=1比x=x+1少了一個尋址的過程(查找左面x的地址)。
2、有表table(id,class,score),用最高效的,最簡單的SQL語句列出各班的成績(score)最高的列表,顯示班級(class)和成績(score)2個字段。
select class,max(score) from table group by class,id.
3、在執行數據庫查詢時,如果要查詢的數據很多,假設有1000萬條,用什麼辦法提高查詢速度?在數據庫方面或者Java代碼方面有什麼優化的辦法?
fsalary>9999 and fage > 35
fsalary>9999 and fage < 35
fsalary <9999 and fage > 35
fsalary <9999 and fage < 35
1、在數據庫設計方面:
  (1)建立索引;  
  (2)分區(MySQL,比如按時間分區);
  (3)儘量使用固定長度的字段;
  (4)限制字段長度;
2、在數據庫I/O方面:
   (1)增加緩衝區;
   (2)如果涉及表的級聯,不同的表存儲在不同的磁盤上,以增加I/O速度;
3、在SQL語句方面:
   (1)優化SQL語句,減少比較次數;
   (2)限制返回的條目數(MySQL中用limit);
4、在Java方面:
   如果是反覆使用的查詢,使用PrepaerdStatement減少查詢次數。
4、請簡述FreeMark技術。
優點:
1、不能編寫java代碼,可以實現嚴格的mvc分離
2、性能非常不錯
3、對jsp標籤支持良好
4、內置大量常用功能,使用非常方便
5、宏定義(類似jsp標籤)非常方便
6、使用表達式語言
缺點:
1、不是官方標準
2、用戶羣體和第三方標籤庫沒有jsp多
 
 
選擇freemarker的原因:
1、性能。velocity應該是最好的,其次是jsp,普通的頁面freemarker性能最差(雖然只是幾毫秒到十幾毫秒的差距)。但是在複雜頁面上(包含大量判斷、日期金額格式化)的頁面上,freemarker的性能比使用tag和el的jsp好。
2、宏定義比jsp tag方便
3、內置大量常用功能。比如html過濾,日期金額格式化等等,使用非常方便
4、支持jsp標籤
5、可以實現嚴格的mvc分離
 
禮包:
最近了解到大家在面試過程中被問到,那塊做的比較熟,那些技術在項目中有具體的一個應用之類的問題,今天我也舉個例子,方便大家進行參考。
Redis基本在很多項目中都有了應用,在我目前的項目中應用的也不少。首先在使用前會將RDB和AOF都進行開啓,防止數據的丟失。然後在進行商品信息同步、同步索引庫等位置因爲採用的是延時隊列所以這塊我們使用的是 redis的 sorted set 數據結構,使用時間戳作爲 score ,消息內容作爲 member,使用 zadd 命令來生產消息,消費者使用 zrangebyscore 命令獲取指定時間之前的消息數據輪詢進行處理。
以下是代碼情況:
$queueKey = "queue";
// 生產消息
// 消費時間, 這裏設置爲1小時候
$consumeTimestamp = time() + 3600;
// $data需要添加隨機串前綴(or後綴),防止出現重複member被丟棄
$data = $data . md5(uniqid(rand(), true));
$redis->zadd($queueKey, $consumeTimestamp, $data);
// 消費消息
while (tue) {
    $arrData = $redis->zrangebyscore($queueKey, 0, time());
    if (!$arrData) {
        usleep(100000);
        continue;
    }
    // 業務邏輯
    foreach ($arrData as $data) {
        $data = substr($data, 0, strlen($data) - 32);
        
        // 消費$data
    }
}
在講解過程中最好能結合代碼進行溝通,這樣更直接。且這些技術在項目中的應用不僅僅只體現在這一個方面。諸如Redis的RDB、AOF持久化在消息丟失時的處理情況、分佈式鎖等都是比較經典的、實際的例子。
當然還有MQ、nginx、線程等也都可以是項目中的具體應用和問題處理,所以大家在工作之餘也要多思考和積累呀!
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章