技術指標

網龍工作要求:

1、負責完成產品服務端框架代碼開發;

2、參與系統安全性、可用性、擴展性、穩定性等方面提出解決方案;

3、對軟件需求進行分析,細化系統相關的接口或協議的定義。

1、本科及以上學歷,計算機相關專業;

2、3年以上開發經驗,有B/S項目的設計、分析、架構經驗者優先;

3、理解OOP、OOA,瞭解SOA架構設計,瞭解設計模式、代碼重構;

4、熟悉分佈式系統架構設計,熟悉java、Linux、前端技能、移動開發,開源項目者優先;

5、有優秀的學習能力,能快速的掌握各種新知識,並能積極的分享知識帶動團隊成長。


張提到的問題:

①OOP的基本概念,例如重寫與重載的區別、什麼是多態。

②Java基礎語言,例如String、StringBuilder、StringBuffer區別,Java的垃圾回收機制。

③Java多線程,例如線程安全的容器有哪些、線程鎖有哪幾個、什麼是線程池、有哪幾種線程池、有哪幾種啓動線程的方法。

④設計模式,例如講解幾種常見的設計模式,並舉例說明。

⑤Java Web基礎知識,例如jsp的9大內置對象、servlet生命週期。

⑥計算機網絡,例如講解一下ISO/OSI 7層模型、講解一下TCP/IP協議、講解一下Http協議。

①數組、鏈表的優缺點

②常用的排序算法有哪些,算法複雜度分別是多少

③講解一個你做過的項目,重點放在技術要點。



作爲一名Android開發者,首先Java基礎是要過得去的。面試中Java基礎的問題大同小異:

面向對象的基本思想與幾個特徵(抽象,繼承,封裝,多態),要求自己能說的出來個所以然。

面向對象的最重要的特徵之一的多態,是最常被問到的。問題大概類似於:用一個最簡單的例子來描述多態。

