6.2 筆試真題 & 詳解
第一部分 7道填空題:
1、IM的全稱( ),最大的三個(gè)IM( )
2、請(qǐng)寫出三個(gè)互聯(lián)網(wǎng)的網(wǎng)址
3、今年上市的5家互聯(lián)網(wǎng)企業(yè)( )
4、5、6、7全是行測(cè)題,邏輯推理型,不難。
第二部分 產(chǎn)品設(shè)計(jì)題
1、人人網(wǎng)想推出一個(gè)校園招聘系統(tǒng),請(qǐng)?jiān)O(shè)計(jì)一個(gè)企業(yè)用戶的注冊(cè)表單界面,并寫出設(shè)計(jì)思路及理由。
2、畫了一個(gè)人人網(wǎng)登陸的界面圖,要找問題,并給出修正圖。
第三部分 問答題
1、請(qǐng)比較撥號(hào)式電話與按鍵式電話的差異,請(qǐng)從多角度詳細(xì)闡述。
2、假如你是人人音樂的產(chǎn)品經(jīng)理,請(qǐng)給出3個(gè)你認(rèn)為最重要的數(shù)據(jù),并說明理由。
3、博客和微博有哪些不同點(diǎn),請(qǐng)從多角度詳細(xì)闡述。
4、假如有一個(gè)項(xiàng)目預(yù)定要在1個(gè)月內(nèi)完成,結(jié)果一周之后,有一個(gè)技術(shù)人員病了,要住院3周,這時(shí)作為項(xiàng)目負(fù)責(zé)人的你會(huì)怎么辦?
附加題
人人網(wǎng)要做一個(gè)在線電影購票系統(tǒng),請(qǐng)盡你所能詳細(xì)描述你的設(shè)計(jì)思路。
最后交卷的時(shí)候才知道要帶簡(jiǎn)歷過去,還好好心的監(jiān)考人員說等我10分鐘,讓我去打印了一份。
真題2:一、 Java筆試題•單項(xiàng)選擇題
1. Java是從(C)語言改進(jìn)重新設(shè)計(jì)
A.Ada B.C++ C. Pascal D. BASIC
2. 下列語句哪一個(gè)正確(B)
A. Java程序經(jīng)編譯后會(huì)產(chǎn)生machinecode
B. Java程序經(jīng)編譯后會(huì)產(chǎn)生bytecode
C. Java程序經(jīng)編譯后會(huì)產(chǎn)生DLL
D.以上都不正確
3. 下列說法正確的有(C)
A. class中的constructor不可省略
B. constructor必須與class同名,但方法不能與class同名
C. constructor在一個(gè)對(duì)象被new時(shí)執(zhí)行
D. 一個(gè)class只能定義一個(gè)constructor
4. 提取Java存取數(shù)據(jù)庫能力的包是(A)
A.java.sqlB. java.awt C. java.lang D. java.swing
5. 下列運(yùn)算符合法的是(A)
A. && B.<> C. if D. :=
6. 執(zhí)行如下程序代碼
a=0;c=0;
do{
--c;
a=a-1;
}while(a>0);
后,C的值是(C)
A. 0 B. 1C.-1 D. 死循環(huán)
7. 下列哪一種敘述是正確的(D)
A. abstract修飾符可修飾字段、方法和類
B. 抽象方法的body部分必須用一對(duì)大括號(hào){}包住
C. 聲明抽象方法,大括號(hào)可有可無
D. 聲明抽象方法不可寫出大括號(hào)
8. 下列語句正確的是(A)
A. 形式參數(shù)可被視為local variable
B. 形式參數(shù)可被字段修飾符修飾
C. 形式參數(shù)為方法被調(diào)用時(shí),真正被傳遞的參數(shù)
D. 形式參數(shù)不可以是對(duì)象
9. 下列哪種說法是正確的(D)
A. 實(shí)例方法可直接調(diào)用超類的實(shí)例方法
B. 實(shí)例方法可直接調(diào)用超類的類方法
C. 實(shí)例方法可直接調(diào)用其他類的實(shí)例方法
D. 實(shí)例方法可直接調(diào)用本類的類方法
二、 Java筆試題•多項(xiàng)選擇題
1. Java程序的種類有(BCD)
A.類(Class) B.Applet C. Application D. Servlet
2. 下列說法正確的有(BCD)
A. 環(huán)境變量可在編譯source code時(shí)指定
B. 在編譯程序時(shí),所能指定的環(huán)境變量不包括class path
C. javac一次可同時(shí)編譯數(shù)個(gè)java源文件
D. javac.exe能指定編譯結(jié)果要置于哪個(gè)目錄(directory)
3. 下列標(biāo)識(shí)符不合法的有(ACD)
A.new B.$Usdollars C.1234 D. car.taxi
4. 下列說法錯(cuò)誤的有(BCD)
A. 數(shù)組是一種對(duì)象
B. 數(shù)組屬于一種原生類
C. int number=[]={31,23,33,43,35,63}
D. 數(shù)組的大小可以任意改變
5. 不能用來修飾interface的有(ACD)
A.privateB. public C. protected D. static
6. 下列正確的有(ACD)
A. call by value不會(huì)改變實(shí)際參數(shù)的數(shù)值
B. call by reference能改變實(shí)際參數(shù)的參考地址
C. call by reference不能改變實(shí)際參數(shù)的參考地址
D. call byreference能改變實(shí)際參數(shù)的內(nèi)容
7. 下列說法錯(cuò)誤的有(ACD)
A. 在類方法中可用this來調(diào)用本類的類方法
B. 在類方法中調(diào)用本類的類方法時(shí)可直接調(diào)用
C. 在類方法中只能調(diào)用本類中的類方法
D. 在類方法中絕對(duì)不能調(diào)用實(shí)例方法
8. 下列說法錯(cuò)誤的有(ABC)
A. Java面向?qū)ο笳Z言容許單獨(dú)的過程和函數(shù)存在
B. Java面向?qū)ο笳Z言容許單獨(dú)的方法存在
C. Java語言中的方法屬于類的成員(member)
D. Java語言中的方法必定隸屬于某一類(對(duì)象),調(diào)用方法與過程或函數(shù)相同
9. 下列說法錯(cuò)誤的有(BCD)
A. 能被java.exe成功運(yùn)行的java.class文件必須有main()方法
B. J2SDK就是Java API
C. Appletviewer.exe可利用jar選項(xiàng)運(yùn)行.jar文件
D. 能被Appletviewer成功運(yùn)行的java.class文件必須有main()方法
三、 JAVA相關(guān)基礎(chǔ)知識(shí)
1. 面向?qū)ο蟮奶卣饔心男┓矫?
封裝,抽象, 繼承,多態(tài)
2. String是最基本的數(shù)據(jù)類型嗎?
基本數(shù)據(jù)類型包括byte、int、char、long、float、double、boolean和short。 java.lang.String類是final類型的,因此不可以繼承這個(gè)類、不能修改這個(gè)類。為了提高效率節(jié)省空間,我們應(yīng)該用 StringBuffer類. String 和StringBuffer的區(qū)別: JAVA平臺(tái)提供了兩個(gè)類:String和StringBuffer,它們可以儲(chǔ)存和操作字符串,即包含多個(gè)字符的字符數(shù)據(jù)。這個(gè)String類 提供了數(shù)值不可改變的字符串。而這個(gè)StringBuffer類提供的字符串進(jìn)行修改。當(dāng)你知道字符數(shù)據(jù)要改變的時(shí)候你就可以使用 StringBuffer。典型地,你可以使用StringBuffers來動(dòng)態(tài)構(gòu)造字符數(shù)據(jù)。
3. int和Integer有什么區(qū)別
Integer是int的封裝類,里面有很多進(jìn)行處理的靜態(tài)方法, Integer是對(duì)象而int不是,內(nèi)存的分配位置也不一樣
4. String和StringBuffer的區(qū)別
在java中有3個(gè)類來負(fù)責(zé)字符的操作。
1.Character 是進(jìn)行單個(gè)字符操作的,
2.String 對(duì)一串字符進(jìn)行操作。不可變類。
3.StringBuffer 也是對(duì)一串字符進(jìn)行操作,但是可變類。
String:
是對(duì)象不是原始類型.
為不可變對(duì)象,一旦被創(chuàng)建,就不能修改它的值.
對(duì)于已經(jīng)存在的String對(duì)象的修改都是重新創(chuàng)建一個(gè)新的對(duì)象,然后把新的值保存進(jìn)去.
String 是final類,即不能被繼承.
StringBuffer:
是一個(gè)可變對(duì)象,當(dāng)對(duì)他進(jìn)行修改的時(shí)候不會(huì)像String那樣重新建立對(duì)象
它只能通過構(gòu)造函數(shù)來建立,
StringBuffer sb = new StringBuffer();
note:不能通過付值符號(hào)對(duì)他進(jìn)行付值.
sb = "welcome to here!";//error
對(duì)象被建立以后,在內(nèi)存中就會(huì)分配內(nèi)存空間,并初始保存一個(gè)null.向StringBuffer中付值的時(shí)候可以通過它的append方法.
sb.append("hello");
字符串連接操作中StringBuffer的效率要比String高:
總結(jié): 如果在程序中需要對(duì)字符串進(jìn)行頻繁的修改連接操作的話.使用StringBuffer性能會(huì)更高
5. 運(yùn)行時(shí)異常與一般異常有何異同
Java提供了兩類主要的異常:runtime exception和checked exception。checked 異常也就是我們經(jīng)常遇到的IO異常,以及SQL異常都是這種異常。對(duì)于這種異常,JAVA編譯器強(qiáng)制要求我們必需對(duì)出現(xiàn)的這些異常進(jìn)行catch。所以,面對(duì)這種異常不管我們是否愿意,只能自己去寫一大堆catch塊去處理可能的異常。
但是另外一種異常:runtime exception,也稱運(yùn)行時(shí)異常,我們可以不處理。當(dāng)出現(xiàn)這樣的異常時(shí),總是由虛擬機(jī)接管。比如:我們從來沒有人去處理過NullPointerException異常,它就是運(yùn)行時(shí)異常,并且這種異常還是最常見的異常之一。
出現(xiàn)運(yùn)行時(shí)異常后,系統(tǒng)會(huì)把異常一直往上層拋,一直遇到處理代碼。如果沒有處理塊,到最上層,如果是多線程就由Thread.run()拋出,如果是單線程就被main()拋出。拋出之后,如果是線程,這個(gè)線程也就退出了。如果是主程序拋出的異常,那么這整個(gè)程序也就退出了。運(yùn)行時(shí)異常是Exception的子類,也有一般異常的特點(diǎn),是可以被Catch塊處理的。只不過往往我們不對(duì)他處理罷了。也就是說,你如果不對(duì)運(yùn)行時(shí)異常進(jìn)行處理,那么出現(xiàn)運(yùn)行時(shí)異常之后,要么是線程中止,要么是主程序終止。
如果不想終止,則必須撲捉所有的運(yùn)行時(shí)異常,決不讓這個(gè)處理線程退出。隊(duì)列里面出現(xiàn)異常數(shù)據(jù)了,正常的處理應(yīng)該是把異常數(shù)據(jù)舍棄,然后記錄日志。不應(yīng)該由于異常數(shù)據(jù)而影響下面對(duì)正常數(shù)據(jù)的處理。在這個(gè)場(chǎng)景這樣處理可能是一個(gè)比較好的應(yīng)用,但并不代表在所有的場(chǎng)景你都應(yīng)該如此。如果在其它場(chǎng)景,遇到了一些錯(cuò)誤,如果退出程序比較好,這時(shí)你就可以不太理會(huì)運(yùn)行時(shí)異常,或者是通過對(duì)異常的處理顯式的控制程序退出。
異常表示程序運(yùn)行過程中可能出現(xiàn)的非正常狀態(tài),運(yùn)行時(shí)異常表示虛擬機(jī)的通常操作中可能遇到的異常,是一種常見運(yùn)行錯(cuò)誤。java編譯器要求方法必須聲明拋出可能發(fā)生的非運(yùn)行時(shí)異常,但是并不要求必須聲明拋出未被捕獲的運(yùn)行時(shí)異常。
6. 說出ArrayList, Vector, LinkedList的存儲(chǔ)性能和特性
ArrayList和Vector都是使用數(shù)組方式存儲(chǔ)數(shù)據(jù),此數(shù)組元素?cái)?shù)大于實(shí)際存儲(chǔ)的數(shù)據(jù)以便增加和插入元素,它們都允許直接按序號(hào)索引元素,但是插入元素要涉及數(shù)組元素移動(dòng)等內(nèi)存操作,所以索引數(shù)據(jù)快而插入數(shù)據(jù)慢,Vector由于使用了synchronized方法(線程安全),通常性能上較ArrayList差,而LinkedList使用雙向鏈表實(shí)現(xiàn)存儲(chǔ),按序號(hào)索引數(shù)據(jù)需要進(jìn)行前向或后向遍歷,但是插入數(shù)據(jù)時(shí)只需要記錄本項(xiàng)的前后項(xiàng)即可,所以插入速度較快。
7. &和&&的區(qū)別
&和&&都可以用作邏輯與的運(yùn)算符,表示邏輯與(and),當(dāng)運(yùn)算符兩邊的表達(dá)式的結(jié)果都為true時(shí),整個(gè)運(yùn)算結(jié)果才為true,否則,只要有一方為false,則結(jié)果為false。
&&還具有短路的功能,即如果第一個(gè)表達(dá)式為false,則不再計(jì)算第二個(gè)表達(dá)式
&還可以用作位運(yùn)算符,當(dāng)&操作符兩邊的表達(dá)式不是boolean類型時(shí),&表示按位與操作,我們通常使用0x0f來與一個(gè)整數(shù)進(jìn)行&運(yùn)算,來獲取該整數(shù)的最低4個(gè)bit位,
8. HashMap和Hashtable的區(qū)別
Hashtable和HashMap類有三個(gè)重要的不同之處。第一個(gè)不同主要是歷史原因。Hashtable是基于陳舊的Dictionary類的,HashMap是Java 1.2引進(jìn)的Map接口的一個(gè)實(shí)現(xiàn)。
也許最重要的不同是Hashtable的方法是同步的,而HashMap的方法不是。這就意味著,雖然你可以不用采取任何特殊的行為就可以在一個(gè)多線程的應(yīng)用程序中用一個(gè)Hashtable,但你必須同樣地為一個(gè)HashMap提供外同步。一個(gè)方便的方法就是利用Collections類的靜態(tài)的synchronizedMap()方法,它創(chuàng)建一個(gè)線程安全的Map對(duì)象,并把它作為一個(gè)封裝的對(duì)象來返回。這個(gè)對(duì)象的方法可以讓你同步訪問潛在的HashMap。這么做的結(jié)果就是當(dāng)你不需要同步時(shí),你不能切斷Hashtable中的同步(比如在一個(gè)單線程的應(yīng)用程序中),而且同步增加了很多處理費(fèi)用。
第三點(diǎn)不同是,只有HashMap可以讓你將空值作為一個(gè)表的條目的key或value。HashMap中只有一條記錄可以是一個(gè)空的key,但任意數(shù)量的條目可以是空的value。這就是說,如果在表中沒有發(fā)現(xiàn)搜索鍵,或者如果發(fā)現(xiàn)了搜索鍵,但它是一個(gè)空的值,那么get()將返回null。如果有必要,用containKey()方法來區(qū)別這兩種情況。
9. final, finally, finalize的區(qū)別
final—修飾符(關(guān)鍵字)如果一個(gè)類被聲明為final,意味著它不能再派生出新的子類,不能作為父類被繼承。因此一個(gè)類不能既被聲明為 abstract的,又被聲明為final的。將變量或方法聲明為final,可以保證它們?cè)谑褂弥胁槐桓淖。被聲明為final的變量必須在聲明時(shí)給定初值,而在以后的引用中只能讀取,不可修改。被聲明為final的方法也同樣只能使用,不能重載。
finally—再異常處理時(shí)提供 finally 塊來執(zhí)行任何清除操作。如果拋出一個(gè)異常,那么相匹配的 catch 子句就會(huì)執(zhí)行,然后控制就會(huì)進(jìn)入 finally 塊(如果有的話)。
finalize—方法名。Java 技術(shù)允許使用 finalize() 方法在垃圾收集器將對(duì)象從內(nèi)存中清除出去之前做必要的清理工作。這個(gè)方法是由垃圾收集器在確定這個(gè)對(duì)象沒有被引用時(shí)對(duì)這個(gè)對(duì)象調(diào)用的。它是在 Object 類中定義的,因此所有的類都繼承了它。子類覆蓋 finalize() 方法以整理系統(tǒng)資源或者執(zhí)行其他清理工作。finalize() 方法是在垃圾收集器刪除對(duì)象之前對(duì)這個(gè)對(duì)象調(diào)用的。
10. sleep()和wait()的區(qū)別
其實(shí)兩者都可以讓線程暫停一段時(shí)間,但是本質(zhì)的區(qū)別是一個(gè)線程的運(yùn)行狀態(tài)控制,一個(gè)是線程之間的通訊的問題
在java.lang.Thread類中,提供了sleep(),
而java.lang.Object類中提供了wait(), notify()和notifyAll()方法來操作線程
sleep()可以將一個(gè)線程睡眠,參數(shù)可以指定一個(gè)時(shí)間。
而wait()可以將一個(gè)線程掛起,直到超時(shí)或者該線程被喚醒。
wait有兩種形式wait()和wait(milliseconds).
sleep和wait的區(qū)別有:
1,這兩個(gè)方法來自不同的類分別是Thread和Object
2,最主要是sleep方法沒有釋放鎖,而wait方法釋放了鎖,使得其他線程可以使用同步控制塊或者方法。
3,wait,notify和notifyAll只能在同步控制方法或者同步控制塊里面使用,而sleep可以在
任何地方使用
synchronized(x){
x.notify()
//或者wait()
}
4,sleep必須捕獲異常,而wait,notify和notifyAll不需要捕獲異常
11. overload和override的區(qū)別,overloaded的方法是否可以改變返回值的類型
方法的重寫Overriding和重載Overloading是Java多態(tài)性的不同表現(xiàn)。重寫Overriding是父類與子類之間多態(tài)性的一種表現(xiàn),重載Overloading是一個(gè)類中多態(tài)性的一種表現(xiàn)。如果在子類中定義某方法與其父類有相同的名稱和參數(shù),我們說該方法被重寫 (Overriding)。子類的對(duì)象使用這個(gè)方法時(shí),將調(diào)用子類中的定義,對(duì)它而言,父類中的定義如同被“屏蔽”了。如果在一個(gè)類中定義了多個(gè)同名的方法,它們或有不同的參數(shù)個(gè)數(shù)或有不同的參數(shù)類型,則稱為方法的重載(Overloading)。Overloaded的方法是可以改變返回值的類型。
12. 排序都有哪幾種方法?請(qǐng)列舉,用java實(shí)現(xiàn)一個(gè)快速排序
排序的方法有:插入排序(直接插入排序、希爾排序),交換排序(冒泡排序、快速排序),選擇排序(直接選擇排序、堆排序),歸并排序,分配排序(箱排序、基數(shù)排序)
用Java語言實(shí)現(xiàn)的各種排序,包括插入排序、冒泡排序、選擇排序、Shell排序、快速排序、歸并排序、堆排序、SortUtil等。
插入排序:包括直接插入排序,二分插入排序(又稱折半插入排序),鏈表插入排序,希爾排序(又稱縮小增量排序)。將n個(gè)元素的數(shù)列分為已有序和無序兩個(gè)部分,每次處理就是將無序數(shù)列的第一個(gè)元素與有序數(shù)列的元素從后往前逐個(gè)進(jìn)行比較,找出插入位置,將該元素插入到有序數(shù)列的合適位置中。
冒泡排序 (BubbleSort)的基本概念是:依次比較相鄰的兩個(gè)數(shù),將小數(shù)放在前面,大數(shù)放在后面。即在第一趟:首先比較第1個(gè)和第2個(gè)數(shù),將小數(shù)放前,大數(shù) 放后。然后比較第2個(gè)數(shù)和第3個(gè)數(shù),將小數(shù)放前,大數(shù)放后,如此繼續(xù),直至比較最后兩個(gè)數(shù),將小數(shù)放前,大數(shù)放后。至此第一趟結(jié)束,將最大的數(shù)放到了最 后。在第二趟:仍從第一對(duì)數(shù)開始比較(因?yàn)榭赡苡捎诘?個(gè)數(shù)和第3個(gè)數(shù)的交換,使得第1個(gè)數(shù)不再小于第2個(gè)數(shù)),將小數(shù)放前,大數(shù)放后,一直比較到倒數(shù)第 二個(gè)數(shù)(倒數(shù)第一的位置上已經(jīng)是最大的),第二趟結(jié)束,在倒數(shù)第二的位置上得到一個(gè)新的最大數(shù)(其實(shí)在整個(gè)數(shù)列中是第二大的數(shù))。如此下去,重復(fù)以上過程,直至最終完成排序。
由于在排序過程中總是小數(shù)往前放,大數(shù)往后放,相當(dāng)于氣泡往上升,所以稱作冒泡排序。
選擇排序:每一趟從待排序的數(shù)據(jù)元素中選出最小(或最大)的一個(gè)元素,順序放在已排好序的數(shù)列的最后,直到全部待排序的數(shù)據(jù)元素排完。 選擇排序是不穩(wěn)定的排序方法。
快速排序(Quicksort)是對(duì)冒泡排序的一種改進(jìn)。由C. A. R. Hoare在1962年提出。它的基本思想是:通過一趟排序?qū)⒁判虻臄?shù)據(jù)分割成獨(dú)立的兩部分,其中一部分的所有數(shù)據(jù)都比另外一部分的所有數(shù)據(jù)都要小,然后再按此方法對(duì)這兩部分?jǐn)?shù)據(jù)分別進(jìn)行快速排序,整個(gè)排序過程可以遞歸進(jìn)行,以此達(dá)到整個(gè)數(shù)據(jù)變成有序序列。
13. 垃圾回收器的基本原理是什么?垃圾回收器可以馬上回收內(nèi)存嗎?有什么辦法主動(dòng)通知虛擬機(jī)進(jìn)行垃圾回收?
對(duì)于GC來說,當(dāng)程序員創(chuàng)建對(duì)象時(shí),GC就開始監(jiān)控這個(gè)對(duì)象的地址、大小以及使用情況。通 常,GC采用有向圖的方式記錄和管理堆(heap)中的所有對(duì)象。通過這種方式確定哪些對(duì)象是"可達(dá)的",哪些對(duì)象是"不可達(dá)的"。當(dāng)GC確定一些對(duì)象 為"不可達(dá)"時(shí),GC就有責(zé)任回收這些內(nèi)存空間。
可以。
程序員可以手動(dòng)執(zhí)行System.gc(),通知GC運(yùn)行,但是Java語言規(guī)范并不保證GC一定會(huì)執(zhí)行。
14. 是否可以從一個(gè)static方法內(nèi)部發(fā)出對(duì)非static方法的調(diào)用?
不行,
可以這樣理解
static修飾的方法可以直接用類名調(diào)用
非static修飾的方法必須用類new出對(duì)象才能調(diào)用
當(dāng)我們用類名直接調(diào)用時(shí),可能這個(gè)類的對(duì)象并沒有new。
如果這時(shí)候static方法里調(diào)用非static的方法就會(huì)出現(xiàn)空指針異常,
當(dāng)然這種錯(cuò)誤編譯時(shí)就不會(huì)通過
15. 同步和異步有何異同,在什么情況下分別使用它們?舉例說明。
如果數(shù)據(jù)將在線程間共享。例如正在寫的數(shù)據(jù)以后可能被另一個(gè)線程讀到,或者正在讀的數(shù)據(jù)可能已經(jīng)被另一個(gè)線程寫過了,那么這些數(shù)據(jù)就是共享數(shù)據(jù),必須進(jìn)行同步存取。
當(dāng)應(yīng)用程序在對(duì)象上調(diào)用了一個(gè)需要花費(fèi)很長(zhǎng)時(shí)間來執(zhí)行的方法,并且不希望讓程序等待方法的返回時(shí),就應(yīng)該使用異步編程,在很多情況下采用異步途徑往往更有效率。
16. String str = new String(“abc”)在內(nèi)存中是怎么分配的?
Java把內(nèi)存劃分成兩種:一種是棧內(nèi)存,一種是堆內(nèi)存。
在函數(shù)中定義的一些基本類型的變量和對(duì)象的引用變量都在函數(shù)的棧內(nèi)存中分配。
當(dāng)在一段代碼塊定義一個(gè)變量時(shí),Java就在棧中為這個(gè)變量分配內(nèi)存空間,當(dāng)超過變量的作用域后,Java會(huì)自動(dòng)釋放掉為該變量所分配的內(nèi)存空間,該內(nèi)存空間可以立即被另作他用。
堆內(nèi)存用來存放由new創(chuàng)建的對(duì)象和數(shù)組。
在堆中分配的內(nèi)存,由Java虛擬機(jī)的自動(dòng)垃圾回收器來管理。
在堆中產(chǎn)生了一個(gè)數(shù)組或?qū)ο蠛,還可以在棧中定義一個(gè)特殊的變量,讓棧中這個(gè)變量的取值等于數(shù)組或?qū)ο笤诙褍?nèi)存中的首地址,棧中的這個(gè)變量就成了數(shù)組或?qū)ο蟮囊米兞俊?
引用變量就相當(dāng)于是為數(shù)組或?qū)ο笃鸬囊粋(gè)名稱,以后就可以在程序中使用棧中的引用變量來訪問堆中的數(shù)組或?qū)ο蟆?
17. String str1 = “abc”和String str1 = newString(“abc”);這兩個(gè)的區(qū)別是什么?
String str1 ="abc";
String str2 = "abc";
System.out.println(str1==str2); //true
可以看出str1和str2是指向同一個(gè)對(duì)象的。
String str1 =new String ("abc");
String str2 =new String ("abc");
System.out.println(str1==str2); // false
用new的方式是生成不同的對(duì)象。每一次生成一個(gè)。
因此用第二種方式創(chuàng)建多個(gè)”abc”字符串,在內(nèi)存中其實(shí)只存在一個(gè)對(duì)象而已. 這種寫法有利與節(jié)省內(nèi)存空間. 同時(shí)它可以在一定程度上提高程序的運(yùn)行速度,因?yàn)镴VM會(huì)自動(dòng)根據(jù)棧中數(shù)據(jù)的實(shí)際情況來決定是否有必要?jiǎng)?chuàng)建新對(duì)象。而對(duì)于String str = new String("abc");的代碼,則一概在堆中創(chuàng)建新對(duì)象,而不管其字符串值是否相等,是否有必要?jiǎng)?chuàng)建新對(duì)象,從而加重了程序的負(fù)擔(dān)。
另一方面, 要注意: 我們?cè)谑褂弥T如Stringstr = "abc";的格式定義類時(shí),總是想當(dāng)然地認(rèn)為,創(chuàng)建了String類的對(duì)象str。擔(dān)心陷阱!對(duì)象可能并沒有被創(chuàng)建!而可能只是指向一個(gè)先前已經(jīng)創(chuàng)建的 對(duì)象。只有通過new()方法才能保證每次都創(chuàng)建一個(gè)新的對(duì)象。由于String類的immutable性質(zhì),當(dāng)String變量需要經(jīng)常變換其值時(shí),應(yīng) 該考慮使用StringBuffer類,以提高程序效率。
四、 Android相關(guān)基礎(chǔ)知識(shí)
1. Android dvm的進(jìn)程和Linux的進(jìn)程、應(yīng)用程序的進(jìn)程是否為同一個(gè)概念
DVM指dalivk的虛擬機(jī)。每一個(gè)Android應(yīng)用程序都在它自己的進(jìn)程中運(yùn)行,都擁有一個(gè)獨(dú)立的Dalvik虛擬機(jī)實(shí)例。而每一個(gè)DVM都是在Linux 中的一個(gè)進(jìn)程,所以說可以認(rèn)為是同一個(gè)概念。
什么是android DVM:Dalvik是Google公司自己設(shè)計(jì)用于Android平臺(tái)的Java虛擬機(jī),每一個(gè)Dalvik 應(yīng)用作為一個(gè)獨(dú)立的Linux 進(jìn)程執(zhí)行。獨(dú)立的進(jìn)程可以防止在虛擬機(jī)崩潰的時(shí)候所有程序都被關(guān)閉。
Dalvik和Java運(yùn)行環(huán)境的區(qū)別[
1:Dalvik主要是完成對(duì)象生命周期管理,堆棧管理,線程管理,安全和異常管理,以及垃圾回收等等重要功能。
2:Dalvik負(fù)責(zé)進(jìn)程隔離和線程管理,每一個(gè)Android應(yīng)用在底層都會(huì)對(duì)應(yīng)一個(gè)獨(dú)立的Dalvik虛擬機(jī)實(shí)例,其代碼在虛擬機(jī)的解釋下得以執(zhí)行。
3:不同于Java虛擬機(jī)運(yùn)行java字節(jié)碼,Dalvik虛擬機(jī)運(yùn)行的是其專有的文件格式Dex 4:dex文件格式可以減少整體文件尺寸,提高I/o操作的類查找速度。
5:odex是為了在運(yùn)行過程中進(jìn)一步提高性能,對(duì)dex文件的進(jìn)一步優(yōu)化。
6:所有的Android應(yīng)用的線程都對(duì)應(yīng)一個(gè)Linux線程,虛擬機(jī)因而可以更多的依賴操作系統(tǒng)的線程調(diào)度和管理機(jī)制
7:有一個(gè)特殊的虛擬機(jī)進(jìn)程Zygote,他是虛擬機(jī)實(shí)例的孵化器。它在系統(tǒng)啟動(dòng)的時(shí)候就會(huì)產(chǎn)生,它會(huì)完成虛擬機(jī)的初始化,庫的加載,預(yù)制類庫和初始化的操作。如果系統(tǒng)需要一個(gè)新的虛擬機(jī)實(shí)例,它會(huì)迅速復(fù)制自身,以最快的數(shù)據(jù)提供給系統(tǒng)。對(duì)于一些只讀的系統(tǒng)庫,所有虛擬機(jī)實(shí)例都和Zygote共享一塊內(nèi)存區(qū)域。
2. Android中的動(dòng)畫有哪幾類,它們的特點(diǎn)和區(qū)別是什么?
android支持兩種動(dòng)畫模式,tween animation,frame animation
View Animation(Tween Animation):補(bǔ)間動(dòng)畫,給出兩個(gè)關(guān)鍵幀,通過一些算法將給定屬性值在給定的時(shí)間內(nèi)在兩個(gè)關(guān)鍵幀間漸變。
View animation只能應(yīng)用于View對(duì)象,而且只支持一部分屬性,這種實(shí)現(xiàn)方式可以使視圖組件移動(dòng)、放大、縮小以及產(chǎn)生透明度的變化.
另一種Frame動(dòng)畫,傳統(tǒng)的動(dòng)畫方法,通過順序的播放排列好的圖片來實(shí)現(xiàn),類似電影。
3. Handler機(jī)制的原理
andriod提供了Handler 和Looper 來滿足線程間的通信。Handler先進(jìn)先出原則。Looper類用來管理特定線程內(nèi)對(duì)象之間的消息交換(MessageExchange)。
1)Looper: 一個(gè)線程可以產(chǎn)生一個(gè)Looper對(duì)象,由它來管理此線程里的MessageQueue(消息隊(duì)列)。
2)Handler: 你可以構(gòu)造Handler對(duì)象來與Looper溝通,以便push新消息到MessageQueue里;或者接收Looper從MessageQueue取出)所送來的消息。
3) Message Queue(消息隊(duì)列):用來存放線程放入的消息。
4)線程:UIthread 通常就是main thread,而Android啟動(dòng)程序時(shí)會(huì)替它建立一個(gè)MessageQueue。
4. 說說mvc模式的原理,它在android中的運(yùn)用
mvc是model,view,controller的縮寫,mvc包含三個(gè)部分:
模型(model)對(duì)象:是應(yīng)用程序的主體部分,所有的業(yè)務(wù)邏輯都應(yīng)該寫在該層。
視圖(view)對(duì)象:是應(yīng)用程序中負(fù)責(zé)生成用戶界面的部分。也是在整個(gè)mvc架構(gòu)中用戶唯一可以看到的一層,接收用戶的輸入,顯示處理結(jié)果。
控制器(control)對(duì)象:是根據(jù)用戶的輸入,控制用戶界面數(shù)據(jù)顯示及更新model對(duì)象狀態(tài)的部分,控制器更重要的一種導(dǎo)航功能,響應(yīng)用戶出發(fā)的相關(guān)事件,交給m層處理。
android鼓勵(lì)弱耦合和組件的重用,在android中mvc的具體體現(xiàn)如下:
1)視圖層(view):一般采用xml文件進(jìn)行界面的描述,使用的時(shí)候可以非常方便的引入,當(dāng)然,如果你對(duì)android了解的比較的多了話,就一定可以想到在android中也可以使用javascript+html等的方式作為view層,當(dāng)然這里需要進(jìn)行java和javascript之間的通信,幸運(yùn)的是,android提供了它們之間非常方便的通信實(shí)現(xiàn)。
2)控制層(controller):android的控制層的重任 通常落在了眾多的acitvity的肩上,這句話也就暗含了不要在acitivity中寫代碼,要通過activity交割model業(yè)務(wù)邏輯層處理,這 樣做的另外一個(gè)原因是android中的acitivity的響應(yīng)時(shí)間是5s,如果耗時(shí)的操作放在這里,程序就很容易被回收掉。
3)模型層(model):對(duì)數(shù)據(jù)庫的操作、對(duì)網(wǎng)絡(luò)等的操作都應(yīng)該在model里面處理,當(dāng)然對(duì)業(yè)務(wù)計(jì)算等操作也是必須放在的該層的。
5. 橫豎屏切換時(shí)activity的生命周期
1、不設(shè)置Activity的android:configChanges時(shí),切屏?xí)匦抡{(diào)用各個(gè)生命周期,切橫屏?xí)r會(huì)執(zhí)行一次,切豎屏?xí)r會(huì)執(zhí)行兩次
2、設(shè)置Activity的android:configChanges="orientation"時(shí),切屏還是會(huì)重新調(diào)用各個(gè)生命周期,切橫、豎屏?xí)r只會(huì)執(zhí)行一次
3、設(shè)置Activity的android:configChanges="orientation|keyboardHidden"時(shí),切屏不會(huì)重新調(diào)用各個(gè)生命周期,只會(huì)執(zhí)行onConfigurationChanged方法
6. 請(qǐng)介紹下android大眾常使用的五種布局
常用五種布局方式,分別是:FrameLayout(框架布局),LinearLayout (線性布局),AbsoluteLayout(絕對(duì)布局),RelativeLayout(相對(duì)布局),TableLayout(表格布局)。
一、 FrameLayout:所有東西依次都放在左上角,會(huì)重疊,這個(gè)布局比較簡(jiǎn)單,也只能放一點(diǎn)比較簡(jiǎn)單的東西。二、LinearLayout:線性布局, 每一個(gè)LinearLayout里面又可分為垂直布局(android:orientation="vertical")和水平布局 (android:orientation="horizontal" )。當(dāng)垂直布局時(shí),每一行就只有一個(gè)元素,多個(gè)元素依次垂直往下;水平布局時(shí),只有一行,每一個(gè)元素依次向右排列。三、AbsoluteLayout:絕對(duì)布局用X,Y坐標(biāo)來指定元素的位置,這種布局方式也比較簡(jiǎn)單,但是在屏幕旋轉(zhuǎn)時(shí),往往會(huì)出問題,而且多個(gè)元素的時(shí)候,計(jì)算比較麻煩。四、RelativeLayout:相對(duì)布局可以理解為某一個(gè)元素為參照物,來定位的布局方式。主要屬性有:相對(duì)于某一個(gè)元素android:layout_below、 android:layout_toLeftOf相對(duì)于父元素的地方 android:layout_alignParentLeft、android:layout_alignParentRigh;五、 TableLayout:表格布局,每一個(gè)TableLayout里面有表格行TableRow,TableRow里面可以具體定義每一個(gè)元素。每一個(gè)布 局都有自己適合的方式,這五個(gè)布局元素可以相互嵌套應(yīng)用,做出美觀的界面。
五、英文翻譯
把一下段落翻譯成中文
a) An integral(完整的;整體的;完全的)approach to code documentation is to write the code so that it documentsitself. In other words, the code should be naturally readable in such a way asto make it easy to understand. This is accomplished by proper namingconventions and statement(聲明) formatting.
b)Collections(集合) are thedata structures that are most easily altered for performance-tuning purposes.Using the correct or most appropriate collection class can improve performancewith little change to code. For example, if a large ordered collection haselements frequently deleted or inserted throughout it, it usually can providebetter performance if based on a linked list rather than an array. On the otherhand, a static(unchanging) collection that needs to be accessed by indexperforms better with an underlying implementation that is an array.
真題3:剛剛答完人人網(wǎng)的筆試題,不讓把草稿紙帶出來,只能憑著記憶復(fù)盤了,第一部分還差一題,有人記得可以補(bǔ)充一下,題目基本上都是簡(jiǎn)單說明,但是意思基本表達(dá)到了,第四部分感覺有點(diǎn)困難,天南大還是有很多高手啊,我是結(jié)結(jié)實(shí)實(shí)做了2個(gè)多小時(shí),提前交的挺多的,呵呵,有些基礎(chǔ)題做的不太好,比如那個(gè)已知先序和中序求后序就沒有弄出來,時(shí)間有點(diǎn)不夠,再讀讀離散研究下。
原題如下:
第一部分(12*5)
1.一顆完全二叉樹共有768個(gè)節(jié)點(diǎn),求葉節(jié)點(diǎn)個(gè)數(shù)____個(gè)。
2.一顆由鏈表實(shí)現(xiàn)的有n個(gè)節(jié)點(diǎn),那么指針數(shù)____個(gè),指向節(jié)點(diǎn)的指針數(shù)____個(gè),空閑的指針個(gè)數(shù)____個(gè)。
3.哈希散列題,給了11個(gè)數(shù)字,使用0到12進(jìn)行散列,填一張表
4.1000的階乘的尾部0的個(gè)數(shù)____個(gè)
5.liux下mkdir,如果父目錄不存在,使用附屬命令創(chuàng)建父目錄
6.”vmstat1“的命令,給出了一張表格,及6個(gè)選項(xiàng)判斷正誤(記不得了)
7.(樹)前序AEFBGCDHIKJ,中序:EFAGBCHKIJD,求后序
8.(數(shù)據(jù)庫題)Table1:(5 2 2)(5 3 1)(5 2 3)Table2:(5 2 2)(5 3 1)(5 4 4)使用SQL語句找出存在于Table1中而不存在于table2中數(shù)據(jù)。
9.倆人玩游戲,在腦門上貼數(shù)字(正整數(shù)>=1),只看見對(duì)方的,看不見自己的,而且兩人的數(shù)字相差1,要猜自己的數(shù)字
A:我不知道
B:我也不知道
A:我知道了
B:我也知道了
A頭上的字:____;B頭上的字:_____;
10:
11:以下四種排序那種效率最低____,時(shí)間復(fù)雜度是多少_____
A:快排 B:冒泡 C:歸并 D:選擇
12:小明的IP是:200.99.***.5,子網(wǎng)掩碼是255.255.148.0,問該子網(wǎng)有多少個(gè)IP_____個(gè)
第二部分(3*10)
1.二叉搜索樹中給定兩個(gè)節(jié)點(diǎn):BSTNode1和BSTNode2,查找他們的最近公共父節(jié)點(diǎn)
2.環(huán)狀單鏈表,給定指向某個(gè)節(jié)點(diǎn)的指針,編寫算法求離其最遠(yuǎn)的節(jié)點(diǎn)
3.三個(gè)以上設(shè)計(jì)模式,并用Java或C++實(shí)現(xiàn)
第三部分(4*15)
1.無交集數(shù)據(jù)放在10臺(tái)計(jì)算機(jī)上,如何高效的選出Top10
2.24點(diǎn)游戲,給定四個(gè)整數(shù),可以使用加減乘除四種運(yùn)算法則,但是每個(gè)數(shù)只能用一次,編寫游戲解法
3.三國(guó)殺,規(guī)則”殺“使對(duì)方體力減一半,”閃“可以免除殺一次,現(xiàn)有30張”殺“,15張”閃“,五個(gè)人玩游戲,每輪一人三張牌,問出現(xiàn)體力為0的概率
4.萬臺(tái)服務(wù)器(集群),構(gòu)造一個(gè)監(jiān)控系統(tǒng)去監(jiān)視該服務(wù)器,監(jiān)控服務(wù)器主動(dòng)或者被動(dòng)去監(jiān)控服務(wù)器集群,要求每個(gè)一段間隔獲取服務(wù)器集群的數(shù)據(jù),請(qǐng)?jiān)O(shè)計(jì)方案,并提供相關(guān)數(shù)據(jù):監(jiān)控服務(wù)器數(shù)量,帶寬,時(shí)間間隔等。
人人網(wǎng)校園招聘杭州站C++筆試題目1.算法的幾個(gè)概念:時(shí)間復(fù)雜度,空間復(fù)雜度等等。
2.采用鏈地址法處理長(zhǎng)度的時(shí)候,哈希表查找成功的平均長(zhǎng)度與哪些因素有關(guān)?
哈希表的裝填因子有關(guān)。
裝填因子= 表中填入的記錄數(shù)/哈希表的長(zhǎng)度。
3.二叉樹節(jié)點(diǎn)的計(jì)算:
二叉樹中度為1的節(jié)點(diǎn)有8個(gè),度為0的節(jié)點(diǎn)有3個(gè),問這顆二叉樹總共有多少節(jié)點(diǎn)?
對(duì)于任意一棵二叉樹BT,如果度為0的結(jié)點(diǎn)個(gè)數(shù)為n0,度為2的結(jié)點(diǎn)個(gè)數(shù)為n2,則n0=n2+1。
所以度為2的節(jié)點(diǎn)個(gè)數(shù)為3-1 = 2,那么總共的結(jié)點(diǎn)個(gè)數(shù)就是3+2+8 = 13。
順便復(fù)習(xí)一下完全二叉樹的計(jì)算。
完全二叉樹有一個(gè)特點(diǎn),就是度為1的節(jié)點(diǎn)數(shù)要么為1,要么為0?梢宰约寒嫵鰣D來看看。
問題:如果設(shè)一棵完全二叉樹共有500個(gè)結(jié)點(diǎn),則在該二叉樹中有多少個(gè)葉子結(jié)點(diǎn)?
設(shè)葉子節(jié)點(diǎn)數(shù)為n0,度為2的節(jié)點(diǎn)數(shù)為n0 - 1,又因?yàn)槭峭耆鏄洌詎1 = 1或者0
n0 + n1 + n2 = 500,帶入 2n0 - 1 + n1 = 500,故n1 = 1,n0 = 250, n2 = 249。
5.最小生成樹的問題,節(jié)點(diǎn)個(gè)數(shù)計(jì)算問題。
6.在序列有序的情況下,快速排序的時(shí)間復(fù)雜度是多少?
O(n^2)。
7.網(wǎng)卡完成那一層的功能?
網(wǎng)卡工作在物理層和數(shù)據(jù)鏈路層的MAC子層。
https://leehlom.blog.163.com/blog/static/241206962008112775913541/。
8.模板函數(shù)的使用。
template
T add(T x, T y){
return x + y;
}
A.add(5,2)
B.add(5.2,2.2)
C.add(5.2,2)
D.add(5.2,2)
D是錯(cuò)誤的,因?yàn)榫幾g器知道要特化哪一個(gè)了。
8.構(gòu)造函數(shù)可以重載么?析構(gòu)函數(shù)可以重載么?
構(gòu)造不重載,怎么實(shí)現(xiàn)多樣化?
析構(gòu)怎么重載,沒有參數(shù)。
10.C++靜態(tài)成員和非靜態(tài)成員有什么區(qū)別?
1)靜態(tài)變量是屬于類的,只能用classname::來調(diào)用.而非靜態(tài)是屬于對(duì)象的,必須通過對(duì)象
來調(diào)用.
2)如果在函數(shù)中聲明一個(gè)靜態(tài)變量的話,它存儲(chǔ)在非函數(shù)的活動(dòng)區(qū).就是它不隨函數(shù)調(diào)用的
結(jié)束而釋放內(nèi)存空間,所以它也具有全局變量的特點(diǎn).但是和全局變量相比不同在于它只能在本
文件中使用
11.空類的大小?一個(gè)含有虛函數(shù)的類大小?為什么?
分別是1和4。
因?yàn),?duì)于空類,C++編譯器會(huì)制定一個(gè)char來占據(jù)位置。
含有虛函數(shù)的類,里面會(huì)存放一個(gè)虛函數(shù)指針vptr,指向一個(gè)虛函數(shù)表。指針在32位平臺(tái)上的大小為4個(gè)字節(jié)。
12 OSI七層模型和TCP/IP 五層模型。
應(yīng)用層
表示層
會(huì)話層 應(yīng)用層
傳輸層 傳輸層
網(wǎng)絡(luò)層 互聯(lián)網(wǎng)絡(luò)層
數(shù)據(jù)鏈路層 互聯(lián)接口層
物理層 物理層
12.編程求解走樓梯問題:
一個(gè)人一次可以上1步,2步,3步,F(xiàn)在有n個(gè)階梯(1<= n <= 100W,問有方法可以上去?
)
f(1) = 1;
f(2) = 2;
f(3) = 4;
n > 3,f(n) = f(n - 1) + f(n - 2) + f(n -3)
13.人人網(wǎng)的朋友概念:A和B是朋友,B和C是朋友,那么A和C是二度朋友。
找出每一個(gè)人的10度朋友。要求O(n)的算法
14.推薦系統(tǒng)的設(shè)計(jì)