技術問答集錦(五)

猿碼道發表於2018-01-22

1 簡述邏輯操作(&,|,^)與條件操作(&&,||)的區別

區別主要答兩點:

  1. 條件操作只能操作布林型的,而邏輯操作不僅可以操作布林型,而且可以操作數值型

  2. 邏輯操作不會產生短路,而條件操作符會產生短路,短路是指當進行條件操作符運算時,前面條件如果確定了條件表示式值的話,就不在進行後面條件的判斷

位邏輯運算通常是針對兩個數而言,執行位操作; 條件邏輯運算是針對兩個條件表示式而言,執行條件操作;

其實,位邏輯操作符一樣可以實現條件操作,但是此時有一個重要的區別: 用位操作符時,不管操作符兩邊的條件表示式成不成立,它都要通通進行運算判斷,而條件邏輯操作符不一樣了,如果通過左側的運算元就可以 進行它們需要的判斷,那麼它就不會再計算右側的運算元了,這種情況叫短路

2 談談final, finally, finalize的區別

  1. 如果一個類被宣告為final,意味著它不能再派生出新的子類,不能作為父類被繼承。因此一個類既不能被宣告為 abstract的,又被宣告為final的。

  2. 變數或方法宣告為final,可以保證它們在使用中不被改變。被宣告為final的變數必須在宣告時給定初值,而在以後的引用中只能讀取,不可修改。被宣告為final的方法也同樣只能使用,不能過載。

  3. finally塊:在異常處理時提供 finally 塊來執行任何清除操作。如果丟擲一個異常,那麼相匹配的 catch 子句就會執行,然後不管是否會發生異常控制都會進入 finally 塊(如果有的話)。

  4. finalize 方法名:Java 技術允許使用 finalize() 方法在垃圾收集器將物件從記憶體中清除出去之前做必要的清理工作。這個方法是由垃圾收集器在確定這個物件沒有被引用而清理時對這個物件呼叫的。它是在 Object 類中定義的,因此所有的類都繼承了它。子類覆蓋finalize() 方法以整理系統資源或者執行其他清理工作。finalize() 方法是在垃圾收集器刪除物件之前對這個物件呼叫的僅能會被JVM執行一次

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

匿名內部類是指沒有名字的內部類,其本身就是通過繼承類或者介面來實現的。但是不能再顯式的extends 或者implements了。

4 Static Nested Class 和 Inner Class的不同,說得越多越好

Nested Class (一般是C++的說法),Inner Class (一般是JAVA的說法)。

Java Nested Class 分為兩大類:

  1. Static Nested Class;
  2. Non-static Nested Class。

Non-Static Nested Class 才是真正的Inner Class。

Static Nested Class是被宣告為靜態內部類,它可以不依賴於外部類例項而被例項化。而通常的內部類需要在外部類例項化後才能例項化。

靜態內部類(Inner Class):1. 建立一個static內部類的物件,不需要一個外部類物件;2. 不能從一個static內部類的一個物件訪問一個外部類物件。

內部類:1. 建立一個內部類的物件,必須需要一個外部類物件;

5 HashMap和Hashtable的區別

  1. HashMap是Hashtable的輕量級實現(非執行緒安全的實現),它們都實現了Map介面,主要區別在於HashMap允許空(null)鍵值,由於非執行緒安全,效率上可能高於Hashtable。HashMap允許將null作為一個entry的key或者value,而Hashtable不允許

  2. HashMap把Hashtable的contains方法去掉了,改成了containsvalue和containskey。因為contains方法容易讓人引起誤解。

  3. Hashtable繼承自Dictionary類,而HashMap是Java1.2引進的Map interface的一個實現。最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多個執行緒訪問Hashtable時,不需要自己為它的方法實現同步,而HashMap就必須為之提供外同步(如果是ArrayList:List lst = Collections.synchronizedList(new ArrayList());如果是HashMap:Map map = Collections.synchronizedMap(new HashMap());)

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

6 Collection 和 Collections的區別

Collection是集合類的父介面,繼承與它的介面主要有Set和List。

Collections是針對集合類的一個幫助類,它提供一系列靜態方法實現對各種集合的搜尋,排序,執行緒安全化等操作。

7 GC是什麼? 為什麼要有GC?

GC 是垃圾收集的意思(Gabage Collection),記憶體處理是程式設計人員容易出現問題的地方,忘記或者錯誤的記憶體回收會導致程式或系統的不穩定甚至崩潰,Java提供的GC功能可以自動的監測物件是否超過作用域從而達到自動回收記憶體的目的,Java語言沒有提供釋放以分配記憶體的顯示操作方法。

8 String s = new String("xyz");建立了幾個String Object?

兩個物件,一個是“xyz”,另一個是s;

10 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正確。

