導航:首頁 > 程序命令 > 程序員面試寶典第二版機密面試題

程序員面試寶典第二版機密面試題

發布時間:2023-05-13 08:56:49

程序員面試經常被提到的問題

java 程序員常用面試題- -

Java程序員面試三十二問

Java程序員面試三十二問
作者:佚名 來自:未知

第一,談談final, finally, finalize的區別。

第二,Anonymous Inner Class (匿名內部類) 是否可以extends(繼承)其它類,是否可以

implements(實現)interface(介面)?

第三,Static Nested Class 和 Inner Class的不同,說得越多越好(面試題有的很籠統)。

第四,&和&&的區別。

第五,HashMap和Hashtable的區別。

第六,Collection 和 Collections的區別。

第七,什麼時候用assert.

第八,GC是什麼? 為什麼要有GC?

第九,String s = new String("xyz");創建了幾個String Object?

第十,Math.round(11.5)等於多少? Math.round(-11.5)等於多少?

第十一,short s1 = 1; s1 = s1 + 1;有什麼錯? short s1 = 1; s1 += 1;有什麼錯?

第十二,sleep() 和 wait() 有什麼區別?

第十三,Java有沒有goto?

第十四,數組有沒有length()這個方法? String有沒有length()這個方法?

第十五,Overload和Override的區別。Overloaded的方法是否可以改變返回值的類型?

第十六,Set里的元素是不能重復的,那麼用什麼方法來區分重復與否呢? 是用==還是equals()?

它們有何區別?

第十七,給我一個你最常見到的runtime exception.

第十八,error和exception有什麼區別?

第十九,List, Set, Map是否繼承自Collection介面?

第二十,abstract class和interface有什麼區別?

第二十一,abstract的method是否可同時是static,是否可同時是native,是否可同時是

synchronized?

第二十二,介面是否可繼承介面? 抽象類是否可實現(implements)介面? 抽象類是否可繼承實體

類(concrete class)?

第二十三,啟動一個線程是用run()還是start()?

第二十四,構造器Constructor是否可被override?

第二十五,是否可以繼承String類?

第二十六,當一個線程進入一個對象的一個synchronized方法後,其它線程是否可進入此對象的其它

方法?

第二十七,try {}里有一個return語句,那麼緊跟在這個try後的finally {}里的code會不會被執行

,什麼時候被執行,在return前還是後?

第二十八,編程題: 用最有效率的方法算出2乘以8等於幾?

第二十九,兩個對象值相同(x.equals(y) == true),但卻可有不同的hash code,這句話對不對



第三十,當一個對象被當作參數傳遞到一個方法後,此方法可改變這個對象的屬性,並可返回變化後

的結果,那麼這里到底是值傳遞還是引用傳遞?

第三十一,swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?

第三十二,編程題: 寫一個Singleton出來。

以下是答案

第一,談談final, finally, finalize的區別。

final?修飾符(關鍵字)如果一個類被聲明為final,意味著它不能再派生出新的子類,不能作為父

類被繼承。因此一個類不能既被聲明為 abstract的,又被聲明為final的。將變數或方法聲明為final,

可以保證它們在使用中不被改變。被聲明為final的變數必須在聲明時給定初值,而在以後的引用中只能

讀取,不可修改。被聲明為final的方法也同樣只能使用,不能重載finally?再異常處理時提供 finally

塊來執行任何清除操作。如果拋出一個異常,那麼相匹配的 catch 子句就會執行,然後控制就會進入

finally 塊(如果有的話)。

finalize?方法名。Java 技術允許使用 finalize() 方法在垃圾收集器將對象從內存中清除出去

之前做必要的清理工作。這個方法是由垃圾收集器在確定這個對象沒有被引用時對這個對象調用的。它是

在 Object 類中定義的,因此所有的類都繼承了它。子類覆蓋 finalize() 方法以整理系統資源或者執

行其他清理工作。finalize() 方法是在垃圾收集器刪除對象之前對這個對象調用的。

第二,Anonymous Inner Class (匿名內部類) 是否可以extends(繼承)其它類,是否可以

implements(實現)interface(介面)?

匿名的內部類是沒有名字的內部類。不能extends(繼承) 其它類,但一個內部類可以作為一個介面

,由另一個內部類實現。

第三,Static Nested Class 和 Inner Class的不同,說得越多越好(面試題有的很籠統)。

Nested Class (一般是C++的說法),Inner Class (一般是JAVA的說法)。Java內部類與C++嵌套

類最大的不同就在於是否有指向外部的引用上。具體可見http:

//www.frontfree.net/articles/services/view.asp?id=704&page=1

註: 靜態內部類(Inner Class)意味著1創建一個static內部類的對象,不需要一個外部類對象,2

不能從一個static內部類的一個對象訪問一個外部類對象

第四,&和&&的區別。

&是位運算符。&&是布爾邏輯運算符。

第五,HashMap和Hashtable的區別。

都屬於Map介面的類,實現了將惟一鍵映射到特定的值上。

HashMap 類沒有分類或者排序。它允許一個 null 鍵和多個 null 值。

Hashtable 類似於 HashMap,但是不允許 null 鍵和 null 值。它也比 HashMap 慢,因為它是同步

的。

第六,Collection 和 Collections的區別。

Collections是個java.util下的類,它包含有各種有關集合操作的靜態方法。

Collection是個java.util下的介面,它是各種集合結構的父介面。

第七,什麼時候用assert。

斷言是一個包含布爾表達式的語句,在執行這個語句時假定該表達式為 true。如果表達式計算為

false,那麼系統會報告一個 AssertionError。它用於調試目的:

assert(a > 0); // throws an AssertionError if a <= 0

斷言可以有兩種形式:

assert Expression1 ;
assert Expression1 : Expression2 ;

Expression1 應該總是產生一個布爾值。
Expression2 可以是得出一個值的任意表達式。這個值用於生成顯示更多調試信息的 String 消息。

斷言在默認情況下是禁用的。要在編譯時啟用斷言,需要使用 source 1.4 標記:

javac -source 1.4 Test.java

要在運行時啟用斷言,可使用 -enableassertions 或者 -ea 標記。
要在運行時選擇禁用斷言,可使用 -da 或者 -disableassertions 標記。
要系統類中啟用斷言,可使用 -esa 或者 -dsa 標記。還可以在包的基礎上啟用或者禁用斷言。

可以在預計正常情況下不會到達的任何位置上放置斷言。斷言可以用於驗證傳遞給私有方法的參數。

不過,斷言不應該用於驗證傳遞給公有方法的參數,因為不管是否啟用了斷言,公有方法都必須檢查其參

數。不過,既可以在公有方法中,也可以在非公有方法中利用斷言測試後置條件。另外,斷言不應該以任

何方式改變程序的狀態。

第八,GC是什麼? 為什麼要有GC? (基礎)。

GC是垃圾收集器。Java 程序員不用擔心內存管理,因為垃圾收集器會自動進行管理。要請求垃圾收

集,可以調用下面的方法之一:

System.gc()
Runtime.getRuntime().gc()

第九,String s = new String("xyz");創建了幾個String Object?

兩個對象,一個是"xyx",一個是指向"xyx"的引用對象s。

第十,Math.round(11.5)等於多少? Math.round(-11.5)等於多少?

Math.round(11.5)返回(long)12,Math.round(-11.5)返回(long)-11;

第十一,short s1 = 1; s1 = s1 + 1;有什麼錯? short s1 = 1; s1 += 1;有什麼錯?

short s1 = 1; s1 = s1 + 1;有錯,s1是short型,s1+1是int型,不能顯式轉化為short型。可修改為

s1 =(short)(s1 + 1) 。short s1 = 1; s1 += 1正確。

第十二,sleep() 和 wait() 有什麼區別? 搞線程的最愛

sleep()方法是使線程停止一段時間的方法。在sleep 時間間隔期滿後,線程不一定立即恢復執行。

這是因為在那個時刻,其它線程可能正在運行而且沒有被調度為放棄執行,除非(a)"醒來"的線程具有更

高的優先順序,(b)正在運行的線程因為其它原因而阻塞。

wait()是線程交互時,如果線程對一個同步對象x 發出一個wait()調用,該線程會暫停執行,被調對

象進入等待狀態,直到被喚醒或等待時間到。

第十三,Java有沒有goto?

Goto?java中的保留字,現在沒有在java中使用。

第十四,數組有沒有length()這個方法? String有沒有length()這個方法?

數組沒有length()這個方法,有length的屬性。
String有有length()這個方法。

第十五,Overload和Override的區別。Overloaded的方法是否可以改變返回值的類型?

方法的重寫Overriding和重載Overloading是Java多態性的不同表現。重寫Overriding是父類與子類

之間多態性的一種表現,重載Overloading是一個類中多態性的一種表現。如果在子類中定義某方法與其

父類有相同的名稱和參數,我們說該方法被重寫 (Overriding)。子類的對象使用這個方法時,將調用子

類中的定義,對它而言,父類中的定義如同被"屏蔽"了。如果在一個類中定義了多個同名的方法,它們或

有不同的參數個數或有不同的參數類型,則稱為方法的重載(Overloading)。Overloaded的方法是可以改

變返回值的類型。

第十六,Set里的元素是不能重復的,那麼用什麼方法來區分重復與否呢? 是用==還是equals()? 它

們有何區別?

Set里的元素是不能重復的,那麼用iterator()方法來區分重復與否。equals()是判讀兩個Set是否相

等。

equals()和==方法決定引用值是否指向同一對象equals()在類中被覆蓋,為的是當兩個分離的對象的

內容和類型相配的話,返回真值。

第十七,給我一個你最常見到的runtime exception。

ArithmeticException, ArrayStoreException, BufferOverflowException,

BufferUnderflowException, CannotRedoException, CannotUndoException, ClassCastException,

CMMException, , DOMException, EmptyStackException,

IllegalArgumentException, IllegalMonitorStateException, IllegalPathStateException,

IllegalStateException, ImagingOpException, IndexOutOfBoundsException,

MissingResourceException, NegativeArraySizeException, NoSuchElementException,

NullPointerException, ProfileDataException, ProviderException, RasterFormatException,

SecurityException, SystemException, UndeclaredThrowableException, UnmodifiableSetException,

UnsupportedOperationException

第十八,error和exception有什麼區別?

error 表示恢復不是不可能但很困難的情況下的一種嚴重問題。比如說內存溢出。不可能指望程序能

處理這樣的情況。

exception 表示一種設計或實現問題。也就是說,它表示如果程序運行正常,從不會發生的情況。

第十九,List, Set, Map是否繼承自Collection介面?

List,Set是

Map不是

第二十,abstract class和interface有什麼區別?

聲明方法的存在而不去實現它的類被叫做抽象類(abstract class),它用於要創建一個體現某些基

本行為的類,並為該類聲明方法,但不能在該類中實現該類的情況。不能創建abstract 類的實例。然而

可以創建一個變數,其類型是一個抽象類,並讓它指向具體子類的一個實例。不能有抽象構造函數或抽象

靜態方法。Abstract 類的子類為它們父類中的所有抽象方法提供實現,否則它們也是抽象類為。取而代

之,在子類中實現該方法。知道其行為的其它類可以在類中實現這些方法。

介面(interface)是抽象類的變體。在介面中,所有方法都是抽象的。多繼承性可通過實現這樣的

介面而獲得。介面中的所有方法都是抽象的,沒有一個有程序體。介面只可以定義static final成員變數

。介面的實現與子類相似,除了該實現類不能從介面定義中繼承行為。當類實現特殊介面時,它定義(即

將程序體給予)所有這種介面的方法。然後,它可以在實現了該介面的類的任何對象上調用介面的方法。

由於有抽象類,它允許使用介面名作為引用變數的類型。通常的動態聯編將生效。引用可以轉換到介面類

型或從介面類型轉換,instanceof 運算符可以用來決定某對象的類是否實現了介面。

第二十一,abstract的method是否可同時是static,是否可同時是native,是否可同時是

synchronized?

都不能

第二十二,介面是否可繼承介面? 抽象類是否可實現(implements)介面? 抽象類是否可繼承實體類

(concrete class)?

介面可以繼承介面。抽象類可以實現(implements)介面,抽象類是否可繼承實體類,但前提是實體類

必須有明確的構造函數。

第二十三,啟動一個線程是用run()還是start()?

