技術問答集錦(五)

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

區別主要答兩點:java

  1. 條件操做只能操做布爾型的,而邏輯操做不只能夠操做布爾型,並且能夠操做數值型c++

  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關鍵字的目的就是爲了保證內部類和外部函數對變量「認識」的一致性

相關文章
相關標籤/搜索