天天看點

廣聯達軟體研發面試

廣聯達軟體研發面試

1、2分鐘的自我介紹,側重所學的課程和項目中遇到的困難;

2、有沒有學過c/c++,是否了解java的核心;

java 是由 c++發展而來的,保留了 c++的大部分内容,其程式設計方式類似于 c++。但 java 的句法更清晰、規模更小、更易學。

指針

java 沒有指針的概念,進而有效地防止了在 c/c++語言中,容易出現的指針操作失誤(如指針懸空所造成的系統崩潰)。在 c/c++中,指針操作記憶體時,經常會出現錯誤。在java 中沒有指針,更有利于 java 程式的安全。

多重繼承

c++支援多重繼承,它允許多父類派生一個子類。也就是說,一個類允許繼承多個父類。盡管多重繼承功能很強,但使用複雜,而且會引起許多麻煩,編譯程式實作它也很不容易。是以 java 不支援多重繼承,但允許一個類實作多個接口。可見,java 既實作了 c++多重繼承的功能,又避免了 c++的許多缺陷。

資料類型

java 是完全面向對象的語言,所有方法和資料都必須是類的一部分。除了基本資料類型之外,其餘類型的資料都作為對象型資料。例如對象型資料包括字元串和數組。類将資料和方法結合起來,把它們封裝在其中,這樣每個對象都可實作具有自己特點的行為。而 c++将函數和變量定義為全局的,然後再來調用這些函數和變量,進而增加了程式的負擔。此外,java 還取消了 c/c++中的結構和聯合,使編譯程式更簡潔。

自動記憶體管理

java 程式中所有的對象都是用 new 操作符建立在堆棧上的,這個操作符類似于 c++的“new”操作符。java 自動進行無用記憶體回收操作,不需要程式員進行删除。當 java 中一個對象不再被用到時,無須使用記憶體回收器,隻需要給它加上标簽以示删除。無用記憶體的回收器在背景運作,利用空閑時間工作。而 c++中必須由程式釋放記憶體資源,增加了程式設計者的負擔。

操作符重載

java 不支援操作符重載,操作符重載被認為是 c++的突出特征。在 java 中雖然類可以實作這樣的功能,但不支援操作符重載,這樣是為了保持 java 語言盡可能簡單。

預處理功能

c/c++在編譯過程中都有一個預編譯階段,即預處理器。預處理器為開發人員提供了友善,但增加了編譯的複雜性。java 允許預處理,但不支援預處理器功能,因為 java 沒有預處理器,是以為了實作預處理,它提供了引入語句(import),它與 c++預處理器的功能類似。

java不支援預設函數參數,而 c++支援。

在 c 中,代碼組織在函數中,函數可以通路程式的全局變量。c++增加了類,提供了類算法,該算法是與類相連的函數,c++類方法與 java 類方法十分相似。由于 c++仍然支援 c,是以 c++程式中仍然可以使用 c 的函數,結果導緻函數和方法混合使用,使得 c++程式比較混亂。java 沒有函數,作為一個比 c++更純的面向對象的語言。java 強迫開發人員把所有例行程式包括在類中。事實上,用方法實作例行程式可激勵開發人員更好地組織編碼。

字元串

c 和c++不支援字元串變量,在 c 和 c++程式中使用“null”終止符代表字元串的結束,在 java 中字元串是用類對象(string 和 stringbuffer)來實作的,在整個系統中建立字元串和通路字元串元素的方法是一緻的。java 字元串類是作為 java 語言的一部分定義的,而不是作為外加的延伸部分。此外,java 還可以對字元串用“+”進行連接配接操作。

goto語句

“可怕”的 goto 語句是 c 和 c++的“遺物”。它是該語言技術上的合法部分,引用 goto語句造成了程式結構的混亂,不易了解。goto 語句一般用于無條件轉移子程式和多結構分支技術。java 不提供 goto 語句,其雖然指定 goto 作為關鍵字,但不支援它的使用,這使程式更簡潔易讀。

類型轉換

在 c 和 c++中,有時出現資料類型的隐含轉換,這就涉及了自動強制類型轉換問題。例如,在 c++中可将一個浮點值賦予整型變量,并去掉其尾數。java 不支援 c++中的自動強制類型轉換,如果需要,必須由程式顯式進行強制類型轉換。

3、實作一個hashmap,不能調用庫函數,實作add()和find()方法。

1)構造一個類hashentry,有成員變量key,value,next;

2)put(object key, object value):首先處理null;然後根據key值計算數組的index,如果目前位置不為空,更新目前值或插入目前位置的連結清單,如果目前位置為空,直接add到數組的index位置;

3)get():如果查找key值,直接計算hashcode找到數組下組下标,如果查找value,隻能暴力查找。

4)remove():根據k的hashco找到entry鍊,删除;

4、實作一個map,map底層是樹。???????

5、windows檔案系統,删除上層檔案時,如果子檔案被打開不能删除。

暫時隻能想到鎖。

6、父類的構造函數中,能否調用被子類重寫的方法,如果能,調用的是誰的方法。

java程式的加載過程:第一執行類中的靜态代碼,包括靜态成員變量的初始化和靜态語句塊的執行;第二執行類中的非靜态代碼,包括非靜态成員變量的初始化和非靜态語句塊的執行,最後執行構造函數。在繼承的情況下,會首先執行父類的靜态代碼,然後執行子類的靜态代碼;之後執行父類的非靜态代碼和構造函數;最後執行子類的非靜态代碼和構造函數。

如果,子類重寫了父類的方法,子類的方法引用會指向子類的方法,否則子類的方法引用會指向父類的方法引用。

如果子類重載了父類方法,則子類重載方法引用還指向子類方法。

如果子類方法沒有重寫也沒有重載父類方法,則方法引用會指向父類方法。

當子類對象建立時,會先行調用父類的構造方法(構造方法也是方法),虛拟機會在子類方法區尋找該方法并運作。

但是:由于java語言是靜态多分派,動态單分派。其結果是當編譯的時候,父類構造方法調用的方法的參數已經強制轉換為符合父類方法的參數了。

在java中,最好不要在父類的構造函數中調用會被子類重寫的方法,否則運作時會遇到意想不到的錯誤。

7、垃圾回收機制。

1)在java中,當沒有對象引用指向原先配置設定給某個對象的記憶體時,該記憶體便成為垃圾,jvm的一個系統線程會自動釋放該記憶體垃圾。

2)怎樣确定哪些記憶體可以回收:引用計數法和可達分析法(根集)。

3)怎麼回收:mark-sweep(标記-清除)算法、copying(複制)算法、mark-compact(标記-整理)算法、generational collection(分代收集)算法。

8、統計一個文本中單詞的頻率,不用周遊比較,性能優化。

要統計次數必須周遊每一個單詞,不明白面試官意思。

1)建立哈希表,表的大小采用一個大的質數,将每個單詞映射為一個小于大質數的正整數。

2)讀取檔案中的單詞,向hash表中插入單詞,就是hashmap的插入;

3)将hash表中對每個單詞的統計資訊寫入到文本檔案中。