11 sleep() 和 wait() 有什麼區別?

sleep是執行緒類(Thread)的方法,導致此執行緒暫停執行指定時間,到時間後會自動恢復,呼叫sleep不會釋放物件鎖

wait是Object類的方法,對此物件呼叫wait方法導致本執行緒釋放物件鎖,進入等待此物件的等待鎖定池,只有針對此物件呼叫notify方法或notifyAll方法後,本執行緒才進入物件鎖定池準備獲得物件鎖進入執行狀態。

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

方法的重寫Overriding和過載Overloading是Java多型性的不同表現

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

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

Set裡的元素是不能重複的。equals()是判讀兩個Set是否相等。 equals()和==方法決定引用值是否指向同一物件。equals()在類中被覆蓋,為的是當兩個分離的物件的內容和型別相配的話,返回真值。

16 error和exception有什麼區別?

error 表示恢復不是不可能但很困難的情況下的一種嚴重問題。比如說記憶體溢位。不可能指望程式能處理這樣的情況。

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

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

List,Set是。Map不是 。

18 abstract class和interface有什麼區別?

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

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

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

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

20 啟動一個執行緒是用run()還是start()?

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

21 構造器Constructor是否可被override?

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

22 是否可以繼承String類?

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

23 當一個執行緒進入一個物件的一個synchronized方法後,其它執行緒是否可進入此物件的其它方法?

不能,一個物件的一個synchronized方法只能由一個執行緒訪問。

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

會執行,在return前執行

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

是值傳遞。Java 程式語言只有值傳遞引數。當一個物件例項作為一個引數被傳遞到方法中時,引數的值就是對該物件的引用。物件的內容可以在被呼叫的方法中改變,但物件的引用是永遠不會改變的。

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

switch(expr1)中,expr1是一個整數表示式。因此傳遞給 switch 和 case 語句的引數應該是 short、 int、 byte、char 。

long,String 都不能作用於swtich

27 物件導向的特徵有哪些方面

抽象:抽象就是忽略一個主題中與當前目標無關的那些方面,以便更充分地注意與當前目標有關的方面。抽象並不打算了解全部問題,而只是選擇其中的一部分,暫時不用部分細節。抽象包括兩個方面,一是過程抽象,二是資料抽象。

繼承: 繼承是一種聯結類的層次模型,並且允許和鼓勵類的重用,它提供了一種明確表述共性的方法。物件的一個新類可以從現有的類中派生,這個過程稱為類繼承。新類 繼承了原始類的特性,新類稱為原始類的派生類(子類),而原始類稱為新類的基類(父類)。派生類可以從它的基類那裡繼承方法和例項變數,並且類可以修改或 增加新的方法使之更適合特殊的需要。

封裝:封裝是把過程和資料包圍起來,對資料的訪問只能通過已定義的介面。物件導向計算始於這個基本概念,即現實世界可以被描繪成一系列完全自治、封裝的物件,這些物件通過一個受保護的介面訪問其他物件。

多型性:多型性是指允許不同類的物件對同一訊息作出響應。多型性包括引數化多型性和包含多型性。多型性語言具有靈活、抽象、行為共享、程式碼共享的優勢,很好的解決了應用程式函式同名問題。

28 String是最基本的資料型別嗎?

不是,基本資料型別包括byte、int、char、long、float、double、boolean和short。

java.lang.String類是final型別的,因此不可以繼承這個類、不能修改這個類。為了提高效率節省空間,我們應該用StringBuffer類。

29 int 和 Integer 有什麼區別

Java 提供兩種不同的型別:引用型別和原始型別(或內建型別)。int是java的原始資料型別,Integer是java為int提供的封裝類。Java為每個原始型別提供了封裝類。

原始型別 封裝類
boolean Boolean
char Character
byte Byte
short Short
int Integer
long Long
float Float
double Double

引用型別和原始型別的行為完全不同,並且它們具有不同的語義。引用型別和原始型別具有不同的特徵和用法,它們包括:大小和速度問題,這種型別以哪種型別的資料結構儲存,當引用型別和原始型別用作某個類的例項資料時所指定的預設值。物件引用例項變數的預設值為 null,而原始型別例項變數的預設值與它們的型別有關

30 String 和StringBuffer的區別

JAVA 平臺提供了兩個類:String和StringBuffer,它們可以儲存和操作字串,即包含多個字元的字元資料。這個String類提供了數值不可改變的字串。而這個StringBuffer類提供的字串進行修改。當你知道字元資料要改變的時候你就可以使用StringBuffer。典型地,你可以使用StringBuffers來動態構造字元資料。

31 執行時異常與一般異常有何異同?