/**

* Created by siren93 on 15/8/25.

*/publicclassMain{staticabstractclassA{publicabstractvoidfoo();    }staticclassBextendsA{@Overridepublicvoidfoo(){            System.out.println("B.foo");        }    }staticclassCextendsA{@Overridepublicvoidfoo(){            System.out.println("C.foo");        }    }/**    * 注意這裏傳入的參數是A的對象,編譯時期並不能確定調用的具體是哪個方法    * 因爲A類中的foo沒有方法體    *@parama    */publicstaticvoidfun(A a){        a.foo();    }publicstaticvoidmain(String[] args){//這裏使用A類的引用來指向B和C類的對象,如此就可以在參數中傳入A類的子類對象A b =newB();        A c =newC();//運行時期才能確定最終被調用的是B中的還是C中的方法//這樣可以使接口的設計與其具體實現分離,便於大型軟件的維護fun(b);        fun(c);    }}

Java的數據類型。Java的數據類型分爲基本類型與引用類型。基本類型有8種:int, short, long, byte, float, double, boolean,char。這些類型的值所佔存儲空間大小與生存週期可預知,出於速度的原因將其存在內存的棧區域,在棧中的數據可以共享。此外通過類似String s = “abc”;這種方法創建的對象也存在棧中(先創建引用變量s,再在棧中查找”abc”,如果沒有則新建一個放在棧中,再將引用對象指向它)。引用類型必須使用new關鍵字來創建,由於大小不可知,且是運行時動態創建,所以存儲在空間較大但存取相對較慢的堆區域。

Java的Object有哪些方法?(差不多能說出5、6個就能過關,當然要能同時說這些方法的用處與用法。Objective的方法有:clone,hashCode,equals,wait,notify,notifyAll,toString,getClass,finalize)。

wait與sleep的區別:wait來自於Object,而sleep來自Thread;wait讓出系統資源,sleep不讓;wait只能用在同步塊中,sleep用在任意地方。(這裏順帶提一下notify與notifyAll,前者隨機選擇一個等待的對象喚醒,後者喚醒所有等待對象)。

Java線程同步機制(synchronized)用在那些情況下?(某一塊或者某一行語句需要保證同一時刻只能有一個線程運行到該處時)

HashTable與HashMap的差別。這個問題的要點是HashTable是線程安全的,HashMap是非線程安全的,所以,由於不存在同步的問題,HashMap的速度要比HashTable快。

HashMap與HashTable的底層實現是什麼,爲什麼它們能夠做到快速查詢。其實二者的底層實現都是數組,都是經過某些方法,對Key進行運算,得到hash值再通過hash值直接映射到數組的地址上去。所以能夠實現快速存取。當hash值存在衝突時,則使用鏈表來擴充當前hash值在數組中的那個節點。形象一點描述就是一個橫着的數組上面掛着一些豎着的尾巴。

String,StringBuilder,StringBuffer。String是定長的,是不可變對象,每次對String對象進行改變長度的操作實際都是生成了新的對象。對StringBuilder與StringBuffer對象的操作都是針對其自身,在字符串對象會經常改變的情況下使用這兩個比較好。StringBuffer是線程安全的,而StringBuilder是非線程安全的,所以StringBuilder要快一些。

Java的異常。Java的所有異常都繼承於Throwable,分爲Error與Exception。 Error大多與代碼邏輯無關(如虛擬機錯誤,oom等)。Exception分爲Checked Exception與UnChecked Exception,Exception及其子類爲可查異常,又稱非運行時異常,編譯異常,一定程度上是可以預料的,必須使用try catch塊進行處理,否則無法通過編譯(例如I/O操作,SQL,網絡操作等)。RuntimeException及其子類爲不可查異常,是與代碼邏輯有關的(例如空指針,數組越界,類型轉換錯誤等),所以不應該對其try catch。

throw與throws,throw用來在方法中拋出一種異常,throws用在方法的聲明中表示方法可能會拋出異常(不止一種)。

Java的序列化與反序列化。Java中可通過序列化與反序列化方法將對象持久化保存或者進行遠程傳輸。序列化與反序列化實際上是I/O操作。實現Serializable接口需提供一個Id用來標識版本,版本不兼容的對象是無法反序列化的。可覆寫其writeObject和readObject方法來自定義序列化與反序列化。此接口不會調用類的任何構造方法。由同一個ObjectInputStream對象反序列化的是同一個對象。實現Externalizable接口則必須實現其writeExternal與readExternal方法。此接口會調用類的無參構造方法。所以有自定義構造方法的類必須顯示定義其默認構造方法。

JDK特性:JDK1.5,泛型,foreach,自動拆裝箱,枚舉,線程池,靜態導入(可直接使用常量而無需類名);JDK1.6,DeskTop類和SystemTray類,輕量級Http Server API,Common Annotation;JDK1.7,對集合類型的語言支持(List= [‘item”]或者{“item”}),不過這樣定義的集合不可變,自動資源管理,使用try()申請的資源會被自動管理,不必再手動關閉。

//以前寫法privatestaticvoidcustomBufferStreamCopy(File source, File target){    InputStream fis =null;    OutputStream fos =null;try{        fis =newFileInputStream(source);        fos =newFileOutputStream(target);byte[] buf =newbyte[8192];inti;while((i = fis.read(buf)) != -1) {            fos.write(buf,0, i);        }    }catch(IOException e) {        e.printStackTrace();    }finally{        close(fis);        close(fos);    }privatestaticvoidclose(Closeable closable){if(closable !=null) {try{            closable.close();        }catch(IOException e) {            e.printStackTrace();        }    }}//現在寫法privatestaticvoidcustomBufferStreamCopy(File source, File target){try(InputStream fis =newFileInputStream(source);        OutputStream fos =newFileOutputStream(target)) {byte[] buf =newbyte[8192];inti;while((i = fis.read(buf)) != -1) {            fos.write(buf,0, i);        }    }catch(IOException e) {        e.printStackTrace();    }}

此外JDK1.7中,switch中可使用String,用0b開頭可使用二進制數。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章