啟動一個線程是調用start()方法,使線程所代表的虛擬處理機處於可運行狀態,這意味著它可以由

JVM調度並執行。這並不意味著線程就會立即運行。run()方法可以產生必須退出的標志來停止一個線程。

第二十四,構造器Constructor是否可被override?

構造器Constructor不能被繼承,因此不能重寫Overriding,但可以被重載Overloading。

第二十五,是否可以繼承String類?

String類是final類故不可以繼承。

第二十六,當一個線程進入一個對象的一個synchronized方法後,其它線程是否可進入此對象的其它

方法?

不能,一個對象的一個synchronized方法只能由一個線程訪問。

第二十七,try {}里有一個return語句,那麼緊跟在這個try後的finally {}里的code會不會被執行

,什麼時候被執行,在return前還是後?

會執行,在return前執行。

第二十八,編程題: 用最有效率的方法算出2乘以8等於幾?

有C背景的程序員特別喜歡問這種問題。

2 << 3

第二十九,兩個對象值相同(x.equals(y) == true),但卻可有不同的hash code,這句話對不對?

不對,有相同的hash code。

第三十,當一個對象被當作參數傳遞到一個方法後,此方法可改變這個對象的屬性,並可返回變化後

的結果,那麼這里到底是值傳遞還是引用傳遞?

是值傳遞。Java 編程語言只由值傳遞參數。當一個對象實例作為一個參數被傳遞到方法中時,參數

的值就是對該對象的引用。對象的內容可以在被調用的方法中改變,但對象的引用是永遠不會改變的。

第三十一,swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?

switch(expr1)中,expr1是一個整數表達式。因此傳遞給 switch 和 case 語句的參數應該是 int

、 short、 char 或者 byte。long,string 都不能作用於swtich。

第三十二,編程題: 寫一個Singleton出來。

Singleton模式主要作用是保證在Java應用程序中,一個類Class只有一個實例存在。

一般Singleton模式通常有幾種種形式:

第一種形式: 定義一個類,它的構造函數為private的,它有一個static的private的該類變數,

在類初始化時實例話,通過一個public的getInstance方法獲取對它的引用,繼而調用其中的方法。

public class Singleton {
private Singleton(){}
//在自己內部定義自己一個實例,是不是很奇怪?
//注意這是private 只供內部調用
private static Singleton instance = new Singleton();
//這里提供了一個供外部訪問本class的靜態方法,可以直接訪問
public static Singleton getInstance() {
return instance;
}
}

第二種形式:

public class Singleton {
private static Singleton instance = null;
public static synchronized Singleton getInstance() {
//這個方法比上面有所改進,不用每次都進行生成對象,只是第一次
//使用時生成實例,提高了效率!
if (instance==null)
instance=new Singleton();
return instance; }
}

其他形式:

定義一個類,它的構造函數為private的,所有方法為static的。

一般認為第一種形式要更加安全些

第三十三 Hashtable和HashMap

Hashtable繼承自Dictionary類,而HashMap是Java1.2引進的Map interface的一個實現

HashMap允許將null作為一個entry的key或者value,而Hashtable不允許

還有就是,HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因為

contains方法容易讓人引起誤解。

最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多個線程訪問Hashtable時,

不需要自己為它的方法實現同步,而HashMap就必須為之提供外同步。

Hashtable和HashMap採用的hash/rehash演算法都大概一樣,所以性能不會有很大的差異。

Ⅱ 程序員面試必備php基礎面試題 – 第十三天

一、在HTTP1.0中,狀態嗎500的含義的是什麼?如果返回「找不到文件」的提示,則可用header(函數),其語句為?

500 Internal Server Error 伺服器遇到了意料不到的情況,不能完成客戶的請求
Header(「 HTTP/1.0 404 NOT FOUND」);

二、數組函數arsort()的作用是什麼?語句err_reporting(2047)的作用是什麼?

arsort:對數組進行逆向排序並保持索引關系;
error_reporting(2047)的作用是:report All errors and warnings

三、語句include和require都能把另外一個文件包含到當前文件中,它們的區別是___;為避免多此包含同一個文件,可以用語句_____來代替它們。

在如何處理失敗時,include() 產生一個警告而 require() 則導致一個致命錯誤; require_once()/include_once()

四、get_magic_quotes_gpc的作用是_______

本函數取得 PHP 環境配置的變數 magic_quotes_gpc (GPC, Get/Post/Cookie) 值。返回 0 表示關閉本功能;返回 1 表示本功能打開。當 magic_quotes_gpc 打開時,所有的 『 (單引號), 」 (雙引號), (反斜線) and 空字元會自動轉為含有反斜線的溢出字元。

五、在php中, heredoc是一種特殊的字元串, 他的結束標志必須是_____

結束標識符所在的行不能包含任何其它字元除」;」

六、寫出一個正則表達式, 把$string中的所有數字全部刪除

preg_replace(『/d/U』,』』,$string);

七、找出/data1/source 目錄中大於100k 的文件, 並復制到 ~/tmp/35/下

find /data1/source +size >100k | cp ~/temp/35/

八、perl –pi –e 『s|ABCD|Linux|g』 `find ./ -type f`的含義是

find ./-type f:找尋當前目錄下的類型為f的文件

九、10 2 * * * /data0/apache/schele/ussd/topnews/import_data.pl > /dev/null 的含義:_______將import_data.pl清空或刪除

十、rsync -avu 105903.zip 218.206.86.68::mmsres/resource/291/205的含義:_________備份數據用

-a 歸檔模式,遞歸傳輸文件;
-v 詳細模式輸出;
-u, –update 僅僅進行更新,也就是跳過所有已經存在於DST,並且文件時間晚於要備份的文件。(不覆蓋更新的文件)

十一、寫出x,y的值

十二、使用純CSS實現未知寸的圖片(但高度都小於200px) 在200px的正方形容器中水平和垂直居中,HTML代碼如下

Ⅲ 求程序員面試題

Java面試題集集錦

1.C++或Java中的異常處理機制的簡單原理和應用。

當JAVA程序違反了JAVA的語義規則時,JAVA虛擬機就會將發生的錯誤表示為一個異常。違反語義規則包括2種情況。一種是JAVA類庫內置的語義檢查。例如數組下標越界,會引發IndexOutOfBoundsException;訪問null的對象時會引發 NullPointerException。另一種情況就是JAVA允許程序員擴展這種語義檢查,程序員可以創建自己的異常,並自由選擇在何時用 throw關鍵字引發異常。所有的異常都是java.lang.Thowable的子類。

2. Java的介面和C++的虛類的相同和不同處。

由於Java不支持多繼承,而有可能某個類或對象要使用分別在幾個類或對象裡面的方法或屬性,現有的單繼承機制就不能滿足要求。與繼承相比,介面有更高的靈活性,因為介面中沒有任何實現代碼。當一個類實現了介面以後,該類要實現介面裡面所有的方法和屬性,並且介面裡面的屬性在默認狀態下面都是 public static,所有方法默認情況下是public.一個類可以實現多個介面。

3. 垃圾回收的優點和原理。並考慮2種回收機制。

Java語言中一個顯著的特點就是引入了垃圾回收機制,使c++程序員最頭疼的內存管理的問題迎刃而解,它使得Java程序員在編寫程序的時候不再需要考慮內存管理。由於有個垃圾回收機制,Java中的對象不再有「作用域」的概念,只有對象的引用才有「作用域」。垃圾回收可以有效的防止內存泄露,有效的使用可以使用的內存。垃圾回收器通常是作為一個單獨的低級別的線程運行,不可預知的情況下對內存堆中已經死亡的或者長時間沒有使用的對象進行清楚和回收,程序員不能實時的調用垃圾回收器對某個對象或所有對象進行垃圾回收。回收機制有分代復制垃圾回收和標記垃圾回收,增量垃圾回收。

4. 請說出你所知道的線程同步的方法。

wait():使一個線程處於等待狀態,並且釋放所持有的對象的lock。

sleep():使一個正在運行的線程處於睡眠狀態,是一個靜態方法,調用此方法要捕捉InterruptedException異常。

notify():喚醒一個處於等待狀態的線程,注意的是在調用此方法的時候,並不能確切的喚醒某一個等待狀態的線程,而是由JVM確定喚醒哪個線程,而且不是按優先順序。

Allnotity():喚醒所有處入等待狀態的線程,注意並不是給所有喚醒線程一個對象的鎖,而是讓它們競爭。

5. 請講一講析構函數和虛函數的用法和作用。

6. Error與Exception有什麼區別?

Error表示系統級的錯誤和程序不必處理的異常,

Exception表示需要捕捉或者需要程序進行處理的異常。

7. 在java中一個類被聲明為final類型,表示了什麼意思?

表示該類不能被繼承,是頂級類。

8. 描述一下你最常用的編程風格。

9. heap和stack有什麼區別。

棧是一種線形集合,其添加和刪除元素的操作應在同一段完成。棧按照後進先出的方式進行處理。

堆是棧的一個組成元素

10. 如果系統要使用超大整數(超過long長度范圍),請你設計一個數據結構來存儲這種超大型數字以及設計一種演算法來實現超大整數加法運算)。

public class BigInt()

