JAVA基礎概述(面試題 下)

多線程

java中有幾種方法可以實現一個線程(jdk5.0之前)?用什麼關鍵字修飾同步方法? stop()和suspend()方法爲何不推薦使用?

答:有兩種實現方法,分別是繼承Thread類與實現Runnable接口。

用synchronized關鍵字修飾同步方法,反對使用stop(),是因爲它不安全。它會解除由線程獲取的所有鎖定,而且如果對象處於一種不連貫狀態,那麼其他線程能在那種狀態下檢查和修改它們。結果很難檢查出真正的問題所在。

suspend()方法容易發生死鎖。調用suspend()的時候,目標線程會停下來,但卻仍然持有在這之前獲得的鎖定。此時,其他任何線程都不能訪問鎖定的資源,除非被"掛起"的線程恢復運行。對任何線程來說,如果它們想恢復目標線程,同時又試圖使用任何一個鎖定的資源,就會造成死鎖。所以不應該使用suspend(),而應在自己的Thread類中置入一個標誌,

指出線程應該活動還是掛起。若標誌指出線程應該掛起,便用wait()命其進入等待狀態。若標誌指出線程應當恢復,則用一個notify()重新啓動線程。

 

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

答:sleep是線程類(Thread)的方法,導致此線程暫停執行指定時間,給執行機會給其他線程,但是監控狀態依然保持,到時後會自動恢復。調用sleep不會釋放對象鎖。

wait是Object類的方法,對此對象調用wait方法導致本線程放棄對象鎖,進入等待此對象的等待鎖定池,只有針對此對象發出notify方法(或notifyAll)後本線程才進入對象鎖定池準備獲得對象鎖進入運行狀態。

 

同步和異步有何異同,在什麼情況下分別使用他們?舉例說明。

答:如果數據將在線程間共享。例如正在寫的數據以後可能被另一個線程讀到,或者正在讀的數據可能已經被另一個線程寫過了,那麼這些數據就是共享數據,必須進行同步存取。

當應用程序在對象上調用了一個需要花費很長時間來執行的方法,並且不希望讓程序等待方法的返回時,就應該使用異步編程,在很多情況下采用異步途徑往往更有效率。

啓動一個線程是用run()還是start()?

答:啓動一個線程是調用start()方法,使線程所代表的虛擬處理機處於可運行狀態,這意味着它可以由JVM調度並執行。這並不意味着線程就會立即運行。run()方法就是正常的對象調用方法的執行,並不是使用分線程來執行的。

 

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

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

 

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

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

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

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

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

 

多線程有幾種實現方法,都是什麼?同步有幾種實現方法,都是什麼?

答:多線程有兩種實現方法,分別是繼承Thread類與實現Runnable接口

同步的實現方面有兩種,分別是synchronized,wait與notify

 

線程的基本概念、線程的基本狀態以及狀態之間的關係

答:線程指在程序執行過程中,能夠執行程序代碼的一個執行單位,每個程序至少都有一個線程,也就是程序本身。

Java中的線程有四種狀態分別是:創建、就緒、運行、阻塞、結束

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

答:主要相同點:Lock能完成synchronized所實現的所有功能

主要不同點:Lock有比synchronized更精確的線程語義和更好的性能。synchronized會自動釋放鎖,而Lock一定要求程序員手工釋放,並且必須在finally從句中釋放。

 

 

JAVA常用類

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

答:兩個,一個字符對象,一個字符對象引用對象

 

 

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

答:  Math.round(11.5)==12;Math.round(-11.5)==-11;round方法返回與參數最接近的長整數,參數加1/2後求其floor

 

是否可以繼承String類

答:String類是final類故不可以繼承

 

 

String與StringBuffer的區別

答:String的長度是不可變的,StringBuffer的長度是可變的。如果你對字符串中的內容經常進行操作,特別是內容要修改時,那麼使用StringBuffer,如果最後需要String,那麼使用StringBuffer的toString()方法

 

 

JAVA集合

Collection 和 Collections的區別

答:Collection是集合類的上級接口,繼承於他的接口主要有Set 和List.

Collections是針對集合類的一個幫助類,他提供一系列靜態方法實現對各種集合的搜索、排序、線程安全化等操作

 

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

