天天看點

北京Java筆試題整理

北京Java筆試題整理

1、什麼是java虛拟機?為什麼ava被稱作是“平台無關的程式設計語言?

答:Java虛拟機可以了解為一個特殊的“作業系統”,隻是它連接配接的不是硬體,而是一般的作業系統和java程式。

正是因為有這樣一層作業系統與程式之間的連接配接,Java程式就能在一台機子上編譯後到處都能運作——隻要有對應不同系統的Java虛拟機就可以了。是以Java被稱為“平台無關”。

Java虛拟機是一個可以執行Java位元組碼的虛拟機程序。Java源檔案被編譯成能被Java虛拟機執行的位元組碼檔案。

2、關鍵字是什麼意思?Java中是否可以覆寫或者static的方法?

答:static表示靜态的意義,它可以修飾一個變量,一個方法,被其修飾的變量被稱為類變量,被其修飾的方法成為類方法,其随着類的加載而被加載。

無法重寫被private修飾的方法,因為被private修飾的父類方法在子類中是不可見的。

static修飾的方法是靜态綁定的,而方法覆寫是為了實作多态,是動态綁定,是以static修飾的方法不需要被覆寫

3、是否可以在static環境中通路非static變量?

答:不能。

static變量在java中是屬于類的,在類的所有執行個體中,它的值都是一樣的。在類被JVM載入時,靜态變量的值就确定了。

而非靜态變量是屬于執行個體的,要在new一個執行個體之後,值才會存在。

在static環境中,調用非static變量,可能這個變量都還不存在,當然會出錯。

4、java支援的資料類型有哪些?什麼是自動拆裝箱?

答:Java語言支援的8中基本資料類型是:

byte

short

int

long

float

double

boolean

char

自動裝箱是Java編譯器在基本資料類型和對應的對象包裝類型之間做的一個轉化。比如:把int轉化成Integer,double轉化成double,等等。反之就是自動拆箱。

5、Java中的方法覆寫和方法重載是什麼意思?

答:重載: 在一個類當中才可以重載,方法名相同,參數個數不同或參數個數相同而參數類型不同。

覆寫: 又稱重寫,在派生類(子類)中重寫基類(父類)的方法,名稱、參數、類型都必須相同。

6、Java中,什麼是構造函數?什麼是構造函數重載?什麼是指派構造函數?

答:當新對象被建立的時候,構造函數會被調用。每一個類都有構造函數。在程式員沒有給類提供構造函數的情況下,Java編譯器會為這個類建立一個預設的構造函數。

Java中構造函數重載和方法重載很相似。可以為一個類建立多個構造函數。每一個構造函數必須有它自己唯一的參數清單。

Java不支援像C++中那樣的指派構造函數,這個不同點是因為如果你不自己寫構造函數的情況下,Java不會建立預設的指派構造函數。

7、Java支援多繼承嗎?

答:

Java中類不支援多繼承,隻支援單繼承(即一個類隻有一個父類)。 但是java中的接口可以間接實作多繼承,,即一個子接口可以有多個父接口。(接口的作用是用來擴充對象的功能,一個子接口繼承多個父接口,說明子接口擴充了多個功能,當類實作接口時,類就擴充了相應的功能)。

8、程序和線程的差別是什麼?

答:1)程序是什麼? 是具有一定獨立功能的程式、它是系統進行資源配置設定和排程的一個獨立機關,重點在系統排程和單獨的機關,也就是說程序是可以獨 立運作的一段程式。

2)線程又是什麼? 線程程序的一個實體,是CPU排程和分派的基本機關,他是比程序更小的能獨立運作的基本機關,線程自己基本上不擁有系統資源。 在運作時,隻是暫用一些計數器、寄存器和棧 。二、他們之間的關系 3)一個線程隻能屬于一個程序,而一個程序可以有多個線程,但至少有一個線程(通常說的主線程)。

9、什麼是值傳遞和引用傳遞?

答:值傳遞 指的是在方法調用時,傳遞的參數是按值的拷貝傳遞。

引用傳遞 指的是在方法調用時,傳遞的參數是按引用進行傳遞,其實傳遞的引用的位址,也就是變量所對應的記憶體空間的位址。

10、建立線程有幾種方式?你喜歡哪一種?為什麼?

來源:牛客網

1)繼承Thread類(真正意義上的線程類),是Runnable接口的實作。

2)實作Runnable接口,并重寫裡面的run方法。

3)通過Callable接口實作多線程,重寫call方法,優點是可以擷取傳回值,确定是比較繁瑣

4)使用Executor架構建立線程池。Executor架構是juc裡提供的線程池的實作。

調用線程的start():啟動此線程;調用相應的run()方法

繼承于Thread類的線程類,可以直接調用start方法啟動線程(使用static也可以實作資源共享).一個線程(對象)隻能夠執行一次start(),而且不能通過Thread實作類對象的run()去啟動一個線程。

