北京Java筆試題整理
一、什麼是java虛擬機?爲何ava被稱做是「平臺無關的編程語言?
答:Java虛擬機能夠理解爲一個特殊的「操做系統」,只是它鏈接的不是硬件,而是通常的操做系統和java程序。
正是由於有這樣一層操做系統與程序之間的鏈接,Java程序就能在一臺機子上編譯後處處都能運行——只要有對應不一樣系統的Java虛擬機就能夠了。所以Java被稱爲「平臺無關」。
Java虛擬機是一個能夠執行Java字節碼的虛擬機進程。Java源文件被編譯成能被Java虛擬機執行的字節碼文件。java
二、關鍵字是什麼意思?Java中是否能夠覆蓋或者static的方法?
答:static表示靜態的意義,它能夠修飾一個變量,一個方法,被其修飾的變量被稱爲類變量,被其修飾的方法成爲類方法,其隨着類的加載而被加載。
沒法重寫被private修飾的方法,由於被private修飾的父類方法在子類中是不可見的。
static修飾的方法是靜態綁定的,而方法覆蓋是爲了實現多態,是動態綁定,因此static修飾的方法不須要被覆蓋
三、是否能夠在static環境中訪問非static變量?
答:不能。
static變量在java中是屬於類的,在類的全部實例中,它的值都是同樣的。在類被JVM載入時,靜態變量的值就肯定了。
而非靜態變量是屬於實例的,要在new一個實例以後,值纔會存在。
在static環境中,調用非static變量,可能這個變量都還不存在,固然會出錯。
四、java支持的數據類型有哪些?什麼是自動拆裝箱?
答:Java語言支持的8中基本數據類型是:
byte
short
int
long
float
double
boolean
char
自動裝箱是Java編譯器在基本數據類型和對應的對象包裝類型之間作的一個轉化。好比:把int轉化成Integer,double轉化成double,等等。反之就是自動拆箱。
五、Java中的方法覆蓋和方法重載是什麼意思?
答:重載: 在一個類當中才能夠重載,方法名相同,參數個數不一樣或參數個數相同而參數類型不一樣。
覆蓋: 又稱重寫,在派生類(子類)中重寫基類(父類)的方法,名稱、參數、類型都必須相同。
六、Java中,什麼是構造函數?什麼是構造函數重載?什麼是賦值構造函數?
答:當新對象被建立的時候,構造函數會被調用。每個類都有構造函數。在程序員沒有給類提供構造函數的狀況下,Java編譯器會爲這個類建立一個默認的構造函數。
Java中構造函數重載和方法重載很類似。能夠爲一個類建立多個構造函數。每個構造函數必須有它本身惟一的參數列表。
Java不支持像C++中那樣的賦值構造函數,這個不一樣點是由於若是你不本身寫構造函數的狀況下,Java不會建立默認的賦值構造函數。
七、Java支持多繼承嗎?
答:
Java中類不支持多繼承,只支持單繼承(即一個類只有一個父類)。 可是java中的接口能夠間接實現多繼承,,即一個子接口能夠有多個父接口。(接口的做用是用來擴展對象的功能,一個子接口繼承多個父接口,說明子接口擴展了多個功能,當類實現接口時,類就擴展了相應的功能)。
八、進程和線程的區別是什麼?
答:1)進程是什麼? 是具備必定獨立功能的程序、它是系統進行資源分配和調度的一個獨立單位,重點在系統調度和單獨的單位,也就是說進程是能夠獨 立運行的一段程序。
2)線程又是什麼? 線程進程的一個實體,是CPU調度和分派的基本單位,他是比進程更小的能獨立運行的基本單位,線程本身基本上不擁有系統資源。 在運行時,只是暫用一些計數器、寄存器和棧 。2、他們之間的關係 3)一個線程只能屬於一個進程,而一個進程能夠有多個線程,但至少有一個線程(一般說的主線程)。
九、什麼是值傳遞和引用傳遞?
答:值傳遞 指的是在方法調用時,傳遞的參數是按值的拷貝傳遞。
引用傳遞 指的是在方法調用時,傳遞的參數是按引用進行傳遞,其實傳遞的引用的地址,也就是變量所對應的內存空間的地址。
十、建立線程有幾種方式?你喜歡哪種?爲何?
答:程序員
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對象包裝一個類對象,就實現了資源共享)。多線程
線程的使用的話,注意鎖和同步的使用。(多線程訪問共享資源容易出現線程安全問題)框架
通常狀況下,常見的是第二種。
*①避免點繼承的侷限,一個類能夠繼承多個接口。
*②適合於資源的共享
十一、歸納的解釋下線程的幾種可用狀態?
答:
十二、同步方法和同步代碼塊的區別是什麼?
答:
同步方法:(粗粒度鎖):
1.修飾通常方法: public synchronized void method (){...},獲取的是當前調用 對象this上的鎖
2.修飾靜態方法: public static synchronized void method (){...},獲取當前類的 字節碼對象上的鎖
③同步代碼塊(細粒度鎖):
synchronized ( obj ) {...},同步代碼塊能夠指定獲取哪一個對象上的鎖。
1三、什麼是死鎖?
答:所謂死鎖:是指兩個或兩個以上的進程在執行過程當中,因爭奪資源而形成的一種互相等待的現象,若無外力做用,它們都將沒法推動下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的進程稱爲死鎖進程。
1四、爲何Java集合類沒有實現Cloneable和Serializable接口?
答:克隆(cloning)或者序列化(serialization)的語義和含義是跟具體的實現相關的。所以應該由集合類的具體實現類來決定如何被克隆或者序列化
1五、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,全部的鍵按照二叉樹的方式排列
1六、什麼是迭代器?
答:
迭代器是一種設計模式,它是一個對象,它能夠遍歷並選擇序列中的對象,而開發人員不須要了解該序列的底層結構。迭代器一般被稱爲「輕量級」對象,由於建立它的代價小。
Java中的Iterator功能比較簡單,而且只能單向移動:
1七、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僅能遍歷,不能修改。
1八、Java中的Hashmap的工做原理是什麼?
答:java8對hashmap作了優化 ,底層有兩種實現方法,一種是數組和鏈表,一種是數組和紅黑樹,hsahmap會根據數據量選擇存儲結構
if (binCount >= TREEIFY_THRESHOLD - 1)
當符合這個條件的時候,把鏈表變成treemap,這樣查找效率從o(n)變成了o(log n)
1九、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中的元素次序是不變的
2一、數組((Array)和列表(ArrayList)有什麼區別?何時應該使用Arrayi不是Arraylist?
答:
數據類型方面: Array數據能夠是基本類型何包裝類型,ArrayList只能是包裝類型.
容量方面:Array容量是靜態固定的,ArrayList是動態變化的。
支持操做:ArrayList提供更多操做,Array提供的更多依賴於Arrays提供的方法。
使用建議:若是你的操做對象是基本型別,並且須要在空間不足時自動擴增容量,Array便不適合,此時就得使用外覆類的容器了。
ArrayList存入對象時,拋棄類型信息,全部對象屏蔽爲Object,編譯時不檢查類型,可是運行時會報錯。
基於效率和類型檢驗,應儘量使用Array,沒法肯定數組大小時才使用ArrayList!
2二、Arraylist和Linkedlist有什麼區別?
答:1.ArrayList是實現了基於動態數組的數據結構,LinkedList基於鏈表的數據結構。
2.對於隨機訪問get和set,ArrayList以爲優於LinkedList,由於LinkedList要移動指針。
3.對於新增和刪除操做add和remove,LinedList比較佔優點,由於ArrayList要移動數據。
2三、Comparable和Comparator接口是幹什麼的?列出它們的區別?
答:
Comparatable接口必須由須要排序的多元素類自己來實現,且在其內部重寫comparaTo()方法;Comparator接口是在須要排序的多元素類的外部(即便用外部類)來實現,且必須在該外部類中重寫compara()方法。
二者的比較
comparable接口: 優勢:對於單元素集合能夠實現直接排序 缺點:對於多元素排序,排序依據是固定不可更改的。(元素內部只能實現一次compareTo方法) comparator接口: 元素的排序依據時刻變的,因此能夠經過定義多個外部類的方式來實現不一樣的排序。使用時按照需求選取。 建立外部類的代價太大。 2四、Java中垃圾回收有什麼目的?何時進行垃圾回收? 答: 目的:回收堆內存中再也不使用的對象,釋放資源 回收時間:當對象永久地失去引用後,系統會在合適的時候回收它所佔的內存 垃圾回收的目的是回收堆中已經不在被使用的對象。垃圾回收機制是一個守護線程,優先級別低,其在當前服務器空閒或堆中老年代等佔用率較大時觸發。