{

int[] ArrOne = new ArrOne[1000];

String intString="";

public int[] Arr(String s)

{

intString = s;

for(int i=0;i
{

11. 如果要設計一個圖形系統,請你設計基本的圖形元件(Point,Line,Rectangle,Triangle)的簡單實現

12,談談final, finally, finalize的區別。

final—修飾符(關鍵字)如果一個類被聲明為final,意味著它不能再派生出新的子類,不能作為父類被繼承。因此一個類不能既被聲明為 abstract的,又被聲明為final的。將變數或方法聲明為final,可以保證它們在使用中不被改變。被聲明為final的變數必須在聲明時給定初值,而在以後的引用中只能讀取,不可修改。被聲明為final的方法也同樣只能使用,不能重載。

finally—再異常處理時提供 finally 塊來執行任何清除操作。如果拋出一個異常,那麼相匹配的 catch 子句就會執行,然後控制就會進入 finally 塊(如果有的話)。

finalize—方法名。Java 技術允許使用 finalize() 方法在垃圾收集器將對象從內存中清除出去之前做必要的清理工作。這個方法是由垃圾收集器在確定這個對象沒有被引用時對這個對象調用的。它是在 Object 類中定義的,因此所有的類都繼承了它。子類覆蓋 finalize() 方法以整理系統資源或者執行其他清理工作。finalize() 方法是在垃圾收集器刪除對象之前對這個對象調用的。

13,Anonymous Inner Class (匿名內部類) 是否可以extends(繼承)其它類,是否可以implements(實現)interface(介面)?

匿名的內部類是沒有名字的內部類。不能extends(繼承) 其它類,但一個內部類可以作為一個介面,由另一個內部類實現。

14,Static Nested Class 和 Inner Class的不同,說得越多越好(面試題有的很籠統)。

Nested Class (一般是C++的說法),Inner Class (一般是JAVA的說法)。Java內部類與C++嵌套類最大的不同就在於是否有指向外部的引用上。具體可見http: //www.frontfree.net/articles/services/view.asp?id=704&page=1

註: 靜態內部類(Inner Class)意味著1創建一個static內部類的對象,不需要一個外部類對象,2不能從一個static內部類的一個對象訪問一個外部類對象

第四,&和&&的區別。

&是位運算符。&&是布爾邏輯運算符。

15,HashMap和Hashtable的區別。

都屬於Map介面的類,實現了將惟一鍵映射到特定的值上。

HashMap 類沒有分類或者排序。它允許一個 null 鍵和多個 null 值。

Hashtable 類似於 HashMap,但是不允許 null 鍵和 null 值。它也比 HashMap 慢,因為它是同步的。

16,Collection 和 Collections的區別。

Collections是個java.util下的類,它包含有各種有關集合操作的靜態方法。

Collection是個java.util下的介面,它是各種集合結構的父介面。

17,什麼時候用assert。

斷言是一個包含布爾表達式的語句,在執行這個語句時假定該表達式為 true。如果表達式計算為 false,那麼系統會報告一個 Assertionerror。它用於調試目的:

assert(a > 0); // throws an Assertionerror if a <= 0

斷言可以有兩種形式:

assert Expression1 ;

assert Expression1 : Expression2 ;

Expression1 應該總是產生一個布爾值。

Expression2 可以是得出一個值的任意表達式。這個值用於生成顯示更多調試信息的 String 消息。

斷言在默認情況下是禁用的。要在編譯時啟用斷言,需要使用 source 1.4 標記:

javac -source 1.4 Test.java

要在運行時啟用斷言,可使用 -enableassertions 或者 -ea 標記。

要在運行時選擇禁用斷言,可使用 -da 或者 -disableassertions 標記。

要系統類中啟用斷言,可使用 -esa 或者 -dsa 標記。還可以在包的基礎上啟用或者禁用斷言。

可以在預計正常情況下不會到達的任何位置上放置斷言。斷言可以用於驗證傳遞給私有方法的參數。不過,斷言不應該用於驗證傳遞給公有方法的參數,因為不管是否啟用了斷言,公有方法都必須檢查其參數。不過,既可以在公有方法中,也可以在非公有方法中利用斷言測試後置條件。另外,斷言不應該以任何方式改變程序的狀態。

18,GC是什麼? 為什麼要有GC? (基礎)。

GC是垃圾收集器。Java 程序員不用擔心內存管理,因為垃圾收集器會自動進行管理。要請求垃圾收集,可以調用下面的方法之一:

System.gc()

Runtime.getRuntime().gc()

19,String s = new String("xyz");創建了幾個String Object?

兩個對象,一個是「xyx」,一個是指向「xyx」的引用對象s。

20,Math.round(11.5)等於多少? Math.round(-11.5)等於多少?

Math.round(11.5)返回(long)12,Math.round(-11.5)返回(long)-11;

21,short s1 = 1; s1 = s1 + 1;有什麼錯? short s1 = 1; s1 += 1;有什麼錯?

short s1 = 1; s1 = s1 + 1;有錯,s1是short型,s1+1是int型,不能顯式轉化為short型。可修改為s1 =(short)(s1 + 1) 。short s1 = 1; s1 += 1正確。

22,sleep() 和 wait() 有什麼區別? 搞線程的最愛

sleep()方法是使線程停止一段時間的方法。在sleep 時間間隔期滿後,線程不一定立即恢復執行。這是因為在那個時刻,其它線程可能正在運行而且沒有被調度為放棄執行,除非(a)「醒來」的線程具有更高的優先順序 (b)正在運行的線程因為其它原因而阻塞。

wait()是線程交互時,如果線程對一個同步對象x 發出一個wait()調用,該線程會暫停執行,被調對象進入等待狀態,直到被喚醒或等待時間到。

23,Java有沒有goto?

Goto—java中的保留字,現在沒有在java中使用。

24,數組有沒有length()這個方法? String有沒有length()這個方法?

數組沒有length()這個方法,有length的屬性。

String有有length()這個方法。

25,Overload和Override的區別。Overloaded的方法是否可以改變返回值的類型?

方法的重寫Overriding和重載Overloading是Java多態性的不同表現。重寫Overriding是父類與子類之間多態性的一種表現,重載Overloading是一個類中多態性的一種表現。如果在子類中定義某方法與其父類有相同的名稱和參數,我們說該方法被重寫 (Overriding)。子類的對象使用這個方法時,將調用子類中的定義,對它而言,父類中的定義如同被「屏蔽」了。如果在一個類中定義了多個同名的方法,它們或有不同的參數個數或有不同的參數類型,則稱為方法的重載(Overloading)。Overloaded的方法是可以改變返回值的類型。

26,Set里的元素是不能重復的,那麼用什麼方法來區分重復與否呢? 是用==還是equals()? 它們有何區別?

Set里的元素是不能重復的,那麼用iterator()方法來區分重復與否。equals()是判讀兩個Set是否相等。

equals()和==方法決定引用值是否指向同一對象equals()在類中被覆蓋,為的是當兩個分離的對象的內容和類型相配的話,返回真值。

27,給我一個你最常見到的runtime exception。

ArithmeticException, ArrayStoreException, BufferOverflowException, BufferUnderflowException, CannotRedoException, CannotUndoException, ClassCastException, CMMException, , DOMException, EmptyStackException, IllegalArgumentException, IllegalMonitorStateException, IllegalPathStateException, IllegalStateException,

ImagingOpException, IndexOutOfBoundsException, MissingResourceException, NegativeArraySizeException, NoSuchElementException, NullPointerException, ProfileDataException, ProviderException, RasterFORMatException, SecurityException, SystemException, UndeclaredThrowableException, UnmodifiableSetException, UnsupportedOperationException

28,error和exception有什麼區別?

error 表示恢復不是不可能但很困難的情況下的一種嚴重問題。比如說內存溢出。不可能指望程序能處理這樣的情況。

exception 表示一種設計或實現問題。也就是說,它表示如果程序運行正常,從不會發生的情況。

29,List, Set, Map是否繼承自Collection介面?

List,Set是

Map不是

30,abstract class和interface有什麼區別?

聲明方法的存在而不去實現它的類被叫做抽象類(abstract class),它用於要創建一個體現某些基本行為的類,並為該類聲明方法,但不能在該類中實現該類的情況。不能創建abstract 類的實例。然而可以創建一個變數,其類型是一個抽象類,並讓它指向具體子類的一個實例。不能有抽象構造函數或抽象靜態方法。Abstract 類的子類為它們父類中的所有抽象方法提供實現,否則它們也是抽象類為。取而代之,在子類中實現該方法。知道其行為的其它類可以在類中實現這些方法。

介面(interface)是抽象類的變體。在介面中,所有方法都是抽象的。多繼承性可通過實現這樣的介面而獲得。介面中的所有方法都是抽象的,沒有一個有程序體。介面只可以定義static final成員變數。介面的實現與子類相似,除了該實現類不能從介面定義中繼承行為。當類實現特殊介面時,它定義(即將程序體給予)所有這種介面的方法。然後,它可以在實現了該介面的類的任何對象上調用介面的方法。由於有抽象類,它允許使用介面名作為引用變數的類型。通常的動態聯編將生效。引用可以轉換到介面類型或從介面類型轉換,instanceof 運算符可以用來決定某對象的類是否實現了介面。

31,abstract的method是否可同時是static,是否可同時是native,是否可同時是synchronized?

都不能

32,介面是否可繼承介面? 抽象類是否可實現(implements)介面? 抽象類是否可繼承實體類(concrete class)?

介面可以繼承介面。抽象類可以實現(implements)介面,抽象類是否可繼承實體類,但前提是實體類必須有明確的構造函數。

33,啟動一個線程是用run()還是start()?

啟動一個線程是調用start()方法,使線程所代表的虛擬處理機處於可運行狀態,這意味著它可以由JVM調度並執行。這並不意味著線程就會立即運行。run()方法可以產生必須退出的標志來停止一個線程。

34,構造器Constructor是否可被override?

構造器Constructor不能被繼承,因此不能重寫Overriding,但可以被重載Overloading。

35,是否可以繼承String類?

String類是final類故不可以繼承。

36,當一個線程進入一個對象的一個synchronized方法後,其它線程是否可進入此對象的其它方法?

不能,一個對象的一個synchronized方法只能由一個線程訪問。

37,try {}里有一個return語句,那麼緊跟在這個try後的finally {}里的code會不會被執行,什麼時候被執行,在return前還是後?

會執行,在return前執行。

38,編程題: 用最有效率的方法算出2乘以8等於幾?

有C背景的程序員特別喜歡問這種問題。

2 << 3

39,兩個對象值相同(x.equals(y) == true),但卻可有不同的hash code,這句話對不對?

不對,有相同的hash code。

40,當一個對象被當作參數傳遞到一個方法後,此方法可改變這個對象的屬性,並可返回變化後的結果,那麼這里到底是值傳遞還是引用傳遞?

是值傳遞。Java 編程語言只由值傳遞參數。當一個對象實例作為一個參數被傳遞到方法中時,參數的值就是對該對象的引用。對象的內容可以在被調用的方法中改變,但對象的引用是永遠不會改變的。

41,swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?

switch(expr1)中,expr1是一個整數表達式。因此傳遞給 switch 和 case 語句的參數應該是 int、 short、 char 或者 byte。long,string 都不能作用於swtich。

42,編程題: 寫一個Singleton出來。

Singleton模式主要作用是保證在Java應用程序中,一個類Class只有一個實例存在。

一般Singleton模式通常有幾種種形式:

第一種形式:定義一個類,它的構造函數為private的,它有一個static的private的該類變數,在類初始化時實例話,通過一個public的getInstance方法獲取對它的引用,繼而調用其中的方法。

public class Singleton {

private Singleton(){}

//在自己內部定義自己一個實例,是不是很奇怪?

//注意這是private 只供內部調用

private static Singleton instance = new Singleton();

//這里提供了一個供外部訪問本class的靜態方法,可以直接訪問

public static Singleton getInstance() {

return instance;

}

}

第二種形式:

public class Singleton {

private static Singleton instance = null;

public static synchronized Singleton getInstance() {

//這個方法比上面有所改進,不用每次都進行生成對象,只是第一次

//使用時生成實例,提高了效率!

if (instance==null)

instance=new Singleton();

return instance; }

}

其他形式:

定義一個類,它的構造函數為private的,所有方法為static的。

一般認為第一種形式要更加安全些

Hashtable和HashMap

Hashtable繼承自Dictionary類,而HashMap是Java1.2引進的Map interface的一個實現

HashMap允許將null作為一個entry的key或者value,而Hashtable不允許

還有就是,HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因為contains方法容易讓人引起誤解。

最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在

多個線程訪問Hashtable時,不需要自己為它的方法實現同步,而HashMap

就必須為之提供外同步。

Hashtable和HashMap採用的hash/rehash演算法都大概一樣,所以性能不會有很大的差異。

43.描述一下JVM載入class文件的原理機制?

44.試舉例說明一個典型的垃圾回收演算法?

45.請用java寫二*樹演算法,實現添加數據形成二*樹功能,並以先序的方式列印出來.

46.請寫一個java程序實現線程連接池功能?

47.給定一個C語言函數,要求實現在java類中進行調用。

48、編一段代碼,實現在控制台輸入一組數字後,排序後在控制台輸出;

49、列出某文件夾下的所有文件;

50、調用系統命令實現刪除文件的操作;

51、實現從文件中一次讀出一個字元的操作;

52、列出一些控制流程的方法;

53、多線程有哪些狀態?

54、編寫了一個伺服器端的程序實現在客戶端輸入字元然後在控制台上顯示,直到輸入"END"為止,讓你寫出客戶端的程序;

55、作用域public,private,protected,以及不寫時的區別

答:區別如下:

作用域 當前類 同一package 子孫類 其他package

public √ √ √ √

protected √ √ √ ×

friendly √ √ × ×

private √ × × ×

不寫時默認為friendly

56、ArrayList和Vector的區別,HashMap和Hashtable的區別

答:就ArrayList與Vector主要從二方面來說.

一.同步性:Vector是線程安全的,也就是說是同步的,而ArrayList是線程序不安全的,不是同步的

二.數據增長:當需要增長時,Vector默認增長為原來一培,而ArrayList卻是原來的一半

就HashMap與HashTable主要從三方面來說。

一.歷史原因:Hashtable是基於陳舊的Dictionary類的,HashMap是Java 1.2引進的Map介面的一個實現

二.同步性:Hashtable是線程安全的,也就是說是同步的,而HashMap是線程序不安全的,不是同步的

三.值:只有HashMap可以讓你將空值作為一個表的條目的key或value

57、char型變數中能不能存貯一個中文漢字?為什麼?

答:是能夠定義成為一個中文的,因為java中以unicode編碼,一個char佔16個位元組,所以放一個中文是沒問題的

Ⅳ java編程程序員技術面試常見面試

隨著互聯網的不斷發展,java開發成為了眾多開發工程師使用的主流編程開發語言。今天,java課程培訓機構就一起來了解一下,在java程序員面試過程中,有哪些比較常見的技術面試問題需要我們了解。



1、什麼是線程?


線程是操作系統能夠進行運算調度的小單位,它被包含在進程之中,是進程中的實際運作單位。程序員可以通過它進行多處理器編程,你可以使用多線程對運算歲散密集型任務提速。比如,如果一個線程完成一個任務要100毫秒,那麼用十個線程完成改任務只需10毫秒。


2、線程和進程有什麼區別?


線程是進程的子集,一個進程可以有很多線程,每條線程並行執行不同的任務。不同的進程使用不同的內存空間,而所有的線程共享一片相同的內存空間。每個線程都擁有單獨的棧內存用來存儲本地數據。


3、如何在Java中實現線程?


兩種方式:java.lang.Thread類的實例就是一個線程但是它需要調用java.lang.Runnable介面來執行,由於線程類本身就是調用的Runnable介面所以你可以繼承java.lang.Thread類或者直接調用Runnable介面來重寫run()方法實現線程。


4、有哪些不同的線程生命周期?


當我們在Java程序中新建一個線程時,它的狀態是New。當我們調用線程的start()方法時,狀態被改變為Runnable。線程調度器會為Runnable線程池中的線程分配CPU時間並且講它們的狀態改變為Running。其他的線程狀態還有Waiting,Blocked和Dead。


5、你對線程優先順序的理解是什麼?


每一個線程都是有優先順序的,一般來說,高優先順序的線程在運行時會具有優先權,但這依賴於線程調度的實現,這弊雀飢個實現是和操作系統相關的(OSdependent)。我們可以定義線程的優先順序,但是這並不能保證高優先順序的線程會在低優先順序的線程前執行。線程優先順序是一個int變數(從1-10),1代表低優先順序,10代表高優先順序。


6、什麼是死鎖(Deadlock)?如何分析和避免死鎖?


死鎖是指兩個以上的線程永遠阻塞的情況,這種情況產生至少需要兩個以上的線程和兩個以上的資源。


分析死鎖,我們需要查看Java應用程序的線程轉儲。我們需要找出那些狀態為BLOCKED的線程和他們等待的資源。每個資源都有一個唯一的id,租返用這個id我們可以找出哪些線程已經擁有了它的對象鎖。


Ⅳ 2022年Python技術類面試題總結(面試題+答案解析)

這是一位有著五年 Python 經驗的好友最近對 Python 崗位面試後的一篇經驗總結,從 Python 就業方向到 Python 面試題。

Python 就業方向

下面是 Python 面試知識點,總結了華為、阿里巴巴等互聯網公司 Python 常問面試題。每道題都提供參考答案,希望能夠幫助你在求職面試中脫穎而出,找到一份高薪工作。

這些面試題分為 Python 基礎和 Python高級,內容包含: 基礎語法、文件操作、模塊與包、數據類型、元類、內存管理與垃圾回收機制以及 Python 函數 等知識點。

(一) Python 基礎語法

(二) 文件操作

(三) 模塊與包

(四) 數據類型

(五)企業面試題

(一) 元類

(二)內存管理與垃圾回收機制

(三)函數

(四) 面向對象

由於篇幅有限,這份 Python 面試寶典已經被整理成了PDF文檔,有需要 Python 面試寶典全套完整文檔(面試題+答案解析)的可以 免費領取!

Ⅵ 精選程序員面試常問的邏輯題

大家在面試的時候,難免會遇到讓人摸不著頭腦的邏輯題,這類題目讓同學們往往連答案應該回答些什麼都摸不清楚,只能和面試官四目相對,非常尷尬。

其實,很多面試的考官,都是從題庫隨機挑選邏輯題來考驗同學們,面試官有時候自己也未必完全摸透這類題目,所以面試的時候不必過於緊張,就算答不出來啊也非常正常。

在我的理解中,這類題目主要還是考大家的思路,至於答案標准與否,其實不是特別重要。

本文總結了面試中我自己面試中遇到的幾道非常常見的邏輯題,大家可以作為面試前的突擊復習材料。

一群人開舞會,每人頭上都戴著一頂帽子。帽子只有黑白兩種,黑的至少有一頂。每個人都能看到其它人帽子的顏色,卻看不到自己的。主持人先讓大家看看別人頭上戴的是什麼帽子,然後關燈,如果有人認為自己戴的是黑帽子,就打自己一個耳光。第一次關燈,沒有聲音。於是再開燈,大家再看一遍,關燈時仍然鴉雀無聲。一直到第三次關燈,才有劈劈啪啪打耳光的聲音響起。問有多少人戴著黑帽子?

三個人

若是兩個人,設A、B是黑帽子,第二次關燈就會有人打耳光。原因是A看到B第一次沒打耳光,就知道B也一定看到了有帶黑帽子的人,可A除了知道B帶黑帽子外,其他人都是白帽子,就可推出他自己是帶黑帽子的人!同理B也是這么想的,這樣第二次熄燈會有兩個耳光的聲音。

如果是三個人,A,B,C。A第一次沒打耳光,因為他看到B,C都是帶黑帽子的;而且假設自己帶的是白帽子,這樣只有BC戴的是黑帽子;按照只有兩個人帶黑帽子的推論,第二次應該有人打耳光;可第二次卻沒有...於是他知道B和C一定看到了除BC之外的其他人帶了黑帽子,於是他知道BC看到的那個人一定是他,所以第三次有三個人打了自己一個耳光

N個人是黑帽子,就會在第N天,有N個人打自己一個耳光。

一個是兩種葯片,每種有兩個,一個人需要早上吃兩種葯片各一個,現在這四個葯片混在一起了這個人什麼方法吃。

把所有的4顆葯丸都切開成相等的兩半,然後早上和晚上,分別吃掉每顆葯丸的一半

一個5L,一個6L的瓶子,要得到3L的水,問什麼方法

6-5=1 1L水放在5L那個瓶裡面,然後再裝6L水,往5L(裡面已經有1L)裡面倒,這樣就會剩下2L水在6L裡面,再把2L水放在5L裡面,再裝一次,不就可以6L那裡到處3L水到5L裡面,自己就剩下3L了

一共1000瓶酒,其中一瓶有毒。如果一隻老鼠喝了有毒的酒,會在一天之後死亡,那麼如果給你一天時間,然你判定哪瓶酒有毒,至少需要幾只老鼠?

答案是10隻。這個需要使用二進制編碼來解決,1000瓶酒至少需要10位二進制數來進行編碼。然後取十隻杯子分別代表這是個二進制數的十個位,分別將1000瓶酒倒入其編碼為1的對應的杯子中。取十個老鼠分別喝十個杯子中的酒,一天之後,就可以根據喝哪些杯子的老鼠死掉來確定出有毒的那瓶酒的編碼,從而確定哪瓶酒有毒。其根據就是只有有毒酒的編碼對應的毒死老鼠的杯子位置。這個題目就是利用了二進制編碼的一些特性。

還有一些其他的題目也使用這些特性,比如使用特殊的位運算,一般使用比較多的位運算就是與、或和異或。
這樣,就可以對應到現實生活中的一些為題,比如一個類似的問題原本我們想需要用900多台伺服器來解決,經過這樣分析後就可以使用10台伺服器來解決,大大節約了成本。

再比如,國王有10000桶酒,已知一桶酒有毒,喝了之後一定會在23-24小時內死亡(例如0點喝,會在23-第二天0點這個時間段死亡)。現在國王要在48小時後舉辦一個宴會,需要用罪犯實驗,請問最少幾個罪犯。(可以混合酒)

如果是常規利用二進制解題的話,那就需要14個犯人,2^14=16384>10000,但是這樣一來死亡時間這個條件就用不到,也不是最優解。

應該利用酒死的時間是固定的,一個罪犯像上面那樣可以表示成25種狀態,三個罪犯就可以表示25 x 25 x25種狀態,超過10000了,所以只需要三個罪犯。

有8個小球,其中七個的重量是相同的,有一個較輕。給你一個天平,問秤幾次能找出那個較輕的小球,若天平只能秤兩次,又該怎麼秤

第一次兩邊各放隨機三個,如果平了,則另外一個是輕的,若不平,還有第二次,拿出那三個輕的,在兩邊隨機放一個,就能測出哪個最輕了。

本體圖解參考:

https://blog.csdn.net/hinyunsin/article/details/6632062

已知: 每個飛機只有一個油箱,飛機之間可以相互加油(注意是相互,沒有單獨的加油機),一箱油可供一架飛機繞地球飛半圈

問題:為使至少一架飛機繞地球一圈回到起飛時的飛機場,至少需要出動幾架飛機?(所有飛機從同一機場起飛,而且必須安全返回機場,不允許中途降落,中間沒有飛機場)

分為3架飛機5架次和3架飛機6架次

1. 3架飛機6架次

(上圖)ABC 3架同時起飛

(上圖)1/8處,C給AB加滿油,C返航。此時飛機的油量分別是:A: 3/4, B: 3/4, C: 3/4。此時C分別給A和B加滿油,三架飛機當前油量分別是:A: 1, B: 1, C: 1/4。C返回機場。A、B繼續向前飛行。

(上圖)1/4處,B給A加滿油,B返航,A到達1/2處,此時C已經返回機場,三家飛機此時油量分別是:A: 3/4, B: 3/4, C: 0。此時B給A加滿油,C加滿油,此時三架飛機的油量分別是:A: 1, B: 1/2, C: 1。然後B返回機場,A繼續向前飛行。

(上圖)當A飛行至半圈位置時,B已經返回機場並且加滿了油(假設加油時間為0),此時,B和C沿逆時針方向飛行,三架飛機當前油量分別是:A: 1/2, B: 1, C: 1。A繼續向前飛行。

(上圖)當A飛行至另外半圈的1/4位置時,三架飛機剩餘油量分別是:A: 1/4, B: 3/4, C: 3/4。此時,C給B加滿油。此時三架飛機油量分別是:A: 1/4, B: 1, C: 1/2。C返回機場,B和A繼續向前飛行。

當A飛行至另外半圈的1/2位置時,C已經返回機場,A和B相遇,此時三架飛機剩餘油量分別是:A: 0, B: 3/4, C: 0。B給A加1/4的油,三架飛機剩餘油量:A: 1/4, B: 1/2, C: 1。C加滿油從機場逆時針飛出,B返回機場,A繼續向前飛行。

(上圖)當A飛行至另外半圈的3/4位置時,A和C相遇。此時三架飛機的油量分別是:A: 0, B: 1/4, C: 3/4。C給A加1/4的油,此時三架飛機的油量分別是:A: 1/4, B: 1/4, C: 1/2。C掉頭返回機場,A和B繼續向前飛行。

(上圖)三架飛機順利回到機場!

2. 3飛機5架次

(1)3 架飛機同時從機場出發,飛行八分之一周(A點),各耗油四分之一。此時某架飛機給其餘兩架補滿油,自己返回基地;

(2)另一架飛機和目標機結伴,飛至四分之一周(B點),給目標機補滿油,自己返回;

(3)目標機獨自飛行半周(C點);

(4)與從基地反向出發的一架飛機相遇,2 機將油平分,飛至最後八分之一處(D點);

(5)與從基地反向出發的另一機相遇,各分四分之一油,返回。

75道程序員面試邏輯題和答案

https://blog.csdn.net/qq_38361726/article/details/79824632

Ⅶ 程序員面試筆試寶典的目錄

前言
上篇 面試筆試經驗技巧篇
第1章 面試官箴言 2
1.1 有道無術,術可求;有術無道,止於術 2
1.2 求精不求全 3
1.3 腳踏實地,培養多種技能 4
1.4 保持空杯心態 6
1.5 職場是能者的舞台 7
1.6 學會「紙上談兵」 8
1.7 小結 8
第2章 面試心得交流 9
2.1 心態決定一切 9
2.2 假話全不說,真話不全說 10
2.3 走自己的路,讓別人去說吧 12
2.4 夯實基礎謀出路 14
2.5 書中自有編程法 15
2.6 筆試成績好,不會被鄙視 17
2.7 不要一廂情願做公司的備胎 18
2.8 小結 19
第3章 企業面試筆試攻略 20
3.1 互聯網企業 20
3.2 網路設備提供商 25
3.3 外企 29
3.4 國企 32
3.5 研究所 35
3.6 創業型企業 37
3.7 如何抉擇 41
第4章 面試筆試技巧 42
4.1 不打無准備之仗 42
4.1.1 如何獲取求職信息 42
4.1.2 如何製作一份受用人單位青睞的簡歷 43
4.1.3 如何高效地網申簡歷 47
4.1.4 面試考查什麼內容 48
4.1.5 霸王面合適嗎 50
4.1.6 非技術類筆試如何應答 50
4.1.7 什麼是職場暗語 51
4.1.8 如何克服面試中的緊張情緒 54
4.1.9 面試禮儀有哪些 55
4.1.10 面試需要准備什麼內容 56
4.1.11 女生適合做程序員嗎 57
4.1.12 程序員是吃青春飯的嗎 58
4.1.13 為什麼會被企業拒絕 58
4.1.14 如何准備集體面試 59
4.1.15 如何准備電話面試 61
4.2 從容應對 62
4.2.1 如何進行自我介紹 63
4.2.2 你對我們公司有什麼了解 64
4.2.3 如何應對自己不會回答的問題 65
4.2.4 如何應對面試官的「激將法」語言 65
4.2.5 如何處理與面試官持不同觀點的問題 66
4.2.6 如果你在這次面試中沒有被錄用,你會怎麼辦 66
4.2.7 如果你被我們錄取了,接下來你將如何開展工作 66
4.2.8 你怎麼理解你應聘的職位 67
4.2.9 你有哪些缺點 67
4.2.10 你有哪些優點 68
4.2.11 你沒有工作經驗,如何能夠勝任這個崗位 69
4.2.12 你的好朋友是如何評價你的 69
4.2.13 你與上司意見不一致時,該怎麼辦 70
4.2.14 你能說說你的家庭嗎 71
4.2.15 你認為自己最適合做什麼 72
4.2.16 你如何看待公司的加班現象 72
4.2.17 你的業余愛好是什麼 73
4.2.18 你和別人發生過爭執嗎?你怎樣解決 74
4.2.19 你如何面對壓力 74
4.2.20 你為什麼離開了原來的單位 75
4.2.21 你為什麼更傾向於我們公司 75
4.2.22 你覺得我們為什麼要錄用你 76
4.2.23 你的職業規劃是什麼 76
4.2.24 你對薪資有什麼要求 77
4.2.25 你有什麼需要問我的問題嗎 77
4.3 簽約這點事 78
4.3.1 風蕭蕭兮易水寒,offer多了怎麼辦 78
4.3.2 簽約、違約需要注意哪些事項 78
4.4 小結 81
第5章 英文面試攻略 82
5.1 注意事項 82
5.2 英文自我介紹 83
5.3 常見的英文面試問題 85
5.4 常見計算機專業詞彙 94
5.4.1 計算機專業相關課程 94
5.4.2 操作系統相關術語 95
5.4.3 演算法相關術語 96
5.4.4 數據結構相關術語 97
5.4.5 計算機網路相關術語 100
第6章 智力題攻略 102
6.1 推理類 102
6.2 博弈類 107
6.3 計算類 109
6.4 作圖類 111
6.5 倒水類 112
6.6 稱重類 113
6.7 最優化類 114
6.8 IT思想類 115
6.9 過橋類 118
6.10 概率類 119
下篇 面試筆試技術攻克篇
第7章 程序設計基礎 122
7.1 C/C++關鍵字 122
7.1.1 static(靜態)變數有什麼作用 122
7.1.2 const有哪些作用 124
7.1.3 switch語句中的case結尾是否必須添加break語句?為什麼 127
7.1.4 volatile在程序設計中有什麼作用 128
7.1.5 斷言ASSERT( )是什麼 129
7.1.6 枚舉變數的值如何計算 130
7.1.7 char str1[] = abc; char str2[] = abc; str1與str2不相等,為什麼 130
7.1.8 為什麼有時候main( )函數會帶參數?參數argc與argv的含義是什麼 131
7.1.9 C++裡面是不是所有的動作都是main( )函數引起的 132
7.1.10 *p++與(*p)++等價嗎?為什麼 132
7.1.11 前置運算與後置運算有什麼區別 132
7.1.12 a是變數,執行(a++) += a語句是否合法 133
7.1.13 如何進行float、bool、int、指針變數與「零值」的比較 134
7.1.14 new/delete與malloc/free的區別是什麼 135
7.1.15 什麼時候需要將引用作為返回值 137
7.1.16 變數名為618Software是否合法 137
7.1.17 C語言中,整型變數x小於0,是否可知x×2也小於0 138
7.1.18 exit(status)是否跟從main( )函數返回的status等價 138
7.1.19 已知String類定義,如何實現其函數體 138
7.1.20 在C++中如何實現模板函數的外部調用 140
7.1.21 在C++中,關鍵字explicit有什麼作用 140
7.1.22 C++中異常的處理方法以及使用了哪些關鍵字 141
7.1.23 如何定義和實現一個類的成員函數為回調函數 141
7.2 內存分配 142
7.2.1 內存分配的形式有哪些 142
7.2.2 什麼是內存泄露 143
7.2.3 棧空間的最大值是多少 144
7.2.4 什麼是緩沖區溢出 144
7.3 sizeof 146
7.3.1 sizeof是關鍵字嗎 146
7.3.2 strlen()=?sizeof()=? 146
7.3.3 對於結構體而言,為什麼sizeof返回的值一般大於期望值 148
7.3.4 指針進行強制類型轉換後與地址進行加法運算,結果是什麼 149
7.4 指針 150
7.4.1 使用指針有哪些好處 150
7.4.2 引用還是指針 150
7.4.3 指針和數組是否表示同一概念 152
7.4.4 指針是否可進行>、<、>=、<=、==運算 152
7.4.5 指針與數字相加的結果是什麼 152
7.4.6 野指針?空指針 153
7.5 預處理 154
7.5.1 C/C++頭文件中的ifndef/define/endif的作用有哪些 154
7.5.2 #include <filename.h>和#include 「filename.h」 有什麼區別 155
7.5.3 #define有哪些缺陷 155
7.5.4 如何使用define 聲明一個常數,用以表明1年中有多少秒(忽略閏年問題) 155
7.5.5 含參數的宏與函數有什麼區別 156
7.5.6 宏定義平方運算#define SQR(X) X*X是否正確 156
7.5.7 不能使用大於、小於、if語句,如何定義一個宏來比較兩個數a、b的大小 157
7.5.8 如何判斷一個變數是有符號數還是無符號數 158
7.5.9 #define TRACE(S) (printf(%s , #S), S)是什麼意思 159
7.5.10 不使用sizeof,如何求int佔用的位元組數 160
7.5.11 如何使用宏求結構體的內存偏移地址 161
7.5.12 如何用sizeof判斷數組中有多少個元素 162
7.5.13 枚舉和define有什麼不同 162
7.5.14 typdef和define有什麼區別 162
7.5.15 C++中宏定義與內聯函數有什麼區別 164
7.5.16 定義常量誰更好?#define還是const 164
7.6 結構體與類 165
7.6.1 C語言中struct與union的區別是什麼 165
7.6.2 C和C++中struct的區別是什麼 165
7.6.3 C++中struct與class的區別是什麼 166
7.7 位操作 166
7.7.1 一些結構聲明中的冒號和數字是什麼意思 166
7.7.2 最有效的計算2乘以8的方法是什麼 167
7.7.3 如何實現位操作求兩個數的平均值 167
7.7.4 unsigned int i=3;printf(%u ,i*-1)輸出為多少 168
7.7.5 如何求解整型數的二進製表示中1的個數 169
7.7.6 不能用sizeof( )函數,如何判斷操作系統是16位還是32位的 170
7.7.7 嵌入式編程中,什麼是大端?什麼是小端 171
7.7.8 考慮n位二進制數,有多少個數中不存在兩個相鄰的1 174
7.7.9 不用除法操作符如何實現兩個正整數的除法 175
7.8 函數 179
7.8.1 怎麼樣寫一個接受可變參數的函數 179
7.8.2 函數指針與指針函數有什麼區別 179
7.8.3 C++函數傳遞參數的方式有哪些 183
7.8.4 重載與覆蓋有什麼區別 185
7.8.5 是否可以通過絕對內存地址進行參數賦值與函數調用 188
7.8.6 默認構造函數是否可以調用單參數構造函數 190
7.8.7 C++中函數調用有哪幾種方式 191
7.8.8 什麼是可重入函數?C語言中如何寫可重入函數 192
7.9 數組 192
7.9.1 int a[2][2]={{1},{2,3}},則a[0][1]的值是多少 192
7.9.2 如何合法表示二維數組 193
7.9.3 a是數組,(int*)(&a+1)表示什麼意思 193
7.9.4 不使用流程式控制制語句,如何列印出1~1000的整數 194
7.9.5 char str[1024]; scanf(%s,str)是否安全 197
7.9.6 行存儲與列存儲中哪種存儲效率高 197
7.10 變數 197
7.10.1 全局變數和靜態變數有什麼異同 197
7.10.2 局部變數需要「避諱」全局變數嗎 199
7.10.3 如何建立和理解非常復雜的聲明 199
7.10.4 變數定義與變數聲明有什麼區別 200
7.10.5 不使用第三方變數,如何交換兩個變數的值 201
7.10.6 C與C++變數初始化有什麼不同 202
7.11 字元串 202
7.11.1 不使用C/C++字元串庫函數,如何自行編寫strcpy( )函數 203
7.11.2 如何把數字轉換成字元串 205
7.11.3 如何自定義內存復制函數memcpy( ) 206
7.12 編譯 207
7.12.1 編譯和鏈接的區別是什麼 207
7.12.2 編譯型語言與解釋型語言的區別是什麼 208
7.12.3 如何判斷一段程序是由C編譯程序還是由C++編譯程序編譯的 208
7.12.4 在C++程序中調用被C編譯器編譯後的函數,為什麼要加extern 「C」 209
7.12.5 兩段代碼共存於一個文件,編譯時有選擇地編譯其中的一部分,如何實現 210
7.13 面向對象相關 210
7.13.1 面向對象與面向過程有什麼區別 210
7.13.2 面向對象的基本特徵有哪些 211
7.13.3 什麼是深復制?什麼是淺復制 212
7.13.4 什麼是友元 213
7.13.5 復制構造函數與賦值運算符的區別是什麼 214
7.13.6 基類的構造函數/析構函數是否能被派生類繼承 216
7.13.7 初始化列表和構造函數初始化的區別是什麼 216
7.13.8 類的成員變數的初始化順序是按照聲明順序嗎 217
7.13.9 當一個類為另一個類的成員變數時,如何對其進行初始化 217
7.13.10 C++能設計實現一個不能被繼承的類嗎 218
7.13.11 構造函數沒有返回值,那麼如何得知對象是否構造成功 219
7.13.12 C++中的空類默認產生哪些成員函數 219
7.13.13 如何設置類的構造函數的可見性 219
7.13.14 public繼承、protected繼承、private繼承的區別是什麼 220
7.13.15 C++提供默認參數的函數嗎 221
7.13.16 C++中有哪些情況只能用初始化列表而不能用賦值 222
7.14 虛函數 223
7.14.1 什麼是虛函數 223
7.14.2 C++如何實現多態 225
7.14.3 C++中繼承、虛函數、純虛函數分別指的是什麼 226
7.14.4 C++中的多態種類有哪幾種 226
7.14.5 什麼函數不能聲明為虛函數 227
7.14.6 是否可以把每個函數都聲明為虛函數 229
7.14.7 C++中如何阻止一個類被實例化 229
7.15 編程技巧 229
7.15.1 當while( )的循環條件是賦值語句時會出現什麼情況 229
7.15.2 不使用if/:?/switch及其他判斷語句如何找出兩個int型變數中的最大值和最小值 230
7.15.3 C語言獲取文件大小的函數是什麼 231
7.15.4 表達式a>b>c是什麼意思 231
7.15.5 如何列印自身代碼 232
7.15.6 如何實現一個最簡單病毒 232
7.15.7 如何只使用一條語句實現x是否為2的若干次冪的判斷 233
7.15.8 如何定義一對相互引用的結構 233
7.15.9 什麼是逗號表達式 234
7.15.10 是否與 等價 235
7.15.11 什麼是短路求值 235
7.15.12 已知隨機數函數rand7( ),如何構造rand10( )函數 236
7.15.13 printf(%p ,(void *)x)與printf (%p ,&x)有何區別 237
7.15.14 printf( )函數是否有返回值 237
7.15.15 不能使用任何變數,如何實現計算字元串長度函數Strlen( ) 237
7.15.16 負數除法與正數除法的運算原理是否一樣 238
7.15.17 main( )主函數執行完畢後,是否可能會再執行一段代碼 238
第8章 資料庫 240
8.1 資料庫概念 240
8.1.1 關系資料庫系統與文件資料庫系統有什麼區別 240
8.1.2 SQL語言的功能有哪些 240
8.1.3 內連接與外連接有什麼區別 242
8.1.4 什麼是事務 243
8.1.5 什麼是存儲過程?它與函數有什麼區別與聯系 244
8.1.6 什麼是主鍵?什麼是外鍵 244
8.1.7 什麼是死鎖 245
8.1.8 什麼是共享鎖?什麼是互斥鎖 245
8.1.9 一二三四範式有何區別 246
8.1.10 如何取出表中指定區間的記錄 247
8.1.11 什麼是CHECK約束 247
8.1.12 什麼是視圖 247
8.2 SQL高級應用 248
8.2.1 什麼是觸發器 248
8.2.2 什麼是索引 249
8.2.3 什麼是回滾 250
8.2.4 數據備份有哪些種類 251
8.2.5 什麼是游標 251
8.2.6 並發環境下如何保證數據的一致性 252
8.2.7 如果資料庫日誌滿了,會出現什麼情況 252
8.2.8 如何判斷誰往資料庫中插入了一行數據 252
第9章 網路與通信 254
9.1 網路模型 254
9.1.1 OSI七層模型是什麼 254
9.1.2 TCP/IP模型是什麼 255
9.1.3 B/S與C/S有什麼區別 255
9.1.4 MVC模型結構是什麼 256
9.2 網路設備 258
9.2.1 交換機與路由器有什麼區別 258
9.2.2 路由表的功能有哪些 259
9.3 網路協議 260
9.3.1 TCP和UDP的區別有哪些 260
9.3.2 什麼叫三次握手?什麼叫四次斷開 260
9.3.3 什麼是ARP/RARP 262
9.3.4 IP Phone的原理是什麼?都用了哪些協議 263
9.3.5 Ping命令是什麼 263
9.3.6 基本的HTTP流程有哪些 264
9.4 網路編程 264
9.4.1 如何使用Socket編程 264
9.4.2 阻塞模式和非阻塞模式有什麼區別 265
9.5 網路其他問題 266
9.5.1 常用的網路安全防護措施有哪些 266
9.5.2 什麼是SQL注入式攻擊 267
9.5.3 電路交換技術、報文交換技術和分組交換技術有什麼區別 268
9.5.4 相比IPv4,IPv6有什麼優點 269
第10章 操作系統 270
10.1 進程管理 270
10.1.1 進程與線程有什麼區別 270
10.1.2 線程同步有哪些機制 271
10.1.3 內核線程和用戶線程的區別 271
10.2 內存管理 272
10.2.1 內存管理有哪幾種方式 272
10.2.2 分段和分頁的區別是什麼 272
10.2.3 什麼是虛擬內存 272
10.2.4 什麼是內存碎片?什麼是內碎片?什麼是外碎片 273
10.2.5 虛擬地址、邏輯地址、線性地址、物理地址有什麼區別 273
10.2.6 Cache替換演算法有哪些 274
10.3 用戶編程介面 275
10.3.1 庫函數與系統調用有什麼不同 275
10.3.2 靜態鏈接與動態鏈接有什麼區別 276
10.3.3 靜態鏈接庫與動態鏈接庫有什麼區別 276
10.3.4 用戶態和核心態有什麼區別 276
10.3.5 用戶棧與內核棧有什麼區別 277
第11章 軟體工程 278
11.1 軟體工程過程與方法 278
11.1.1 軟體工程過程有哪些 278
11.1.2 常見的軟體開發過程模型有哪些 279
11.1.3 什麼是敏捷開發 283
11.1.4 UML中一般有哪些圖 285
11.2 軟體工程思想 285
11.2.1 什麼是軟體配置管理 285
11.2.2 什麼是CMMI 286
11.2.3 如何提高軟體質量 287
第12章 發散思維 289
12.1 設計模式 289
12.1.1 什麼是單例模式 289
12.1.2 什麼是工廠模式 290
12.1.3 什麼是適配器模式 290
12.1.4 什麼是享元模式 291
12.1.5 什麼是觀察者模式 291
12.2 新技術 291
12.2.1 什麼是雲計算 291
12.2.2 什麼是物聯網 292
12.2.3 你平時讀的專業書籍有哪些 293
第13章 數據結構與演算法 295
13.1 數組 295
13.1.1 如何用遞歸實現數組求和 295
13.1.2 如何用一個for循環列印出一個二維數組 296
13.1.3 在順序表中插入和刪除一個結點平均移動多少個結點 297
13.1.4 如何用遞歸演算法判斷一個數組是否是遞增 297
13.1.5 如何分別使用遞歸與非遞歸實現二分查找演算法 298
13.1.6 如何在排序數組中,找出給定數字出現的次數 299
13.1.7 如何計算兩個有序整型數組的交集 300
13.1.8 如何找出數組中重復次數最多的數 301
13.1.9 如何在O(n)的時間復雜度內找出數組中出現次數超過了一半的數 303
13.1.10 如何找出數組中唯一的重復元素 305
13.1.11 如何判斷一個數組中的數值是否連續相鄰 308
13.1.12 如何找出數組中出現奇數次的元素 309
13.1.13 如何找出數列中符合條件的數對的個數 311
13.1.14 如何尋找出數列中缺失的數 313
13.1.15 如何判定數組是否存在重復元素 314
13.1.16 如何重新排列數組使得數組左邊為奇數,右邊為偶數 315
13.1.17 如何把一個整型數組中重復的數字去掉 316
13.1.18 如何找出一個數組中第二大的數 318
13.1.19 如何尋找數組中的最小值和最大值 319
13.1.20 如何將數組的後面m個數移動為前面m個數 320
13.1.21 如何計算出序列的前n項數據 321
13.1.22 如何找出數組中只出現一次的數字 322
13.1.23 如何判斷一個整數x是否可以表示成n(n≥2)個連續正整數的和 324
13.2 鏈表 325
13.2.1 數組和鏈表的區別是什麼 325
13.2.2 何時選擇順序表、何時選擇鏈表作為線性表的存儲結構為宜 325
13.2.3 如何使用鏈表頭 326
13.2.4 如何實現單鏈表的插入、刪除操作 327
13.2.5 如何找出單鏈表中的倒數第k個元素 328
13.2.6 如何實現單鏈表反轉 329
13.2.7 如何從尾到頭輸出單鏈表 331
13.2.8 如何尋找單鏈表的中間結點 331
13.2.9 如何進行單鏈表排序 332
13.2.10 如何實現單鏈表交換任意兩個元素(不包括表頭) 334
13.2.11 如何檢測一個較大的單鏈表是否有環 335
13.2.12 如何判斷兩個單鏈表(無環)是否交叉 337
13.2.13 如何刪除單鏈表中的重復結點 338
13.2.14 如何合並兩個有序鏈表(非交叉) 339
13.2.15 什麼是循環鏈表 340
13.2.16 如何實現雙向鏈表的插入、刪除操作 342
13.2.17 為什麼在單循環鏈表中設置尾指針比設置頭指針更好 343
13.2.18 如何刪除結點的前驅結點 343
13.2.19 如何實現雙向循環鏈表的刪除與插入操作 343
13.2.20 如何在不知道頭指針的情況下將結點刪除 344
13.3 字元串 345
13.3.1 如何統計一行字元中有多少個單詞 345
13.3.2 如何將字元串逆序 346
13.3.3 如何找出一個字元串中第一個只出現一次的字元 350
13.3.4 如何輸出字元串的所有組合 351
13.3.5 如何檢查字元是否是整數?如果是,返回其整數值 353
13.3.6 如何查找字元串中每個字元出現的個數 353
13.4 STL容器 354
13.4.1 什麼是泛型編程 354
13.4.2 棧與隊列的區別有哪些 354
13.4.3 vector與list的區別有哪些 355
13.4.4 如何實現循環隊列 355
13.4.5 如何使用兩個棧模擬隊列操作 357
13.5 排序 359
13.5.1 如何進行選擇排序 359
13.5.2 如何進行插入排序 360
13.5.3 如何進行冒泡排序 361
13.5.4 如何進行歸並排序 364
13.5.5 如何進行快速排序 366
13.5.6 如何進行希爾排序 368
13.5.7 如何進行堆排序 369
13.5.8 各種排序演算法有什麼優劣 371
13.6 二叉樹 372
13.6.1 基礎知識 372
13.6.2 如何遞歸實現二叉樹的遍歷 373
13.6.3 已知先序遍歷和中序遍歷,如何求後序遍歷 374
13.6.4 如何非遞歸實現二叉樹的後序遍歷 376
13.6.5 如何使用非遞歸演算法求二叉樹的深度 378
13.6.6 如何判斷兩棵二叉樹是否相等 381
13.6.7 如何判斷二叉樹是否是平衡二叉樹 381
13.6.8 什麼是霍夫曼編解碼 382
13.7 圖 383
13.7.1 什麼是拓撲排序 384
13.7.2 什麼是DFS?什麼是BFS 385
13.7.3 如何求關鍵路徑 386
13.7.4 如何求最短路徑 388
第14章 海量數據處理 390
14.1 問題分析 390
14.2 基本方法 390
14.3 經典實例分析 403
14.3.1 top K問題 403
14.3.2 重復問題 405
14.3.3 排序問題 407
致謝 409

Ⅷ 程序員面試必備PHP基礎面試題 – 第十一天

一、兩張表 city表和province表。分別為城市與省份的關系表。

表名:city
id City Provinceid
1 廣州 1
2 深圳 1
3 惠州 1
4 長沙 2
5 武漢 3
………. 廣州
表名稱:province:
id Province
1 廣東
2 湖南
3 湖北
……….

1、寫一條sql語句關系兩個表,實現:顯示城市的基本信息。顯示欄位:城市id ,城市名, 所屬省份 。
如:
Id(城市id) Cityname(城市名) Privence(所屬省份)

2、如果要統計每個省份有多少個城市,請用group by 查詢出來。顯示欄位:省份id ,省份名,包含多少個城市。

二、主鍵 和外鍵表示什麼?一般用於做什麼?

主鍵:能夠唯一表示數據表中的每個記錄的欄位或者欄位的組合就稱為主鍵。一個主鍵是唯一識別一個表的每一行記錄,但這只是其作用的一療分,主鍵的主要作用是將記錄和存放在其他表中的數據進行關聯,在這一點上,主鍵是不同表中各記錄間的簡單指針,主鍵約整就是確定表中的每一條記錄,主鍵不能是空值,唯一約束是用於指定一個或多個列的組合值具有唯一性,以防止在列中輸入重復的值,所以,主鍵的值對用戶而言是沒有什麼意義,並且和它賦予的值也沒有什麼特別聯系。

外鍵:若有兩個表A,B,C是A的主鍵,而B中也有C欄位,則C就是表B的外鍵,外鍵約束主要用來維護兩個表之間數據的一致性。A為基本表,B為信息表。
在資料庫中,常常不只是一個表,這些表之間也不是相互獨立的,不同的表之間需要建立一種關系,才能將它們的數據相互溝通,而在這個溝通過程中,就需要表中有一個欄位作為標志,不同的記錄對應的欄位取值不能相同,也不能是空白的,通過這個欄位中不同的值可以區別各條記錄,就像我們區別不同的人,每個人都有名字,但它卻不能作為主鍵,因為人名很容易出現重復,而身份證號是每個人都不同的,所以可以根據它來區別不同的人,資料庫的表中作為主鍵的段段就要像人的身份證號一樣,必須是每個記錄的值都不同,這才能根據
主鍵的值來確定不同的記錄。

關系:外鍵一定是另外某個表的主鍵。

三、select now(),Date_ADD(now(),INTERVAL 14 day),Date_SUB(now(),INTERVAL 3 Day) from table; 會獲得什麼內容,請寫出來。

會獲得三條數據:
第一條:當前時間;
第二條:當前時間加上14天;
第三條:當前時間減去3天。

四、您所知道的MYSQL 資料庫備份,還原方式有哪幾種?
備份:
一,搭建主從架構,master-slave,通過binlog文件同步復制主庫的數據,也可以直接通過binlog文件恢復數據。
二,通過系統計劃任務執行mysqlmp做周期性全備份。
三,物理備份,直接拷貝數據文件、參數文件、日誌文件。
還原:
一.通過mysql操作工具,如phpmyadmin,sqlyog等導入備份過的資料庫文件。
二.將物理備份的文件拷貝到mysql的data目錄下

五、內容管理系統中,表message有如下欄位
id 文章id
title 文章標題
content 文章內容
category_id 文章分類id
hits 點擊量
創建上表,寫出MySQL語句

六、同樣上述內容管理系統:表comment記錄用戶回復內容,欄位如下
comment_id 回復id
id 文章id,關聯message表中的id
comment_content 回復內容
現通過查詢資料庫需要得到以下格式的文章標題列表,並按照回復數量排序,回復最高的排在最前面
文章id 文章標題 點擊量 回復數量
用一個SQL語句完成上述查詢,如果文章沒有回復則回復數量顯示0

七、內容管理系統,表category保存分類信息,欄位如下
category_id int(4) not null auto_increment;
category_name varchar(40) not null;
用戶輸入文章時,通過選擇下拉菜單選定文章分類
寫出如何實現這個下拉菜單

八、PHP文件操作

1、內容管理系統:用戶提交內容後,系統生成靜態HTML頁面;寫出實現的基本思路

2、簡單描述用戶修改發布內容的實現流程和基本思路

1)當用戶提交後生成一個由url地址MD5後的文件的編譯頁面,用文件處理file函數生成一個模板合成頁,判斷模板編譯頁是否有,模板頁無或者編譯頁的創建時間戳小於模板頁的修改時間都會從新生成編譯頁面,編譯後的頁面會調用對應資料庫的值顯示在頁面中,通過對內存數據的讀取釋放,顯示出我們看到的靜態數據,然後用file文件將其保存起來生成靜態的頁面

2)當用戶修改了發布內容都會修改數據相關的內容,並通過編譯頁面更新靜態數據並用文件的方式緩存起來,當用戶查看時將不做任何資料庫查找,直接調用該緩存文件即可

Ⅸ C++經典面試問題

c++經典面試問題分享

1,關於動態申請內存

答:內存分配方式三種:

(1)從靜態存儲區域分配:內存在程序編譯的時候就已經分配好,這塊內存在程序的整個運行期間都存在。

全局變數,static變數。

(2)在棧上創建:在執行函數時,函數內局部變數的存儲單元都可以在棧上創建,

函數執行結束時這些存儲單元自動被釋凳禪放。

棧內存分配運算內置於處理器的指令集中,效率棗禪塵很高,但是分配的內存容量有限。

(3)用malloc或new申請內存之後,應該立即檢查指針值是否為null.防止使用指針值為null的內存,

不要忘記為數組和動態內存賦初值。防止將未被初始化的內存作為右值使用。避免數組或指針的下標越界,

特別要當心發生“多1”或者“少1”操作。動態內存的申請與釋放必須配對,防止內存泄漏。

用free或delete釋放了內存之後,立即將指針設置為null,防止產生“野指針”。從堆上分配,亦稱動態內存分配。

程序在運行的時候用malloc或new申請任意多少的內存,程序員自己負責在何時用free或delete釋放內存。

動態內存的生存期由程襲攔序員決定,使用非常靈活。(int *parray; int myarray[6]; parray = &myarray[0];)

如果在申請動態內存時找不到足夠大的內存塊,malloc和new將返回null指針,

判斷指針是否為null,如果是則馬上用return語句終止本函數,

或者馬上用exit(1)終止整個程序的運行,為new和malloc設置異常處理函數。

2,c++指針攻破

答案:指針是一個變數,專門存放內存地址,特點是能訪問所指向的內存

指針本身占據了4個位元組的長度

int **ptr; //指針的類型是 int

int (*ptr)[3]; //指針的類型是 int(*)[3]

int *(*ptr)[4]; //指針的類型是 int *(*)[4]

ptr++:指針ptr的值加上了sizeof(int)

ptr+=5:將指針ptr的值加上5*sizeof(int)

指針的賦值:

把一個變數的地址賦予指向相同數據類型的指針變數( int a; int *ip; ip=&a; )

把一個指針變數的值賦予指向相同類型變數的另一個指針變數(int a; int *pa=&a; int *pb; pb=pa; )

把數組的首地址賦予指向數組的指針變數(int a[5],*pa; pa=a; 也可寫為:pa=&a[0];)

如果給指針加1或減1 ,實際上是加上或減去指針所指向的數據類型大小。

當給指針加上一個整數值或減去一個整數值時,表達式返回一個新地址。

相同類型的兩個指針可以相減,減後返回的整數代表兩個地址間該類型的實例個數。

int cc=new (int*)[10]; 聲明一個10個元素的數組,數組每個元素都是一個int *指針,

每個元素還可以單獨申請空間,因為cc的類型是int*型的指針,所以你要在堆里申請的話就要用int *來申請;

int a= new int * [2];//申請兩個int * 型的空間

a[0] = new int[4];////為a的第一個元素申請了4個int 型空間,a[0] 指向了此空間的首地址處

a[1] = new int[3];//為a的第二個元素又申請了3個int 型空間,a[1]指向了此空間首地址處

指針數組初始化賦值:

一維指針開辟空間:char *str;int *arr; scanf("%d",&n);

str=(char*)malloc(sizeof(char)*n);

arr=(int*)malloc(sizeof(int)*n);

二維指針開辟空間:int **arr, i; scanf("%d%d",&row,&col);

arr=(int)malloc(sizeof(int)*row);

for(i=0;i

arr[i]=(int*)malloc(sizeof(int)*col);

結構體指針數組,例如typedef struct{ char x; int y; }quan,*qquan;

定義一個結構體指針數組如:qquan a[max]

for(i=0;i

{

a[i]=(qquan)malloc(sizeof(quan));

memset(a[i],0,sizeof(quan));

}

指針數組賦值

float a[]={100,200,300,400,500};

float *p[5]={&a[0],&a[1],&a[2],&a[3],&a[4]};

char *units[1000];

char get_unit[250];

for(int i=0;i

scanf("%s", get_unit); strcpy(units[i],get_unit);}

3,復雜指針解析:

(1)int (*func)(int *p);

(*func)()是一個函數,func是一個指向這類函數的指針,就是一個函數指針,這類函數具有int*類型的形參,返回值類型是 int。

(2)int (*func)(int *p, int (*f)(int*));

func是一個指向函數的指針,這類函數具有int *和int (*)(int*)這樣的形參。形參int (*f)(int*),f也是一個函數指針

(3)int (*func[5])(int *p);

func數組的元素是函數類型的指針,它所指向的函數具有int*類型的形參,返回值類型為int。

(4)int (*(*func)[5])(int *p);

func是一個指向數組的指針,這個數組的元素是函數指針,這些指針指向具有int*形參,返回值為int類型的函數。

(5)int (*(*func)(int *p))[5];

func是一個函數指針,這類函數具有int*類型的形參,返回值是指向數組的指針,所指向的數組的元素是具有5個int元素的數組。

注意:

需要聲明一個復雜指針時,如果把整個聲明寫成上面所示的形式,對程序可讀性是一大損害。

應該用typedef來對聲明逐層,分解,增強可讀性,例如對於聲明:int (*(*func)(int *p))[5];

這樣分解:typedef int (*para)[5]; typedef para (*func)(int *);

例如:int (*(*func)[5][6])[7][8];

func是一個指向數組的指針,這類數組的元素是一個具有5x6個int元素的二維數組,而這個二維數組的元素又是一個二維數組。

typedef int (*para)[7][8];

typedef para (*func)[5][6];

例如:int (*(*(*func)(int *))[5])(int *);

func是一個函數指針,這類函數的返回值是一個指向數組的指針,

所指向數組的元素也是函數指針,指向的函數具有int*形參,返回值為int。

typedef int (*para1)(int*);

typedef para1 (*para2)[5];

typedef para2 (*func)(int*);

4,函數指針詳解

答:函數指針是指向一個函數入口的指針

一個函數指針只能指向一種類型的函數,即具有相同的返回值和相同的參數的函數。

函數指針數組定義:void(*fun[3])(void*); 相應指向類a的成員函數的指針:void (a::*pmf)(char *, const char *);

指向外部函數的指針:void (*pf)(char *, const char *); void strcpy(char * dest, const char * source); pf=strcpy;

5,野指針

答:“野指針”是很危險的,if語句對它不起作用。“野指針”的成因主要有兩種:

(1)指針變數沒有被初始化。指針變數在創建的同時應當被初始化,要麼將指針設置為null,要麼讓它指向合法的內存。

char *p = null; char *str = (char *) malloc(100);

(2)指針p被free或者delete之後,沒有置為null

(3)指針操作超越了變數的作用范圍。所指向的內存值對象生命期已經被銷毀

6,引用和指針有什麼區別?

答:引用必須初始化,指針則不必;引用初始化以後不能改變,指針可以改變其指向的對象;

不存在指向空值的引用,但存在指向控制的指針;

引用是某個對象的別名,主要用來描述函數和參數和返回值。而指針與一般的變數是一樣的,會在內存中開辟一塊內存。

如果函數的參數或返回值是類的對象的話,採用引用可以提高程序的效率。

7,c++中的const用法

答:char * const p; // 指針不可改,也就說指針只能指向一個地址,不能更改為其他地址,修飾指針本身

char const * p; // 所指內容不可改,也就是說*p是常量字元串,修飾指針所指向的變數

const char * const p 和 char const * const p; // 內容和指針都不能改

const修飾函數參數是它最廣泛的一種用途,它表示函數體中不能修改參數的值,

傳遞過來的參數在函數內不可以改變,參數指針所指內容為常量不可變,參數指針本身為常量不可變

在引用或者指針參數的時候使用const限制是有意義的,而對於值傳遞的參數使用const則沒有意義

const修飾類對象表示該對象為常量對象,其中的任何成員都不能被修改。

const修飾的對象,該對象的任何非const成員函數都不能被調用,因為任何非const成員函數會有修改成員變數的企圖。

const修飾類的成員變數,表示成員常量,不能被修改,同時它只能在初始化列表中賦值。static const 的成員需在聲明的地方直接初始。

const修飾類的成員函數,則該成員函數不能修改類中任何非const成員。一般寫在函數的最後來修飾。

在函數實現部分也要帶const關鍵字.

對於const類對象/指針/引用,只能調用類的const成員函數,因此,const修飾成員函數的最重要作用就是限制對於const對象的使用

使用const的一些建議:在參數中使用const應該使用引用或指針,而不是一般的對象實例

const在成員函數中的三種用法(參數、返回值、函數)要很好的使用;

const在成員函數中的三種用法(參數、返回值、函數)要很好的使用;

不要輕易的將函數的返回值類型定為const;除了重載操作符外一般不要將返回值類型定為對某個對象的const引用;

8,const常量與define宏定義的區別

答:(1) 編譯器處理方式不同。define宏是在預處理階段展開,生命周期止於編譯期。

只是一個常數、一個命令中的參數,沒有實際的存在。

#define常量存在於程序的代碼段。const常量是編譯運行階段使用,const常量存在於程序的數據段.

(2)類型和安全檢查不同。define宏沒有類型,不做任何類型檢查,僅僅是展開。

const常量有具體的類型,在編譯階段會執行類型檢查。

(3) 存儲方式不同。define宏僅僅是展開,有多少地方使用,就展開多少次,不會分配內存。

const常量會在內存中分配(可以是堆中也可以是棧中)

9,解釋堆和棧的區別

答:1、棧區(stack)— 由編譯器自動分配釋放,存放函數的參數值,局部變數的值等。其操作方式類似於數據結構中的棧。

由系統自動分配。聲明在函數中一個局部變數 int b; 系統自動在棧中為b開辟空間 。

只要棧的剩餘空間大於所申請空間,系統將為程序提供內存,否則將報異常提示棧溢出。

在windows下,棧是向低地址擴展的數據結構,是一塊連續的內存的區域,棧的大小是2m。

如果申請的空間超過棧的剩餘空間時,將提示overflow。

棧由系統自動分配,速度較快。但程序員是無法控制的。

函數調用時,第一個進棧的是主函數中後的下一條指令,的地址,然後是函數的各個參數。

在大多數的c編譯器中,參數是由右往左入棧的,然後是函數中的局部變數。注意靜態變數是不入棧的。

堆區(heap) — 一般由程序員分配釋放,若程序員不釋放,程序結束時可能由os回收 。

注意它與數據結構中的堆是兩回事,分配方式倒是類似於鏈表,需要程序員自己申請,並指明大小,在c中malloc函數

在c++中用new運算符。首先應該知道操作系統有一個記錄空閑內存地址的鏈表,當系統收到程序的申請時,

另外,由於找到的堆結點的大小不一定正好等於申請的大小,系統會自動的將多餘的那部分重新放入空閑鏈表中。

堆是向高地址擴展的數據結構,是不連續的內存區域。而鏈表的遍歷方向是由低地址向高地址。

堆的大小受限於計算機系統中有效的虛擬內存。

堆是由new分配的內存,一般速度比較慢,而且容易產生內存碎片,不過用起來最方便

一般是在堆的頭部用一個位元組存放堆的大小。

10,論述含參數的宏和函數的優缺點

(1)函數調用時,先求出實參表達式的值,然後代入形參。而使用帶參的宏只是進行簡單的字元替換

(2)函數調用是在程序運行時處理的,分配臨時的內存單元;而宏展開是在編譯時進行的,在展開時不進行

內存分配,不進行值得傳遞處理,沒有“返回值”概念

(3)對函數中的形參和實參都要定義類型,類型要求一致,如不一致則進行類型轉換。而宏不存在類型問題

(4)調用函數只可得到一個返回值,而用宏則可以設法得到幾個結果

(5)實用宏次數多時,宏展開後源程序變長,沒展開一次源程序增長,函數調用則不會

(6)宏替換不佔用運行時間,只佔編譯時間,而函數調用佔用運行時間

11,c++的空類,默認產生哪些類成員函數?

答:class empty

{

public:

empty(); //預設構造函數

empty(const empty& ); //拷貝構造函數

~empty(); //虛構函數

empty& operator(const empty& ) //賦值運算符

empty& operator&(); //取址運算符

const empty* operator&() const; // 取址運算符 const

}

12,談談類和結構體的區別

答:結構體在默認情況下的成員都是public的,而類在默認情況下的成員是private的。結構體和類都必須使用new創建,

struct保證成員按照聲明順序在內存在存儲,而類不保證。

13,c++四種強制類型轉換

答:(1)const_cast

字面上理解就是去const屬性,去掉類型的const或volatile屬性。

struct sa{ int k}; const sa ra;

ra.k = 10; //直接修改const類型,編譯錯誤 sa& rb = const_cast(ra); rb.k = 10; //可以修改

(2)static_cast

主要用於基本類型之間和具有繼承關系的類型之間的轉換。用於指針類型的轉換沒有太大的意義

static_cast是無條件和靜態類型轉換,可用於基類和子類的轉換,基本類型轉換,把空指針轉換為目標類型的空指針,

把任何類型的表達式轉換成void類型,static_cast不能進行無關類型(如非基類和子類)指針之間的轉換。

int a; double d = static_cast(a); //基本類型轉換

int &pn = &a; void *p = static_cast(pn); //任意類型轉換為void

(3)dynamic_cast

你可以用它把一個指向基類的指針或引用對象轉換成繼承類的對象

動態類型轉換,運行時類型安全檢查(轉換失敗返回null)

基類必須有虛函數,保持多態特性才能用dynamic_cast

只能在繼承類對象的指針之間或引用之間進行類型轉換

class baseclass{public: int m_inum; virtual void foo(){};};

class derivedclass:baseclass{public: char* szname[100]; void bar(){};};

baseclass* pb = new derivedclass();

derivedclass *p2 = dynamic_cast(pb);

baseclass* pparent = dynamic_cast(p2);

//子類->父類,動態類型轉換,正確

(4)reinterpreter_cast

轉換的類型必須是一個指針、引用、算術類型、函數指針或者成員指針。

主要是將一個類型的指針,轉換為另一個類型的指針

不同類型的指針類型轉換用reinterpreter_cast

最普通的用途就是在函數指針類型之間進行轉換

int dosomething(){return 0;};

typedef void(*funcptr)(){};

funcptr funcptrarray[10];

funcptrarray[0] = reinterpreter_cast(&dosomething);

14,c++函數中值的傳遞方式有哪幾種?

答:函數的三種傳遞方式為:值傳遞、指針傳遞和引用傳遞。

15,將“引用”作為函數參數有哪些特點

答:(1)傳遞引用給函數與傳遞指針的效果是一樣的,這時,被調函數的形參就成為原來主調函數的實參變數或者

對象的一個別名來使用,所以在被調函數中形參的操作就是對相應的目標對象的操作

(2)使用引用傳遞函數的參數,在內存中並沒有產生實參的副本,它是直接對實參操作,當參數數據較大時,引用

傳遞參數的效率和所佔空間都好

(3)如果使用指針要分配內存單元,需要重復使用“*指針變數名”形式進行計算,容易出錯且閱讀性較差。

Ⅹ 程序員面試問題及答案

程序員面試問題及答案

程序員是從事程序開發、維護的專業人員。我整理的程序員面試問題及答案,希望大家喜歡!

1、兩柱香問題

題目:有兩柱不均勻的香,每柱香燃燒完需要1個小時,問:怎樣用兩柱香切出一個15分鍾的時間段?這個題的重點就是怎麼切。

解答:將甲香的一頭點著,將乙香的兩頭點著,當乙香燃燒完時,說明已經過了半個小時,同時也說明甲香也正好燃燒了一半,此時,將甲香的另一頭點著,從此時起到甲香完全燒完,正好15分鍾。

2、燈管問題

在房裡有三盞燈,房外有三個開關,在房外看不見房內的情況,你只能進門一次,你用什麼方法來區分那個開關控制那一盞燈?

解答:打開一盞燈10分鍾,關掉,打開第二盞,進去看看哪盞亮,摸摸哪盞熱,熱的是第一個打開的開關開的,亮的是第二個開關開的',另一個就是第三個。

3、兩位盲人問題

他們都各自買了兩對黑襪和兩對白襪,八對襪了的布質、大小完全相同,而每對襪了都有一張商標紙連著。兩位盲人不小心將八對襪了混在一起。 他們每人怎樣才能取回黑襪和白襪各兩對呢?

答案:每一對分開,一人拿一隻,因為襪子不分左右腳的;

4、果凍問題

你有一桶果凍,其中有黃色,綠色,紅色三種,閉上眼睛,同時抓取兩個果凍。抓取多少個就可以確定你肯定有兩個同一顏色的果凍?

答案:2次4個!

5、喝啤酒問題

假如每3個空啤酒瓶可以換一瓶啤酒,某人買了10瓶啤酒,那麼他最多可以喝到多少瓶啤酒?

答案:喝完10瓶後用9個空瓶換來3瓶啤酒(喝完後有4個空瓶)喝完這三瓶又可以換到1瓶啤酒(喝完後有2個空瓶),這時他有2個空酒瓶,如果他能向老闆先借一個空酒瓶,就湊夠了3個空瓶可以換到一瓶啤酒,把這瓶喝完後將空瓶還給老闆就可以了。

所以他最多可以喝10+3+1+1=15瓶

6、三人住旅館

有三個人去住旅館,住三間房,每一間房$10元,於是他們一共付給老闆$30,第二天,老闆覺得三間房只需要$25元就夠了於是叫小弟退回$5給三位客人,誰知小弟貪心,只退回每人$1,自己偷偷拿了$2,這樣一來便等於那三位客人每人各花了九元,於是三個人一共花了$27,再加上小弟獨吞了不$2,總共是$29。可是當初他們三個人一共付出$30那麼還有$1呢?

答案:他們所消費的27元里已經包括小弟的2元了,再加退還的3元=30元。這種題一定不要亂了陣腳,根據一條思路做:這30元現在的分布是:老闆拿25元,伙計拿2元,三人各拿1元,正好!

7、三筐蘋果問題

有三筐水果,一筐裝的全是蘋果,第二筐裝的全是橘子,第三筐是橘子與蘋果混在一起。筐上的標簽都是騙人的,(就是說筐上的標簽都是錯的)你的任務是拿出其中一筐,從裡面只拿一隻水果,然後正確寫出三筐水果的標簽。

答案:從標著「混合」標簽的筐里拿一隻水果,就可以知道另外兩筐裝的是什麼水果了。

分析:從混合的拿出一個來,如果是蘋果,而貼蘋果的筐里有可能是橘子和混合,如果是混合,說明貼橘子的筐里是橘子,不成立(因為前提說了,每個標簽都是錯的)。所以貼蘋果的筐里是橘子,則貼橘子的筐里是混合。

8、汽車加油問題

一輛載油500升的汽車從A開往1000公里外的B,已知汽車每公里耗油量為1升,A處有無窮多的油,其他任何地點都沒有油,但該車可以在任何地點存放油以備中轉,問從A到B最少需要多少油

解答:嚴格證明該模型最優比較麻煩,但確實可證,大膽猜想是解題關鍵。題目可歸結為求數列an=500/(2n 1) n=0,1,2,3......的和Sn什麼時候大於等於1000,解得n>6當n=6時,S6=977.57,所以第一個中轉點離起始位置距離為1000-977.57=22.43公里.所以第一次中轉之前共耗油22.43*(2*7 1)=336.50升此後每次中轉耗油500升,所以總耗油量為7*500 336.50=3836.50升。

9、兩個人猜數問題

教授選出兩個從2到9的數,把它們的和告訴學生甲,把它們的積告訴學生乙,讓他們輪流猜這兩個數, 甲說:「我猜不出」, 乙說:「我猜不出」, 甲說:「我猜到了」, 乙說:「我也猜到了」, 問這兩個數是多少?

解答:3和4。設兩個數為n1,n2,n1> =n2,甲聽到的數為n=n1 n2,乙聽到的數為m=n1*n2,證明n1=3,n2=4是唯一解。證明:要證以上命題為真,不妨先證n=7

1)必要性:

i) n> 5 是顯然的,因為n <4不可能,n=4或者n=5甲都不可能回答不知道

ii) n> 6 因為如果n=6的話,那麼甲雖然不知道(不確定2 4還是3 3)但是無論是2,4還是3,3乙都不可能說不知道(m=8或者m=9的話乙說不知道是沒有道理的)

iii) n <8 因為如果n> =8的話,就可以將n分解成 n=4 x 和 n=6 (x-2),那麼m可以是4x也可以是6(x-2)而4x=6(x-2)的必要條件是x=6即n=10,那樣n又可以分解成8 2,所以總之當n> =8時,n至少可以分解成兩種不同的合數之和,這樣乙說不知道的時候,甲就沒有理由馬上說知道。以上證明了必要性。