實作Runnable接口的類需要再次用Thread類包裝後才能調用start方法。(三個Thread對象包裝一個類對象,就實作了資源共享)。

線程的使用的話,注意鎖和同步的使用。(多線程通路共享資源容易出現線程安全問題)

一般情況下,常見的是第二種。

Runnable接口有如下好處:

*①避免點繼承的局限,一個類可以繼承多個接口。

*②适合于資源的共享

11、概括的解釋下線程的幾種可用狀态?

建立( new ):新建立了一個線程對象。

可運作( runnable ):線程對象建立後,其他線程(比如 main 線程)調用了該對象 的 start ()方法。該狀态的線程位于可運作線程池中,等待被線程排程選中,獲 取 cpu 的使用權 。

運作( running ):可運作狀态( runnable )的線程獲得了 cpu 時間片( timeslice ) ,執行程式代碼。

阻塞( block ):阻塞狀态是指線程因為某種原因放棄了 cpu 使用權,也即讓出了 cpu timeslice ,暫時停止運作。直到線程進入可運作( runnable )狀态,才有 機會再次獲得 cpu timeslice 轉到運作( running )狀态。阻塞的情況分三種:

(一). 等待阻塞:運作( running )的線程執行 o . wait ()方法, JVM 會把該線程放 入等待隊列( waitting queue )中。

(二). 同步阻塞:運作( running )的線程在擷取對象的同步鎖時,若該同步鎖 被别的線程占用,則 JVM 會把該線程放入鎖池( lock pool )中。

(三). 其他阻塞: 運作( running )的線程執行 Thread . sleep ( long ms )或 t . join ()方法,或者發出了 I / O 請求時, JVM 會把該線程置為阻塞狀态。            當 sleep ()狀态逾時、 join ()等待線程終止或者逾時、或者 I / O 處理完畢時,線程重新轉入可運作( runnable )狀态。

死亡( dead ):線程 run ()、 main () 方法執行結束,或者因異常退出了 run ()方法,則該線程結束生命周期。死亡的線程不可再次複生

12、同步方法和同步代碼塊的差別是什麼?

同步方法:(粗粒度鎖):

        1.修飾一般方法: public synchronized void method (){...},擷取的是目前調用               對象this上的鎖

        2.修飾靜态方法: public static synchronized void method (){...},擷取目前類的             位元組碼對象上的鎖

③同步代碼塊(細粒度鎖):

         synchronized ( obj ) {...},同步代碼塊可以指定擷取哪個對象上的鎖。

13、什麼是死鎖?

答:所謂死鎖:是指兩個或兩個以上的程序在執行過程中,因争奪資源而造成的一種互相等待的現象,若無外力作用,它們都将無法推進下去。此時稱系統處于死鎖狀态或系統産生了死鎖,這些永遠在互相等待的程序稱為死鎖程序。

14、為什麼Java集合類沒有實作Cloneable和Serializable接口?

答:克隆(cloning)或者序列化(serialization)的語義和含義是跟具體的實作相關的。是以應該由集合類的具體實作類來決定如何被克隆或者序列化

15、Java集合類架構的基本接口有哪些?

1)總共有兩大接口:Collection 和Map ,一個元素集合,一個是鍵值對集合; 其中List和Set接口繼承了Collection接口,一個是有序元素集合,一個是無序元素集合; 而ArrayList和 LinkedList 實作了List接口,HashSet實作了Set接口,這幾個都比較常用; HashMap 和HashTable實作了Map接口,并且HashTable是線程安全的,但是HashMap性能更好;

2)

Java集合類裡最基本的接口有:

Collection:單列集合的根接口

List:元素有序 可重複

ArrayList:類似一個長度可變的數組 。适合查詢,不适合增删

LinkedList:底層是雙向循環連結清單。适合增删,不适合查詢。

Set:元素無序,不可重複

HashSet:根據對象的哈希值确定元素在集合中的位置

TreeSet: 以二叉樹的方式存儲元素,實作了對集合中的元素排序

Map:雙列集合的根接口,用于存儲具有鍵(key)、值(value)映射關系的元素。

HashMap:用于存儲鍵值映射關系,不能出現重複的鍵key

TreeMap:用來存儲鍵值映射關系,不能出現重複的鍵key,所有的鍵按照二叉樹的方式排列

16、什麼是疊代器?

疊代器是一種設計模式,它是一個對象,它可以周遊并選擇序列中的對象,而開發人員不需要了解該序列的底層結構。疊代器通常被稱為“輕量級”對象,因為建立它的代價小。

  Java中的Iterator功能比較簡單,并且隻能單向移動:

17、Iterator和Listiterator的差別是什麼?

答:一.相同點

都是疊代器,當需要對集合中元素進行周遊不需要幹涉其周遊過程時,這兩種疊代器都可以使用。

二.不同點

1.使用範圍不同,Iterator可以應用于所有的集合,Set、List和Map和這些集合的子類型。而ListIterator隻能用于List及其子類型。