異常表示程式執行過程中可能出現的非正常狀態,執行時異常表示虛擬機器的通常操作中可能遇到的異常,是一種常見執行錯誤。java編譯器要求方法必須宣告丟擲可能發生的非執行時異常,但是並不要求必須宣告丟擲未被捕獲的執行時異常。

32 說出ArrayList,Vector, LinkedList的儲存效能和特性

ArrayList 和Vector都是使用陣列方式儲存資料,此陣列元素數大於實際儲存的資料以便增加和插入元素,它們都允許直接按序號索引元素,但是插入元素要涉及陣列元素移動等記憶體操作,所以索引資料快而插入資料慢

Vector由於使用了synchronized方法(執行緒安全),通常效能上較ArrayList差, 而LinkedList使用雙向連結串列實現儲存,按序號索引資料需要進行前向或後向遍歷,但是插入資料時只需要記錄本項的前後項即可,所以插入速度較快

34 heap和stack有什麼區別

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

35 Java中的異常處理機制的簡單原理和應用

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

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

Java 語言中一個顯著的特點就是引入了垃圾回收機制,使c++程式設計師最頭疼的記憶體管理的問題迎刃而解,它使得Java程式設計師在編寫程式的時候不再需要考慮記憶體管 理。由於有個垃圾回收機制,Java中的物件不再有“作用域”的概念,只有物件的引用才有“作用域”。垃圾回收可以有效的防止記憶體洩露,有效的使用可以使 用的記憶體。垃圾回收器通常是作為一個單獨的低階別的執行緒執行,不可預知的情況下對記憶體堆中已經死亡的或者長時間沒有使用的物件進行清楚和回收,程式設計師不能 實時的呼叫垃圾回收器對某個物件或所有物件進行垃圾回收。回收機制有分代垃圾回收標記垃圾回收增量垃圾回收

37 你所知道的集合類都有哪些?主要方法?

最常用的集合類是 List 和 Map。 List 的具體實現包括 ArrayList 和 Vector,它們是可變大小的列表,比較適合構建、儲存和操作任何型別物件的元素列表。 List 適用於按數值索引訪問元素的情形。 Map 提供了一個更通用的元素儲存方法。 Map 集合類用於儲存元素對(稱作“鍵”和“值”),其中每個鍵對映到一個值。

38 char型變數中能不能存貯一箇中文漢字?為什麼?

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

39 簡述synchronized和java.util.concurrent.locks.Lock的異同?

主要相同點:Lock能完成synchronized所實現的所有功能。 主要不同點:Lock有比synchronized更精確的執行緒語義和更好的效能

synchronized會自動釋放鎖,而Lock一定要求程式設計師手工釋放,並且必須在finally從句中釋放

40 JAVA語言如何進行異常處理,關鍵字:throws,throw,try,catch,finally分別代表什麼意義?在try塊中可以丟擲異常嗎?

Java 通過物件導向的方法進行異常處理,把各種不同的異常進行分類,並提供了良好的介面。在Java中,每個異常都是一個物件,它是Throwable類或其它子類的例項。當一個方法出現異常後便丟擲一個異常物件,該物件中包含有異常資訊,呼叫這個物件的方法可以捕獲到這個異常並進行處理。Java的異常處理是通過5個關鍵詞來實現的:try、catch、throw、throws和finally。一般情況下是用try來執行一段程式,如果出現異常,系統會丟擲(throws)一個異常,這時候你可以通過它的型別來捕捉(catch)它,或最後(finally)由預設處理器來處理。

用try來指定一塊預防所有“異常”的程式。緊跟在try程式後面,應包含一個catch子句來指定你想要捕捉的“異常”的型別

throw語句用來明確地丟擲一個“異常”throws用來標明一個成員函式可能丟擲的各種“異常”finally為確保一段程式碼不管發生什麼“異常”都被執行一段程式碼

可以在一個成員函式呼叫的外面寫一個try語句,在這個成員函式內部寫另一個try語句保護其他程式碼。每當遇到一個try語句,“異常”的框架就放到堆疊上面,直到所有的try語句都完成。如果下一級的try語句沒有對某種“異常”進行處理,堆疊就會展開,直到遇到有處理這種“異常”的try語句。

41 一個“.java”原始檔中是否可以包括多個類(不是內部類)?有什麼限制?

可以。必須只有一個類名與檔名相同。

42 java中有幾種方法可以實現一個執行緒?用什麼關鍵字修飾同步方法? stop()和suspend()方法為何不推薦使用?

有兩種實現方法,分別是繼承Thread類與實現Runnable介面;

用synchronized關鍵字修飾同步方法;

反對使用stop(),是因為它不安全:它會解除由執行緒獲取的所有鎖定,而且如果物件處於一種不連貫狀態,那麼其他執行緒能在那種狀態下檢查和修改它們。結果很難檢查出真正的問題所在。