2)充分性

當n=7時,n可以分解成2 5或3 4

顯然2 5不符合題意,捨去,容易判斷出3 4符合題意,m=12,證畢

於是得到n=7 m=12 n1=3 n2=4是唯一解。

10、猴子吃香蕉問題

一個小猴子邊上有100 根香蕉,它要走過50 米才能到家,每次它最多搬50 根香蕉,每走1 米就要吃掉一根,請問它最多能把多少根香蕉搬到家裡。

解答:設 小猴從0 走到50, 到A 點時候他可以直接抱香蕉回家了, 可是到A 點時候他至少消耗了3A 的香蕉( 到A, 回0, 到A), 一個限制就是小猴只能抱50 只香蕉, 那麼在A 點小猴最多49 只香蕉.100-3A=49, 所以A=17. 這樣折騰完到家的時候香蕉剩100-3A-(50-A)=50-2A=16.


;
閱讀全文

與程序員面試寶典第二版機密面試題相關的資料

熱點內容
有個動漫女主藍頭發是程序員 瀏覽:996
雲伺服器資源評估 瀏覽:882
微雲下載文件夾是空的 瀏覽:3
r9數控車的編程 瀏覽:403
為什麼刪不掉ksafe文件夾 瀏覽:291
理科男學編程用什麼電腦 瀏覽:839
安陽彈性雲伺服器 瀏覽:570
壓縮空氣儲罐有效期 瀏覽:408
英國文學PDF 瀏覽:175
軟體編程需求 瀏覽:626
廣州哪裡解壓 瀏覽:253
手機小視頻怎麼壓縮 瀏覽:915
微信聊天界面源碼 瀏覽:24
seo競價推廣點擊價格演算法公式 瀏覽:319
框架結構可以加密嗎 瀏覽:218
python編譯器怎麼清除 瀏覽:73
linux全局socks代理 瀏覽:611
php微信抽獎 瀏覽:771
壓縮演算法嵌入式移植 瀏覽:531
php新手小例子 瀏覽:233