1. 程式人生 > >搜狐Java開發實習生筆試題

搜狐Java開發實習生筆試題

一、選擇題
1、CocurrentHashMap是基於Lock/Unlock思想的執行緒安全的Map實現。
分析:
而不是symchronized、Object.wait、CAS。
其put方法原始碼如下:

 V put(K key, int hash, V value, boolean onlyIfAbsent)
 {
           lock();
            try {
                int c = count;
                if (c++ > threshold) // ensure capacity
                    rehash();
                HashEntry[] tab = table;
                int
index = hash & (tab.length - 1); HashEntry first = (HashEntry) tab[index]; HashEntry e = first; while (e != null && (e.hash != hash || !key.equals(e.key))) e = e.next; V oldValue; if (e != null
) { oldValue = e.value; if (!onlyIfAbsent) e.value = value; } else { oldValue = null; ++modCount; tab[index] = new HashEntry(key, hash, first, value
); count = c; // write-volatile } return oldValue; } finally { unlock(); } }

2、下面程式執行結果

public class Test
{
    static int value = 0;
    static int inc(){return value++;}
    static int dec(){return value--;}
    static int getResult()
    {
        try 
        {
            return inc();
        }
        finally 
        {
            return dec();
        }
    }
    public static void main(String[] args) 
    {
        System.out.println(getResult());
        System.out.println(value);
    }
}

1
0

分析:
finally裡的語句一定會被執行,於是當try裡的return與finally裡的return相沖突時,應當從finally中返回。所以程式執行順序應該是inc()->dec()->finally中的return,相當於try中的語句變為inc()。

public class Test
{
    static int value = 0;
    static int inc(){return value++;}
    static int dec(){return value--;}
    static int getResult()
    {
        try 
        {
            inc();//相當於return被去掉
        }
        finally 
        {
            return dec();
        }
    }
    public static void main(String[] args) 
    {
        System.out.println(getResult());
        System.out.println(value);
    }
}

於是呼叫inc()後value為1,呼叫dec()後先返回value的值1,再將value的值減1,於是value為0。所以輸出為1,0。

3、以下說法正確的是:AEF
A、靜態內部類的非靜態成員可以訪問外部類的靜態變數,而不可以訪問外部類的非靜態變數
B、非靜態內部類的非靜態成員不可以訪問外部類的非靜態變數
C、子類可以覆蓋父類的靜態方法
D、子類可以覆蓋父類的final欄位
E、列舉類可以實現多個介面
F、HashMap和Hashtable實現相同的介面,繼承相同的父類
分析:
A、外部類的非靜態變數可能還沒有被初始化
B、可以
C、靜態方法在類載入的時候就已經確定其所屬的類
D、final變數不能被覆蓋
E、F、正確

4、System.out.println(“ja” + “va” == “java”);輸出
true
分析:
java會將”ja”“va”優化為”java”,於是==左右兩邊的”java”指的是常量池中的同一個物件。

5、對於以下程式碼說法正確的是

public class Test
{
    public static void greet()
    {
        System.out.println("Hello World!");
    }
    public static void main(String[] args) 
    {
        Test t = null;
        t.greet();//(1)
        ((Test)t).greet();//(2)
        ((Test)null).greet();//(3)
    }
}

(1)(2)(3)都能正常執行
分析:
greet( )是類函式,可以使用類來呼叫。

6、下面程式碼執行結果

import java.util.HashSet;
import java.util.Set;

public class Test
{
    private String first, last;
    Test(String first, String last)
    {
        this.first = first;
        this.last = last;
    }
    public boolean equals(Object o)
    {
        Test t = (Test)o;
        return t.first.equals(first)&&t.last.equals(last);
    }
    public static void main(String[] args) 
    {
        Set<Test> s = new HashSet<Test>();
        s.add(new Test("m", "n"));
        System.out.println(s.contains(new Test("m", "n")));
    }
}

false
分析:
Set和Map中呼叫contains方法判定物件是否已經存在時,不僅要重寫equals方法還要重寫hashcode方法,且先呼叫hashcode方法判斷兩個物件的HashCode是否相等,再呼叫equals方法判斷兩個物件是否相等,只有兩個都相等時才能判定相等。

7、Struct2的Action分發機制採用的是Command模式
分析:
這裡寫圖片描述
Struts中,在模型層都要繼承一個Action介面,並實現execute方法,其實這個Action就是命令類。Struts會應用命令模式,是因為Struts的核心控制器ActionServlet只有一個,相當於Invoker,而模型層的類會隨著不同的應用有不同的模型類,相當於具體的Command。這樣,就需要在ActionServlet和模型層之間解耦,而命令模式正好解決這個問題。

8、索引欄位不唯一應當選擇普通索引
分析:
主索引:可確保欄位中輸入值的唯一性並決定了處理記錄的順序。可以為資料庫中的每一個表建立一個主索引。如果某個表已經有了一個主索引,可以繼續新增候選索引。關鍵字為PRIMAY。
候選索引:像主索引一樣要求欄位值的唯一性並決定了處理記錄的順序。在資料庫表和自由表中均可為每個表建立多個候選索引。
普通索引:可以決定記錄的處理順序,但是允許欄位中出現重複值。在一個表中可以加入多個普通索引。
唯一索引:在某個資料列只包含彼此不同的值,在為這個資料列建立索引時就應該用關鍵字UNIOUE把它定義為一個唯一的索引。

二、名詞解釋
Nginx:
是一款輕量級的Web 伺服器/反向代理伺服器及電子郵件(IMAP/POP3)代理伺服器,並在一個BSD-like 協議下發行。由俄羅斯的程式設計師Igor Sysoev所開發,供俄國大型的入口網站及搜尋引擎Rambler(俄文:Рамблер)使用。其特點是佔有記憶體少,併發能力強,事實上nginx的併發能力確實在同類型的網頁伺服器中表現較好,中國大陸使用nginx網站使用者有:百度、新浪、網易、騰訊等。

MongoDB:
是一個基於分散式檔案儲存的資料庫。由 C++ 語言編寫。旨在為 WEB 應用提供可擴充套件的高效能資料儲存解決方案。是一個介於關係資料庫和非關係資料庫之間的產品,是非關係資料庫當中功能最豐富,最像關係資料庫的。

O-R Mapping:
物件關係對映(Object Relational Mapping,簡稱ORM)是一種為了解決面向物件與關係資料庫存在的互不匹配的現象的技術。

Redis:
是一個開源的使用ANSI C語言編寫、支援網路、可基於記憶體亦可持久化的日誌型、Key-Value資料庫,並提供多種語言的API。

Hadoop:
是一個由Apache基金會所開發的分散式系統基礎架構。
使用者可以在不瞭解分散式底層細節的情況下,開發分散式程式。充分利用叢集的威力進行高速運算和儲存。

DDos:
分散式拒絕服務(DDoS:Distributed Denial of Service)攻擊指藉助於客戶/伺服器技術,將多個計算機聯合起來作為攻擊平臺,對一個或多個目標發動DDoS攻擊,從而成倍地提高拒絕服務攻擊的威力。

XSS:
跨站指令碼攻擊(Cross Site Scripting),為不和層疊樣式表(Cascading Style Sheets, CSS)的縮寫混淆,故將跨站指令碼攻擊縮寫為XSS。惡意攻擊者往Web頁面裡插入惡意Script程式碼,當用戶瀏覽該頁之時,嵌入其中Web裡面的Script程式碼會被執行,從而達到惡意攻擊使用者的特殊目的。

SEO:
SEO是由英文Search Engine Optimization縮寫而來, 中文意譯為“搜尋引擎優化”。SEO是指通過對網站內部調整優化及站外優化,使網站滿足搜尋引擎收錄排名需求,在搜尋引擎中提高關鍵詞排名,從而把精準使用者帶到網站,獲得免費流量,產生直接銷售或品牌推廣。

CNAME:
指別名記錄也被稱為規範名字。這種記錄允許您將多個名字對映到同一臺計算機。 通常用於同時提供WWW和MAIL服務的計算機。