suspend()方法容易發生死鎖:呼叫suspend()的時候,目標執行緒會停下來,但卻仍然持有在這之前獲得的鎖定。此時,其他任何執行緒都不能訪問鎖定的資源,除非被“掛起”的執行緒恢復執行對任何執行緒來說,如果它們想恢復目標執行緒,同時又試圖使用任何一個鎖定的資源,就會造成死鎖。所以不應該使用suspend(),而應在自己的Thread類中置入一個標誌,指出執行緒應該活動還是掛起。若標誌指出執行緒應該掛起,便用 wait()命其進入等待狀態。若標誌指出執行緒應當恢復,則用一個notify()重新啟動執行緒。

43 java中有幾種型別的流?JDK為每種型別的流提供了一些抽象類以供繼承,請說出他們分別是哪些類?

位元組流,字元流。 位元組流繼承於InputStream OutputStream,字元流繼承於InputStreamReader OutputStreamWriter。 在java.io包中還有許多其他的流,主要是為了提高效能和使用方便。

44 java中實現多型的機制是什麼?

方法的重寫Overriding和過載Overloading是Java多型性的不同表現。重寫Overriding是父類與子類之間多型性的一種表現,過載Overloading是一個類中多型性的一種表現。

45 垃圾回收器的基本原理是什麼?垃圾回收器可以馬上回收記憶體嗎?有什麼辦法主動通知虛擬機器進行垃圾回收?

對於GC來說,當程式設計師建立物件時,GC就開始監控這個物件的地址、大小以及使用情況。通常,GC採用有向圖的方式記錄和管理堆(heap)中的所有物件。 通過這種方式確定哪些物件是"可達的",哪些物件是"不可達的"。當GC確定一些物件為"不可達"時,GC就有責任回收這些記憶體空間。可以。程式設計師可以手動執行System.gc(),通知GC執行,但是Java語言規範並不保證GC一定會執行

46 什麼是java序列化,如何實現java序列化?

序列化就是一種用來處理物件流的機制,所謂物件流也就是將物件的內容進行流化。可以對流化後的物件進行讀寫操作,也可將流化後的物件傳輸於網路之間。序列化是為了解決在對物件流進行讀寫操作時所引發的問題。

序列化的實現:將需要被序列化的類實現Serializable介面,該介面沒有需要實現的方法,implements Serializable只是為了標註該物件是可被序列化的,然後使用一個輸出流(如:FileOutputStream)來構造一個 ObjectOutputStream(物件流)物件,接著,使用ObjectOutputStream物件的writeObject(Object obj)方法就可以將引數為obj的物件寫出(即儲存其狀態),要恢復的話則用輸入流。

47 是否可以從一個static方法內部發出對非static方法的呼叫?

不可以,如果其中包含物件的method();不能保證物件初始化.

48 寫clone()方法時,通常都有一行程式碼,是什麼?

Clone 有預設行為,super.clone();他負責產生正確大小的空間,並逐位複製。

49 在JAVA中,如何跳出當前的多重巢狀迴圈?

用break; return 方法。

50 List、Map、Set三個介面,存取元素時,各有什麼特點?

List 以特定次序來持有元素,可有重複元素。 Set 無法擁有重複元素,內部排序。 Map 儲存key-value值,value可多值。

51 內部類可以引用他包含類的成員嗎?有沒有什麼限制?

一個內部類物件可以訪問建立它的外部類物件的內容

52 ArrayList和Vector的區別,HashMap和Hashtable的區別

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

  1. 同步性:Vector是執行緒安全的,也就是說是同步的,而ArrayList是執行緒序不安全的,不是同步的 ;
  2. 資料增長:當需要增長時,Vector預設增長為原來一培,而ArrayList卻是原來的一半

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

  1. 歷史原因:Hashtable是基於陳舊的Dictionary類的,HashMap是Java 1.2引進的Map介面的一個實現 ;
  2. 同步性:Hashtable是執行緒安全的,也就是說是同步的,而HashMap是執行緒序不安全的,不是同步的 ;
  3. 值:只有HashMap可以讓你將空值作為一個表的條目的key或value。

53 關於java public private protected friendly(預設)作用域

public:類本身和任何包的任何類都訪問; private 只有類本身可以訪問,其他類想訪問可以通過該類的成員方法訪問如getter/setter; protected:保護的,這個和預設的比較容易混淆,記住最主要區別是:protected可以在不同包的子類被訪問,而friendly不可以; protected可以在類本身、同包的子類,不同包的子類,同包的非子類被訪問; 預設不寫的時候是friendly;

54 為什麼Java內部類訪問的區域性變數是final的

final關鍵字的目的就是為了保證內部類和外部函式對變數“認識”的一致性

相關文章