java異常機制的原理與應用
答:每當程序出現異常之後,如果程序沒有進行相應的處理,則程序會出現中斷現象。
實際上,產生了異常之後,JVM會拋出一個異常類的實例化對象,如果此時使用了try語句捕獲的話,則可以進行異常的處理,否則,交給JVM進行處理。當try語句捕獲異常之後,將與catch語句的異常類型進行匹配,如果匹配成功則執行catch內的語句。簡單的應用:在所以throws語句的地方加入try-catch。標准應用:try-catch-finally-throw-throws一起使用。
2. 垃圾回收機制的優點
答:釋放無用的對象所佔用的空間。方式:自動回收,手動回收。使用System.gc(),實際上調用Runtime.getRuntime().gc()
3. Error與Exception區別
答:Error是jvm進行處理,是jvm出錯
exception是可以由程序處理的,可以用try-catch捕獲的
4. final,finally,finallize
答:final定義的變數的值不能改變,定義的方法不能被覆蓋,定義的類不能被繼承
finally是異常的統一出口,finallize是垃圾回收前的收尾工作,是Object類定義的
5. Anonymous Inner Class是否可以extends,是否可以implements Interface
答:允許繼承和實現,因為匿名內部類就是在抽象類和介面的基礎上發展起來的
6. Static Nested Class 與Inner Class的區別
答:使用Static定義的Class就是外部類,可以通過外部類. 內部類直接訪問
而Inner Class是不能被外部訪問的,只能通過外部類的實例再找到內部類實例。
7. HashMap and HashTable?
答:HashMap:1) released in jdk 1.2,new Class 2)採用非同步處理方式,性能較高,是非線程安全的 3)允許null
HashTable:1)released in jdk 1.0 ,old Class 2)採用同步處理方式,性能低,是線程安全的3)不允許null
8. assert代表什麼?
答:asserts是jdk 1.4之後發布的新關鍵字,表示斷言,即程序執行到某個地方肯定是預計的值,一般開發很少使用。要使用assert,必須加上 -ea參數
9. gc是什麼?
答:gc是garbage collection,垃圾回收,使用gc可以進行垃圾空間的釋放
10. String s = new String("xyz")產生了幾個對象?
答:一個匿名對象xyz,在棧空間內。一個new實例化的對象,在堆空間內。
11. sleep() and wait()?
答:sleep()是Thread類定義方法,表示線程的休眠,可以自動喚醒
wait()方法是Object類定義的方法,需要手動notify()和notifyAll()//sleep()不釋放資源,wait()釋放資源
12. java中存在goto,但不能使用
13.數組有沒有length(),String有沒有length()?
答:數組有length屬性,String有length()
14. Overload與Override的區別
答:Overload:重載
|- 在一個類中定義的若干方法
|- 所有的方法名相同,但參數類型或個數不同
|- 只有參數有關,與返回類型無關
Override:覆寫
|- 在繼承的關系中
|- 子類定義了父類同名的方法,參數類型或個數最好完全一樣。
|- 訪問許可權不能更嚴格
15. Set里的元素不能重復,用什麼方法區分?==與equals()方法的區別
答:set里的元素是不能重復的,用iterator()方法來區分重復與否,==屬於地址比較,
==用於比較引用和比較基本數據類型時具有不同的功能:
比較基本數據類型,如果兩個值相同,則結果為true
而在比較引用時,如果引用指向內存中的同一對象,結果為true
16. 列出常見的 runtime exception
答:NumberFormatException/ArrayOutIndexofBoundException/NullPointerException/ClassCastException
17. abstract class 和 interface有什麼區別?
答:抽象類:
|-由抽象方法和常量、變數、全局常量、構造方法、普通方法組成
|-使用abstract聲明
|-子類要通過extends繼承抽象類,子類如果不是抽象類,則必須覆寫抽象類的全部抽象方法
|-存在單繼承的局限
|-抽象類可以實現若干個介面
介面:
|-由抽象方法和全局常量組成
|-使用interface關鍵字
|-子類要通過implements實現介面,子類如果不是抽象類,則必須覆寫抽象類的全部抽象方法
|-一個子類可以實現多個介面
|-介面不能繼承一個抽象類,但允許繼承多個介面
18. 啟動一個線程要用start(),因為要通知jvm進行cpu資源的分配
19. try{}裡面有一個return,問finally{}裡面的代碼是否執行,在什麼時機執行?
答:finally{}裡面的代碼執行,在return之前。
20. 寫一個singleton
答:singleton的核心就是構造方法私有化,Class,Runtime都採用單例
package com.leongod.demo;
public class Singleton(){
private static final sin = new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return sin;
}
}
21. 程序設計:輸入一組數字,然後排序輸出
答:package com.leongod.demo;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;
public class IO {
public static void main(String[] args) throws Exception {
BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));
System.out.println("請輸入一組數字,中間用空格分割:");
String str = buf.readLine();
Set<Integer> set = new TreeSet<Integer>();
String[] arr = str.split(" ");
for(String s : arr) {
if (s.matches("\\d+")) {
set.add(Integer.parseInt(s));
}
}
Iterator<Integer> it = set.iterator();
System.out.println("排序後的結果:");
while (it.hasNext()) {
System.out.print(it.next() + ",");
}
}
}
22.列出目錄內的文件
package com.leongod.demo;
import java.io.File;
import com.sun.org.apache.xpath.internal.functions.FuncBoolean;
public class FileDemo {
public static void main(String[] args) {
?? File file = new File("D:" + File.separator + "kongkong");
?? fun(file);
}
public static void fun(File file) {
if (file.isDirectory()) {
File[] lf = file.listFiles();
if (lf != null) {
for(File f : lf) {
fun(f);
}
}
}else {
System.out.println(file.toString());
}
}
}
23. char可以存一個中文漢字嗎?
答:可以,使用了unicode編碼
24.多線程有幾種實現方法,都是什麼?同步有幾種實現方法,都是什麼?
答:兩種多線程方法,繼承Thread類,實現Runnable介面
|-Thread類是Runnable介面的子類
|-使用Runnable介面可以實現資源共享的目的
|-所有線程操作都必須通過Thread類的start()方法啟動
兩種實現同步的方法:
|-同步代碼塊:Synchronized(this)
|-同步方法
25.f=3.4是不對的,3.4默認是double類型的
26.String and StringBuffer?
答:String 不可以修改,StringBuffer可以修改
27.Class.forname向容器中載入驅動程序
28.int與Integer有什麼區別?
答:int是基本數據類型,Integer是包裝類
在jdk1.5以後,可以實現自動裝箱和拆箱
29.2*8有效的方法是移位操作:2<<3
30.請說出類集框架的完整結構
答:類級框架的最大介面:Collection、Map、Iterator、Enumeration
Collection:存放單值
|-List:允許有重復內容
|-ArrayList:非同步處理,新的操作類,非線程安全
|-Vector:同步處理,舊的操作類,線程安全,支持Enumeration
|-Set:不允許有重復的內容,依靠hashCode()和equals()進行重復的驗證
|-HashSet:無序存放
|-TreeSet:有序存放,按Comparable排序
|-Map:存放一對值
|-HashMap:新的類,非同步處理,非線程安全,允許有null
|-HashTable:舊的類,同步處理,線程安全,不允許有null
|-TreeMap:有序排列,按key配需
|-Iterator:迭代輸出,依靠collection介面中的iterator方法輸出,是新的輸出標准
31.是否可以繼承String類?答:不可以,因為使用了final關鍵字
② 求程序員面試題
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個位元組,所以放一個中文是沒問題的
③ 75道程序員面試邏輯測試題(附答案)(1)
【1】 假設有一個池塘,裡面有無窮多的水。現有2個空水壺,容積分別為5升和6升。問題是如何只用這2個水壺從池塘里取得3升的水。
由滿6向空5倒,剩1升,把這1升倒5里,然後6剩滿,倒5裡面,由於5裡面有1升水,因此6隻能向5倒4升水,然後將6剩餘的2升,倒入空的5裡面,再灌滿6向5里倒3升,剩餘3升。
【2】 周雯的媽媽是豫林水泥廠的化驗員。一天,周雯來到化驗室做作業。做完後想出去玩。"等等,媽媽還要考你一個題目,"她接著說,"你看這6隻做化驗用的玻璃杯,前面3隻盛滿了水,後面3隻是空的。你能只移動1隻玻璃杯,就便盛滿水的杯子和空杯子間隔起來嗎?"愛動腦筋的周雯,是學校里有名的"小機靈",她只想了一會兒就做到了。請你想想看,"小機靈"是怎樣做的?
設杯子編號為ABCDEF,ABC為滿,DEF為空,把B中的水倒進E中即可。
【3】 三個小夥子同時愛上了一個姑娘,為了決定他們誰能娶這個姑娘,他們決定用手槍進行一次決斗。小李的命中率是30%,小黃比他好些,命中率是50%,最出色的槍手是小林,他從不失誤,命中率是100%。由於這個顯而易見的事實,為公平起見,他們決定按這樣的順序:小李先開槍,小黃第二,小林最後。然後這樣循環,直到他們只剩下一個人。
那麼這三個人中誰活下來的機會最大呢?他們都應該採取什麼樣的策略?
小林在輪到自己且小黃沒死的條件下必殺黃,再跟菜鳥李單挑。
所以黃在林沒死的情況下必打林,否則自己必死。
小李經過計算比較(過程略),會決定自己先打小林。
於是經計算,小李有873/2600≈33.6%的生機;
小黃有109/260≈41.9%的生機;
小林有24.5%的生機。
哦,這樣,那小李的第一槍會朝天開,以後當然是打敵人,誰活著打誰;
小黃一如既往先打林,小林還是先幹掉黃,冤家路窄啊!
最後李,黃,林存活率約38:27:35;
菜鳥活下來抱得美人歸的幾率大。
李先放一空槍(如果合夥干中林,自己最吃虧)黃會選林打一槍(如不打林,自己肯定先玩完了)林會選黃打一槍(畢竟它命中率高)李黃對決0.3:0.280.4可能性李林對決0.3:0.60.6可能性成功率0.73
李和黃打林李黃對決0.3:0.40.7 0.4可能性李林對決0.3:0.7 0.6 0.70.7 0.6可能性成功率0.64
【4】 一間囚房裡關押著兩個犯人。每天監獄都會為這間囚房提供一罐湯,讓這兩個犯人自己來分。起初,這兩個人經常會發生爭執,因為他們總是有人認為對方的湯比自己的多。後來他們找到了一個兩全其美的辦法:一個人分湯,讓另一個人先選。於是爭端就這么解決了。可是,現在這間囚房裡又加進來一個新犯人,現在是三個人來分湯。必須尋找一個新的方法來維持他們之間的和平。該怎麼辦呢?按:心理問題,不是邏輯問題
是讓甲分湯,分好後由乙和丙按任意順序給自己挑湯,剩餘一碗留給甲。這樣乙和丙兩人的總和肯定是他們兩人可拿到的最大。然後將他們兩人的湯混合之後再按兩人的方法再次分湯。
【5】 在一張長方形的桌面上放了n個一樣大小的圓形硬幣。這些硬幣中可能有一些不完全在桌面內,也可能有一些彼此重疊;當再多放一個硬幣而它的圓心在桌面內時,新放的硬幣便必定與原先某些硬幣重疊。請證明整個桌面可以用4n個硬幣完全覆蓋。
要想讓新放的硬幣不與原先的硬幣重疊,兩個硬幣的圓心距必須大於直徑。也就是說,對於桌面上任意一點,到最近的圓心的距離都小於2,所以,整個桌面可以用n個半徑為2的硬幣覆蓋。
把桌面和硬幣的尺度都縮小一倍,那麼,長、寬各是原桌面一半的小桌面,就可以用n個半徑為1的硬幣覆蓋。那麼,把原來的桌子分割成相等的4塊小桌子,那麼每塊小桌子都可以用n個半徑為1的硬幣覆蓋,因此,整個桌面就可以用4n個半徑為1的硬幣覆蓋。
【6】 一個球、一把長度大約是球的直徑2/3長度的直尺.你怎樣測出球的半徑?方法很多,看看誰的比較巧妙
把球放在平面上,把直尺的一邊卡在平面上,一邊卡在球上,球與尺子的接觸點到平面的距離就是球的半徑.因為直尺長度約為直徑的2/3>半徑,所以能測量.
【7】 五個大小相同的一元人民幣硬幣。要求兩兩相接觸,應該怎麼擺?
底下放一個1,然後2 3放在1上面,另外的4 5豎起來放在1的上面。
【8】 猜牌問題S先生、P先生、Q先生他們知道桌子的抽屜里有16張撲克牌:紅桃A、Q、4黑桃J、8、4、2、7、3草花K、Q、5、4、6方塊A、5。約翰教授從這16張牌中挑出一張牌來,並把這張牌的點數告訴P先生,把這張牌的花色告訴Q先生。這時,約翰教授問P先生和Q先生:你們能從已知的點數或花色中推知這張牌是什麼牌嗎?於是,S先生聽到如下的對話:P先生:我不知道這張牌。Q先生:我知道你不知道這張牌。P先生:現在我知道這張牌了。Q先生:我也知道了。聽罷以上的對話,S先生想了一想之後,就正確地推出這張牌是什麼牌。請問:這張牌是什麼牌? 方塊5
【9】 一個教授邏輯學的教授,有三個學生,而且三個學生均非常聰明!一天教授給他們出了一個題,教授在每個人腦門上貼了一張紙條並告訴他們,每個人的紙條上都寫了一個正整數,且某兩個數的和等於第三個!(每個人可以看見另兩個數,但看不見自己的)教授問第一個學生:你能猜出自己的數嗎?回答:不能,問第二個,不能,第三個,不能,再問第一個,不能,第二個,不能,第三個:我猜出來了,是144!教授很滿意的笑了。請問您能猜出另外兩個人的數嗎?
經過第一輪,說明任何兩個數都是不同的。第二輪,前兩個人沒有猜出,說明任何一個數都不是其它數的兩倍。現在有了以下幾個條件:1.每個數大於02.兩兩不等3.任意一個數不是其他數的兩倍。每個數字可能是另兩個之和或之差,第三個人能猜出144,必然根據前面三個條件排除了其中的一種可能。假設:是兩個數之差,即x-y=144。這時1(x,y>0)和2(x!=y)都滿足,所以要否定x+y必然要使3不滿足,即x+y=2y,解得x=y,不成立(不然第一輪就可猜出),所以不是兩數之差。因此是兩數之和,即x+y=144。同理,這時1,2都滿足,必然要使3不滿足,即x-y=2y,兩方程聯立,可得x=108,y=36。
這兩輪猜的順序其實分別為這樣:第一輪(一號,二號),第二輪(三號,一號,二號)。這樣分大家在每輪結束時獲得的信息是相同的(即前面的三個條件)。
那麼就假設我們是C,來看看C是怎麼做出來的:C看到的是A的36和B的108,因為條件,兩個數的和是第三個,那麼自己要麼是72要麼是144(猜到這個是因為72的話,108就是36和72的和,144的話就是108和36的和。這樣子這句話看不懂的舉手):
假設自己(C)是72的話,那麼B在第二回合的時候就可以看出來,下面是如果C是72,B的思路:這種情況下,B看到的就是A的36和C的72,那麼他就可以猜自己,是36或者是108(猜到這個是因為36的話,36加36等於72,108的話就是36和108的和):
如果假設自己(B)頭上是36,那麼,C在第一回合的時候就可以看出來,下面是如果B是36,C的思路:這種情況下,C看到的就是A的36和B的36,那麼他就可以猜自己,是72或者是0(這個不再解釋了):
如果假設自己(C)頭上是0,那麼,A在第一回合的時候就可以看出來,下面是如果C是0,A的思路:這種情況下,A看到的就是B的36和C的0,那麼他就可以猜自己,是36或者是36(這個不再解釋了),那他可以一口報出自己頭上的36。(然後是逆推逆推逆推),現在A在第一回合沒報出自己的36,C(在B的想像中)就可以知道自己頭上不是0,如果其他和B的想法一樣(指B頭上是36),那麼C在第一回合就可以報出自己的72。現在C在第一回合沒報出自己的36,B(在C的想像中)就可以知道自己頭上不是36,如果其他和C的想法一樣(指C頭上是72),那麼B在第二回合就可以報出自己的108。現在B在第二回合沒報出自己的108,C就可以知道自己頭上不是72,那麼C頭上的唯一可能就是144了。
史上最雷人的應聘者
【10】 某城市發生了一起汽車撞人逃跑事件,該城市只有兩種顏色的車,藍15%綠85%,事發時有一個人在現場看見了,他指證是藍車,但是根據專家在現場分析,當時那種條件能看正確的可能性是80%那麼,肇事的車是藍車的概率到底是多少?
15% 80%/(85%×20%+15% 80%)
【11】 有一人有240公斤水,他想運往乾旱地區賺錢。他每次最多攜帶60公斤,並且每前進一公里須耗水1公斤(均勻耗水)。假設水的價格在出發地為0,以後,與運輸路程成正比,(即在10公里處為10元/公斤,在20公里處為20元/公斤......),又假設他必須安全返回,請問,他最多可賺多少錢?
f(x)=(60-2x)*x,當x=15時,有最大值450。
450×4
【12】 現在共有100匹馬跟100塊石頭,馬分3種,大型馬;中型馬跟小型馬。其中一匹大馬一次可以馱3塊石頭,中型馬可以馱2塊,而小型馬2頭可以馱一塊石頭。問需要多少匹大馬,中型馬跟小型馬?(問題的關鍵是剛好必須是用完100匹馬) 6種結果
【13】 1=5,2=15,3=215,4=2145那麼5=?
因為1=5,所以5=1.
【14】 有2n個人排隊進電影院,票價是50美分。在這2n個人當中,其中n個人只有50美分,另外n個人有1美元(紙票子)。愚蠢的電影院開始賣票時1分錢也沒有。問:有多少種排隊方法使得每當一個擁有1美元買票時,電影院都有50美分找錢
註:1美元=100美分擁有1美元的人,擁有的是紙幣,沒法破成2個50美分
本題可用遞歸演算法,但時間復雜度為2的n次方,也可以用動態規劃法,時間復雜度為n的平方,實現起來相對要簡單得多,但最方便的就是直接運用公式:排隊的種數=(2n)!/[n!(n+1)!]。
如果不考慮電影院能否找錢,那麼一共有(2n)!/[n!n!]種排隊方法(即從2n個人中取出n個人的組合數),對於每一種排隊方法,如果他會導致電影院無法找錢,則稱為不合格的,這種的排隊方法有(2n)!/ (n-1)!(n+1)! 種,所以合格的排隊種數就是(2n)!/[n!n!]- (2n)!/[(n-1)!(n+1)!] =(2n)!/[n!(n+1)!]。至於為什麼不合格數是(2n)!/[(n-1)!(n+1)!],說起來太復雜,這里就不講了。
【15】 一個人花8塊錢買了一隻雞,9塊錢賣掉了,然後他覺得不劃算,花10塊錢又買回來了,11塊賣給另外一個人。問他賺了多少?
2元
【16】 有一種體育競賽共含M個項目,有運動員A,B,C參加,在每一項目中,第一,第二,第三名分別的X,Y,Z分,其中X,Y,Z為正整數且X>Y>Z。最後A得22分,B與C均得9分,B在百米賽中取得第一。求M的值,並問在跳高中誰得第二名。
因為ABC三人得分共40分,三名得分都為正整數且不等,所以前三名得分最少為6分,40=5 8=4 10=2 20=1 20,不難得出項目數只能是5.即M=5.
A得分為22分,共5項,所以每項第一名得分只能是5,故A應得4個一名一個二名.22=5*4+2,第二名得1分,又B百米得第一,所以A只能得這個第二.
B的5項共9分,其中百米第一5分,其它4項全是1分,9=5+1=1+1+1.即B除百米第一外全是第三,跳高第二必定是C所得.
【17】 前提:
1 有五棟五種顏色的房子
2 每一位房子的主人國籍都不同
3 這五個人每人只喝一種飲料,只抽一種牌子的香煙,只養一種寵物
4 沒有人有相同的寵物,抽相同牌子的香煙,喝相同的飲料
提示:1 英國人住在紅房子里
2 瑞典人養了一條狗
3 丹麥人喝茶
4 綠房子在白房子左邊
5 綠房子主人喝咖啡
6 抽PALLMALL煙的人養了一隻鳥
7 黃房子主人抽DUNHILL煙
8 住在中間那間房子的人喝牛奶
9 挪威人住第一間房子
10抽混合煙的人住在養貓人的旁邊
11養馬人住在抽DUNHILL煙的人旁邊
12抽BLUEMASTER煙的人喝啤酒
13德國人抽PRINCE煙
14挪威人住在藍房子旁邊
15抽混合煙的人的鄰居喝礦泉水
問題是:誰養魚???
第一間是黃房子,挪威人住,喝礦泉水,抽DUNHILL香煙,養貓;! f/ [% a: 6 L! J. Q9 x第二間是藍房子,丹麥人住,喝茶,抽混合煙,養馬;+ o8 _0 S) L8 i' E' u第三間是紅房子,英國人住,喝牛奶,抽PALL MALL煙,養鳥;/ N9 o/ n2 M# U" c第四間是綠房子,德國人住,喝咖啡,抽PRINCE煙,養貓、馬、鳥、狗以外的寵物;7 P5 l) G, G, |; C, {7 V第五間是白房子,瑞典人住,喝啤酒,抽BLUE MASTER煙,養狗。
【18】 5個人來自不同地方,住不同房子,養不同動物,吸不同牌子香煙,喝不同飲料,喜歡不同食物。根據以下線索確定誰是養貓的人。
10.養魚的人住在最右邊的房子里。
11.吸萬寶路香煙的人住在吸希爾頓香煙的人和吸「555」香煙的人的中間(緊鄰)
12.紅房子的人愛喝茶。
13.愛喝葡萄酒的人住在愛吃豆腐的人的右邊隔壁。
14.吸紅塔山香煙的人既不住在吸健牌香煙的人的隔壁,也不與來自上海的人相鄰。
15.來自上海的人住在左數第二間房子里。
16.愛喝礦泉水的人住在最中間的房子里。
17.愛吃面條的人也愛喝葡萄酒。
18.吸「555」香煙的人比吸希爾頓香煙的人住的靠右
第一間是蘭房子,住北京人,養馬,抽健牌香煙,喝茅台,吃豆腐;2 G7 x% z0 v; C第二間是綠房子,住上海人,養狗,抽希爾頓,喝葡萄酒,吃面條;% C2 k4 o8 t" p6 L* x第三間是黃房子,住香港人,養蛇,抽萬寶路,喝礦泉水,吃牛肉;& N" S% x# o3 a; g第四間是紅房子,住天津人,抽555,喝茶,吃比薩;7 5 s. J# d, Q/ N% N' O# ]第五間是白房子,住成都人,養魚,抽紅塔山,喝啤酒,吃雞。
【19】 鬥地主附殘局
地主手中牌2、K、Q、J、10、9、8、8、6、6、5、5、3、3、3、3、7、7、7、7
長工甲手中牌大王、小王、2、A、K、Q、J、10、Q、J、10、9、8、5、5、4、4
長工乙手中牌2、2、A、A、A、K、K、Q、J、10、9、9、8、6、6、4、4
三家都是明手,互知底牌。要求是:在三家都不打錯牌的情況下,地主必須要麼輸要麼贏。問:哪方會贏?
無解地主怎麼出都會輸
【20】 一樓到十樓的每層電梯門口都放著一顆鑽石,鑽石大小不一。你乘坐電梯從一樓到十樓,每層樓電梯門都會打開一次,只能拿一次鑽石,問怎樣才能拿到最大的一顆?
先拿下第一樓的鑽石,然後在每一樓把手中的鑽石與那一樓的鑽石相比較,如果那一樓的鑽石比手中的鑽石大的話那就把手中的鑽石換成那一層的鑽石。
④ 程序員面試必考題(二十五)---SPDY與HTTP/2協議
SPDY(SPDY是Speedy的昵音,意為更快),是Google開發的基於TCP協議的應用層協議。SPDY協議的目標是優化HTTP協議的性能,通過壓縮、多路復用和優先順序等技術,縮短網頁的載入時間並提高安全性。SPDY協議核心思想是盡量減少TCP連接數,而對於HTTP的語義未做太大修改(比如,HTTP的GET和POST消息格式保持不變),基本上兼容HTTP協議。
超文本傳輸協議(HTTP)是一個非常成功的協議,但是HTTP/1.1及之前版本的HTTP協議均是針對20世紀90年代之期網路與Web應用需求而設計,其一些特點已經對現代應用程序的性能產生了負面影響,比如:
SPDY正是Google在HTTP即將從1.1向2.0過渡之際推出的協議,長期以來一直被認為是HTTP 2.0可行選擇。
SPDY與HTTP相比,具有如下優點:
HTTP/2協議通過定義一個HTTP語義向底層連接的優化映射,來解決這些問題。HTTP/2允許在同一連接上交錯地發送/接收請求報文和響應報文,使用高效的HTTP報頭欄位編碼,還支持請求優先順序,使讓更重要的請求能更快速被處理,從而進一步提升性能。另外,HTTP/2通過使用二進制的消息幀,實現消息的高效處理。
HTTP/2 提供了HTTP語義的優化傳輸。HTTP/2支持所有HTTP/1.1的核心特徵,並且在不同的方面做的更高效。
HTTP/2的基本協議單元是幀(frame),每個類型幀用於不同用途。例如, HEADERS幀和DATA幀構成基本的HTTP請求報文和響應報文,其他類型幀,如SETTINGS幀、WINDOW_UPDATE幀和PUSH_PROMISE幀用於支持HTTP/2的其他特性。
HTTP/2的請求多路復用是通過將每個HTTP請求/響應交換與其自身的流進行關聯來實現的。流在很大程度上是相互獨立的,因此一個阻塞或終止的請求/響應並不會影響其他流。
HTTP/2的流量控制和優先順序能確保高效地使用復用流。流量控制有助於確保只傳輸接收方使用的數據,優先順序可以確保有限的資源被優先用於最重要的流。
HTTP/2添加了一種新的交互模式,即伺服器可以向客戶端推送消息。伺服器推送允許服務端預測客戶端需要來發送數據給客戶端,平衡網路利用率以及潛在的延遲。
HTTP/2幀包含的HTTP報頭欄位是壓縮的。HTTP請求有可能是高度冗餘的,因此壓縮能顯著減少請求和響應的大小。
HTTP/2使用與HTTP/1.1相同的「http」和「https」URI方案,並且共享相同的默認埠號:「http」 URI的默認埠號為80,「https」 URI的默認埠號為443。HTTP/2可以使用加密(推薦),也可以不使用加密,「h2」標識使用TLS的HTTP/2(即安全的HTTP/2),「h2c」則標識運行在明文TCP之上的HTTP/2(即非加密的HTTP/2)。
例題:
下面關於HTTP/2的描述中,錯誤的是?
A.HTTP/2基於SPDY協議,充分解決了TCP連接的限制,它允許多個並發HTTP請求公用一個TCP會話
B.針對只能由客戶端發起請求的問題,HTTP/2添加了一種新的交互模式,即伺服器推送
C.HTTP/2提供了HTTP語義的傳輸優化,支持HTTP/1.1的所有核心特徵,並且在其他方面做得更高效
D.HTTP/2是以安全為目標的HTTP通道,簡單講是HTTP的安全版,即HTTP下加入SSL層
該題為楚楚街筆試題,根據前文的分析,可見選項A、B、C均是正確敘述,只有選項D的敘述不準確。
《橫掃offer---程序員招聘真題詳解700題》,開點工作室著,清華大學出版社出版,天貓、京東等各大網上書店及實體書店均已開始發售。