答:Set裏的元素是不能重複的,用equals()方法判讀兩個Set是否相等

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

 

List, Set, Map是否繼承自Collection接口

答: List,Set是,Map不是

 

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

答:不對,有相同的hash code

 

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

答:ArrayList和Vector都是使用數組方式存儲數據,此數組元素數大於實際存儲的數據以便增加和插入元素,它們都允許直接按序號索引元素,但是插入元素要涉及數組元素移動等內存操作,所以索引數據快而插入數據慢,Vector由於使用了synchronized方法(線程安全),通常性能上較ArrayList差,而LinkedList使用雙向鏈表實現存儲,按序號索引數據需要進行前向或後向遍歷,但是插入數據時只需要記錄本項的前後項即可,所以插入速度較快。

 

HashMap和Hashtable的區別

答:

1.HashMap與Hashtable都實現了Map接口。由於HashMap的非線程安全性,效率上可能高於Hashtable。Hashtable的方法是Synchronize的,而HashMap不是,在多個線程訪問Hashtable時,不需要自己爲它的方法實現同步,而HashMap 就必須爲之提供外同步。

2. HashMap允許將null作爲一個entry的key或者value,而Hashtable不允許。

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

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

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

 

 

ArrayList和Vector的區別

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

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

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

 

 

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

答:最常用的集合類是 List 和 Map。 List 的具體實現包括 ArrayList 和 Vector,它們是可變大小的列表,比較適合構建、存儲和操作任何類型對象的元素列表。 List 適用於按數值索引訪問元素的情形。

Map 提供了一個更通用的元素存儲方法。 Map 集合類用於存儲元素對(稱作"鍵"和"值"),其中每個鍵映射到一個值。

 

IO流

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

答:序列化就是一種用來處理對象流的機制,所謂對象流也就是將對象的內容進行流化。

可以對流化後的對象進行讀寫操作,也可將流化後的對象傳輸於網絡之間。

序列化是爲了解決在對對象流進行讀寫操作時所引發的問題。

序列化的實現:將需要被序列化的類實現Serializable接口,該接口沒有需要實現的方法,

implements Serializable只是爲了標註該對象是可被序列化的,然後使用一個輸出流(如:FileOutputStream)來構造一個ObjectOutputStream(對象流)對象,接着,使用ObjectOutputStream對象的writeObject(Object obj)方法就可以將參數爲obj的對象寫出(即保存其狀態),要恢復的話則用輸入流。

 

使用處理流的優勢有哪些?如何識別所使用的流是處理流還是節點流?

【答案】

【優勢】對開發人員來說,使用處理流進行輸入/輸出操作更簡單;使用處理流的執行效率更高。

【判別】

處理流的構造器的參數不是一個物理節點,而是已經存在的流。而節點流都是直接以物理IO及節點作爲構造器參數的。

Java中有幾種類型的流?JDK爲每種類型的流提供了一些抽象類以供繼承,請指出它們分別是哪些類?

【答案】Java中按所操作的數據單元的不同,分爲字節流和字符流。

字節流繼承於InputStream和OutputStream類;

字符流繼承於Reader和Writer。

按流的流向的不同,分爲輸入流和輸出流。

按流的角色來分,可分爲節點流和處理流。緩衝流、轉換流、對象流和打印流等都屬於處理流,使得輸入/輸出更簡單,執行效率更高。

 

什麼是標準的I/O流?

在java語言中,用stdin表示鍵盤,用stdout表示監視器。他們均被封裝在System類的類變量in 和out中,對應於系統調用System.in和System.out。這樣的兩個流加上System.err統稱爲標準流,它們是在System類中聲明的3個類變量:

public static InputStream in

publicstaticPrintStream out

public static PrintStream err

 

數組有沒有length()方法?String有沒有length()方法?File有沒有length()方法?ArrayList有沒有length()方法?

數組沒有length()方法,但是有length屬性。

String和File有length()方法。

ArrayList沒有length()方法,有size()方法獲取有效元素個數。

 

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

答:JVM中類的裝載是由ClassLoader和它的子類來實現的,Java ClassLoader 是一個重要的Java運行時系統組件。它負責在運行時查找和裝入類文件的類。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章