2.ListIterator有add方法,可以向List中添加對象,而Iterator不能。

3.ListIterator和Iterator都有hasNext()和next()方法,可以實作順序向後周遊,但是ListIterator有hasPrevious()和previous()方法,可以實作逆向(順序向前)周遊。Iterator不可以。

4.ListIterator可以定位目前索引的位置,nextIndex()和previousIndex()可以實作。Iterator沒有此功能。

5.都可實作删除操作,但是ListIterator可以實作對象的修改,set()方法可以實作。Iterator僅能周遊,不能修改。

18、Java中的Hashmap的工作原理是什麼?

答:java8對hashmap做了優化 ,底層有兩種實作方法,一種是數組和連結清單,一種是數組和紅黑樹,hsahmap會根據資料量選擇存儲結構

if (binCount >= TREEIFY_THRESHOLD - 1) 

當符合這個條件的時候,把連結清單變成treemap,這樣查找效率從o(n)變成了o(log n)

19、hashcode()和equals()方法的重要性展現在什麼地方?

答:Java中的HashMap使用hashCode()和equals()方法來确定鍵值對的索引,當根據鍵擷取值的時候也會用到這兩個方法。如果沒有正确的實作這兩個方法,兩個不同的鍵可能會有相同的hash值,是以,可能會被集合認為是相等的。而且,這兩個方法也用來發現重複元素。是以這兩個方法的實作對HashMap的精确性和正确性是至關重要的。

20、Hashmap和Hashtable有什麼差別?

HashMap幾乎可以等價于Hashtable,除了HashMap是非synchronized的,并可以接受null(HashMap可以接受為null的鍵值(key)和值(value),而Hashtable則不行)。

HashMap是非synchronized,而Hashtable是synchronized,這意味着Hashtable是線程安全的,多個線程可以共享一個Hashtable;而如果沒有正确的同步的話,多個線程是不能共享HashMap的。Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的擴充性更好。

另一個差別是HashMap的疊代器(Iterator)是fail-fast疊代器,而Hashtable的enumerator疊代器不是fail-fast的。是以當有其它線程改變了HashMap的結構(增加或者移除元素),将會抛出ConcurrentModificationException,但疊代器本身的remove()方法移除元素則不會抛出ConcurrentModificationException異常。但這并不是一個一定發生的行為,要看JVM。這條同樣也是Enumeration和Iterator的差別。

由于Hashtable是線程安全的也是synchronized,是以在單線程環境下它比HashMap要慢。如果你不需要同步,隻需要單一線程,那麼使用HashMap性能要好過Hashtable。

HashMap不能保證随着時間的推移Map中的元素次序是不變的

21、數組((Array)和清單(ArrayList)有什麼差別?什麼時候應該使用Arrayi不是Arraylist?

資料類型方面: Array資料可以是基本類型何包裝類型,ArrayList隻能是包裝類型.

容量方面:Array容量是靜态固定的,ArrayList是動态變化的。

支援操作:ArrayList提供更多操作,Array提供的更多依賴于Arrays提供的方法。

使用建議:如果你的操作對象是基本型别,而且需要在空間不足時自動擴增容量,Array便不适合,此時就得使用外覆類的容器了。

                ArrayList存入對象時,抛棄類型資訊,所有對象屏蔽為Object,編譯時不檢查類型,但是運作時會報錯。

               基于效率和類型檢驗,應盡可能使用Array,無法确定數組大小時才使用ArrayList!

22、Arraylist和Linkedlist有什麼差別?

答:1.ArrayList是實作了基于動态數組的資料結構,LinkedList基于連結清單的資料結構。

2.對于随機通路get和set,ArrayList覺得優于LinkedList,因為LinkedList要移動指針。

3.對于新增和删除操作add和remove,LinedList比較占優勢,因為ArrayList要移動資料。

23、Comparable和Comparator接口是幹什麼的?列出它們的差別?

Comparatable接口必須由需要排序的多元素類本身來實作,且在其内部重寫comparaTo()方法;Comparator接口是在需要排序的多元素類的外部(即使用外部類)來實作,且必須在該外部類中重寫compara()方法。

兩者的比較

comparable接口:

優點:對于單元素集合可以實作直接排序

缺點:對于多元素排序,排序依據是固定不可更改的。(元素内部隻能實作一次compareTo方法)

comparator接口:

元素的排序依據時刻變的,是以可以通過定義多個外部類的方式來實作不同的排序。使用時按照需求選取。

建立外部類的代價太大。

24、Java中垃圾回收有什麼目的?什麼時候進行垃圾回收?

目的:回收堆記憶體中不再使用的對象,釋放資源

回收時間:當對象永久地失去引用後,系統會在合适的時候回收它所占的記憶體

垃圾回收的目的是回收堆中已經不在被使用的對象。垃圾回收機制是一個守護線程,優先級别低,其在目前伺服器空閑或堆中老年代等占用率較大時觸發。

若轉載請注明出處!若有疑問,請回複交流!