本篇文章會(huì)對(duì)面試中常遇到的Java技術(shù)點(diǎn)進(jìn)行全面深入的總結(jié)(閱讀本文需要有一定的Java基礎(chǔ);若您初涉Java,可以通過(guò)這些問(wèn)題建立起對(duì)Java初步的印象,待有了一定基礎(chǔ)后再后過(guò)頭來(lái)看收獲會(huì)更大),喜歡的朋友可以參考下。
創(chuàng)新互聯(lián)公司專注于通化企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站設(shè)計(jì),商城網(wǎng)站制作。通化網(wǎng)站建設(shè)公司,為通化等地區(qū)提供建站服務(wù)。全流程定制設(shè)計(jì),專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)公司專業(yè)和態(tài)度為您提供的服務(wù)1. Java中的原始數(shù)據(jù)類型都有哪些,它們的大小及對(duì)應(yīng)的封裝類是什么?
(1)boolean
boolean數(shù)據(jù)類型非true即false。這個(gè)數(shù)據(jù)類型表示1 bit的信息,但是它的大小并沒(méi)有精確定義。
《Java虛擬機(jī)規(guī)范》中如是說(shuō):“雖然定義了boolean
這種數(shù)據(jù)類型,但是只對(duì)它提供了非常有限的支持。在Java虛擬機(jī)中沒(méi)有任何供boolean值專用的字節(jié)碼指令,Java語(yǔ)言表達(dá)式所操作的boolean值,在編譯之后都使用Java虛擬機(jī)中的int數(shù)據(jù)類型來(lái)代替,而boolean數(shù)組將會(huì)被編碼成Java虛擬機(jī)的byte數(shù)組,每個(gè)元素boolean元素占8位
”。這樣我們可以得出boolean類型單獨(dú)使用是4個(gè)字節(jié),在數(shù)組中又是1個(gè)字節(jié)。那虛擬機(jī)為什么要用int來(lái)代替boolean呢?為什么不用byte或short
,這樣不是更節(jié)省內(nèi)存空間嗎?實(shí)際上,使用int的原因是,對(duì)于當(dāng)下32位的CPU來(lái)說(shuō),一次進(jìn)行32位的數(shù)據(jù)交換更加高效。
綜上,我們可以知道:官方文檔對(duì)boolean類型沒(méi)有給出精確的定義,《Java虛擬機(jī)規(guī)范》給出了“單獨(dú)時(shí)使用4個(gè)字節(jié),boolean數(shù)組時(shí)1個(gè)字節(jié)”的定義,具體還要看虛擬機(jī)實(shí)現(xiàn)是否按照規(guī)范來(lái),所以1個(gè)字節(jié)、4個(gè)字節(jié)都是有可能的。這其實(shí)是一種時(shí)空權(quán)衡。
boolean類型的封裝類是Boolean。
(2)byte——1 byte——Byte
(3)short——2 bytes——Short
(4)int——4 bytes——Integer
(5)long——8 bytes——Long
(6)float——4 bytes——Float
(7)double——8 bytes——Double
(8)char——2 bytes——Character
2. 談一談”==“與”equals()"的區(qū)別。
《Think in Java》中說(shuō):“關(guān)系操作符生成的是一個(gè)boolean結(jié)果,它們計(jì)算的是操作數(shù)的值之間的關(guān)系”。
"=="
判斷的是兩個(gè)對(duì)象的內(nèi)存地址是否一樣,適用于原始數(shù)據(jù)類型和枚舉類型(它們的變量存儲(chǔ)的是值本身,而引用類型變量存儲(chǔ)的是引用);equals
是Object類的方法,Object對(duì)它的實(shí)現(xiàn)是比較內(nèi)存地址,我們可以重寫這個(gè)方法來(lái)自定義“相等”這個(gè)概念。比如類庫(kù)中的String、Date
等類就對(duì)這個(gè)方法進(jìn)行了重寫。
綜上,對(duì)于枚舉類型和原始數(shù)據(jù)類型的相等性比較,應(yīng)該使用"==";對(duì)于引用類型的相等性比較,應(yīng)該使用equals方法。
3. Java中的四種引用及其應(yīng)用場(chǎng)景是什么?
強(qiáng)引用: 通常我們使用new操作符創(chuàng)建一個(gè)對(duì)象時(shí)所返回的引用即為強(qiáng)引用
軟引用: 若一個(gè)對(duì)象只能通過(guò)軟引用到達(dá),那么這個(gè)對(duì)象在內(nèi)存不足時(shí)會(huì)被回收,可用于圖片緩存中,內(nèi)存不足時(shí)系統(tǒng)會(huì)自動(dòng)回收不再使用的Bitmap
弱引用: 若一個(gè)對(duì)象只能通過(guò)弱引用到達(dá),那么它就會(huì)被回收(即使內(nèi)存充足),同樣可用于圖片緩存中,這時(shí)候只要Bitmap不再使用就會(huì)被回收
虛引用: 虛引用是Java中最“弱”的引用,通過(guò)它甚至無(wú)法獲取被引用的對(duì)象,它存在的唯一作用就是當(dāng)它指向的對(duì)象回收時(shí),它本身會(huì)被加入到引用隊(duì)列中,這樣我們可以知道它指向的對(duì)象何時(shí)被銷毀。
4. object中定義了哪些方法?
clone(), equals(), hashCode(), toString(), notify(), notifyAll(), wait(), finalize(), getClass()
5. hashCode的作用是什么?
請(qǐng)參見散列表的基本原理與實(shí)現(xiàn)
6. ArrayList, LinkedList, Vector的區(qū)別是什么?
ArrayList: 內(nèi)部采用數(shù)組存儲(chǔ)元素,支持高效隨機(jī)訪問(wèn),支持動(dòng)態(tài)調(diào)整大小
LinkedList: 內(nèi)部采用鏈表來(lái)存儲(chǔ)元素,支持快速插入/刪除元素,但不支持高效地隨機(jī)訪問(wèn)
Vector: 可以看作線程安全版的ArrayList
7. String, StringBuilder, StringBuffer的區(qū)別是什么?
String: 不可變的字符序列,若要向其中添加新字符需要?jiǎng)?chuàng)建一個(gè)新的String對(duì)象
StringBuilder: 可變字符序列,支持向其中添加新字符(無(wú)需創(chuàng)建新對(duì)象)
StringBuffer: 可以看作線程安全版的StringBuilder
8. Map, Set, List, Queue、Stack的特點(diǎn)及用法。
Map<K, V>:
Java中存儲(chǔ)鍵值對(duì)的數(shù)據(jù)類型都實(shí)現(xiàn)了這個(gè)接口,表示“映射表”。支持的兩個(gè)核心操作是get(Object key)
以及put(K key, V value),
分別用來(lái)獲取鍵對(duì)應(yīng)的值以及向映射表中插入鍵值對(duì)。
Set<E>:
實(shí)現(xiàn)了這個(gè)接口的集合類型中不允許存在重復(fù)的元素,代表數(shù)學(xué)意義上的“集合”。它所支持的核心操作有add(E e),remove(Object o), contains(Object o),分別用于添加元素,刪除元素以及判斷給定元素是否存在于集中。
List<E>: Java中集合框架中的列表類型都實(shí)現(xiàn)了這個(gè)接口,表示一種有序序列。支持get(int index), add(E e)等操作。
Queue<E>: Java集合框架中的隊(duì)列接口,代表了“先進(jìn)先出”隊(duì)列。支持add(E element), remove()等操作。
Stack<E>: Java集合框架中表示堆棧的數(shù)據(jù)類型,堆棧是一種“后進(jìn)先出”的數(shù)據(jù)結(jié)構(gòu)。支持push(E item), pop()等操作。
更詳細(xì)的說(shuō)明請(qǐng)參考官方文檔,對(duì)相關(guān)數(shù)據(jù)結(jié)構(gòu)不太熟悉的同學(xué)可以參考《算法導(dǎo)論》或其他相關(guān)書籍。
9. HashMap和HashTable的區(qū)別
HashTable是線程安全的,而HashMap不是
HashMap中允許存在null鍵和null值,而HashTable中不允許
更加詳細(xì)的分析請(qǐng)參考深入解析HashMap、HashTable
10. HashMap的實(shí)現(xiàn)原理
簡(jiǎn)單的說(shuō),HashMap的底層實(shí)現(xiàn)是“基于拉鏈法的散列表”。詳細(xì)分析請(qǐng)參考深入解析HashMap、HashTable
11. ConcurrentHashMap的實(shí)現(xiàn)原理
ConcurrentHashMap是支持并發(fā)讀寫的HashMap,它的特點(diǎn)是讀取數(shù)據(jù)時(shí)無(wú)需加鎖,寫數(shù)據(jù)時(shí)可以保證加鎖粒度盡可能的小。由于其內(nèi)部采用“分段存儲(chǔ)”,只需對(duì)要進(jìn)行寫操作的數(shù)據(jù)所在的“段”進(jìn)行加鎖。關(guān)于ConcurrentHashMap底層實(shí)現(xiàn)的詳細(xì)分析請(qǐng)參考Java并發(fā)編程:并發(fā)容器之ConcurrentHashMap
12. TreeMap, LinkedHashMap, HashMap的區(qū)別是什么?
HashMap的底層實(shí)現(xiàn)是散列表,因此它內(nèi)部存儲(chǔ)的元素是無(wú)序的;
TreeMap的底層實(shí)現(xiàn)是紅黑樹,所以它內(nèi)部的元素的有序的。排序的依據(jù)是自然序或者是創(chuàng)建TreeMap時(shí)所提供的比較器(Comparator)對(duì)象。
LinkedHashMap能夠記住插入元素的順序。
更加詳細(xì)的說(shuō)明請(qǐng)參考HashMap,LinkedMap,TreeMap的區(qū)別
13. Collection與Collections的區(qū)別是什么?
Collection<E>是Java集合框架中的基本接口;Collections是Java集合框架提供的一個(gè)工具類,其中包含了大量用于操作或返回集合的靜態(tài)方法。
對(duì)Java集合框架還不太熟悉的小伙伴請(qǐng)參考Java核心技術(shù)點(diǎn)之集合框架
14. 對(duì)于“try-catch-finally”,若try語(yǔ)句塊中包含“return”語(yǔ)句,finally語(yǔ)句塊會(huì)執(zhí)行嗎?
答案是會(huì)執(zhí)行。只有兩種情況finally塊中的語(yǔ)句不會(huì)被執(zhí)行:
調(diào)用了System.exit()方法;
JVM“崩潰”了。
15. Java中的異常層次結(jié)構(gòu)
Java中的異常層次結(jié)構(gòu)如下圖所示:
我們可以看到Throwable
類是異常層級(jí)中的基類。Error類表示內(nèi)部錯(cuò)誤,這類錯(cuò)誤使我們無(wú)法控制的;Exception表示異常,RuntimeException
及其子類屬于未檢查異常,這類異常包括ArrayIndexOutOfBoundsException、NullPointerException
等,我們應(yīng)該通過(guò)條件判斷等方式語(yǔ)句避免未檢查異常的發(fā)生。IOException
及其子類屬于已檢查異常,編譯器會(huì)檢查我們是否為所有可能拋出的已檢查異常提供了異常處理器,若沒(méi)有則會(huì)報(bào)錯(cuò)。對(duì)于未檢查異常,我們無(wú)需捕獲(當(dāng)然Java也允許我們捕獲,但我們應(yīng)該做的事避免未檢查異常的發(fā)生)。
16. Java面向?qū)ο蟮娜齻€(gè)特征與含義
三大特征:封裝、繼承、多態(tài)。詳細(xì)介紹請(qǐng)戳Java面向?qū)ο笕筇匦?/p>
17. Override, Overload的含義與區(qū)別
Override表示“重寫”,是子類對(duì)父類中同一方法的重新定義
Overload表示“重載”,也就是定義一個(gè)與已定義方法名稱相同但簽名不同的新方法
18. 接口與抽象類的區(qū)別
接口是一種約定,實(shí)現(xiàn)接口的類要遵循這個(gè)約定;抽象類本質(zhì)上是一個(gè)類,使用抽象類的代價(jià)要比接口大。接口與抽象類的對(duì)比如下:
抽象類中可以包含屬性,方法(包含抽象方法與有著具體實(shí)現(xiàn)的方法),常量;接口只能包含常量和方法聲明。
抽象類中的方法和成員變量可以定義可見性(比如public、private等);而接口中的方法只能為public(缺省為public)。
一個(gè)子類只能有一個(gè)父類(具體類或抽象類);而一個(gè)接口可以繼承一個(gè)多個(gè)接口,一個(gè)類也可以實(shí)現(xiàn)多個(gè)接口。
子類中實(shí)現(xiàn)父類中的抽象方法時(shí),可見性可以大于等于父類中的;而接口實(shí)現(xiàn)類中的接口 方法的可見性只能與接口中相同(public)。
19. 靜態(tài)內(nèi)部類與非靜態(tài)內(nèi)部類的區(qū)別
靜態(tài)內(nèi)部類不會(huì)持有外圍類的引用,而非靜態(tài)內(nèi)部類會(huì)隱式持有外圍類的一個(gè)引用。
欲進(jìn)一步了解內(nèi)部類,請(qǐng)戳Java核心技術(shù)點(diǎn)之內(nèi)部類
20. Java中多態(tài)的實(shí)現(xiàn)原理
所謂多態(tài),指的就是父類引用指向子類對(duì)象,調(diào)用方法時(shí)會(huì)調(diào)用子類的實(shí)現(xiàn)而不是父類的實(shí)現(xiàn)。多態(tài)的實(shí)現(xiàn)的關(guān)鍵在于“動(dòng)態(tài)綁定”。詳細(xì)介紹請(qǐng)戳Java動(dòng)態(tài)綁定的內(nèi)部實(shí)現(xiàn)機(jī)制
21. 簡(jiǎn)述Java中創(chuàng)建新線程的兩種方法
繼承Thread類(假設(shè)子類為MyThread),并重寫run()方法,然后new一個(gè)MyThread對(duì)象并對(duì)其調(diào)用start()即可啟動(dòng)新線程。
實(shí)現(xiàn)Runnable接口(假設(shè)實(shí)現(xiàn)類為MyRunnable),而后將MyRunnable對(duì)象作為參數(shù)傳入Thread構(gòu)造器,在得到的Thread對(duì)象上調(diào)用start()方法即可。
22. 簡(jiǎn)述Java中進(jìn)行線程同步的方法
volatile: Java Memory Model保證了對(duì)同一個(gè)volatile變量的寫happens before對(duì)它的讀;
synchronized: 可以來(lái)對(duì)一個(gè)代碼塊或是對(duì)一個(gè)方法上鎖,被“鎖住”的地方稱為臨界區(qū),進(jìn)入臨界區(qū)的線程會(huì)獲取對(duì)象的monitor,這樣其他嘗試進(jìn)入臨界區(qū)的線程會(huì)因無(wú)法獲取monitor而被阻塞。由于等待另一個(gè)線程釋放monitor而被阻塞的線程無(wú)法被中斷。
ReentrantLock: 嘗試獲取鎖的線程可以被中斷并可以設(shè)置超時(shí)參數(shù)。
更加詳細(xì)的介紹請(qǐng)戳Java核心技術(shù)點(diǎn)之多線程
23. 簡(jiǎn)述Java中具有哪幾種粒度的鎖
Java中可以對(duì)類、對(duì)象、方法或是代碼塊上鎖。更加詳細(xì)的介紹請(qǐng)戳Java核心技術(shù)點(diǎn)之多線程
24. 給出“生產(chǎn)者-消費(fèi)者”問(wèn)題的一種解決方案
使用阻塞隊(duì)列:
public class BlockingQueueTest { private int size = 20; private ArrayBlockingQueue<Integer> blockingQueue = new ArrayBlockingQueue<>(size); public static void main(String[] args) { BlockingQueueTest test = new BlockingQueueTest(); Producer producer = test.new Producer(); Consumer consumer = test.new Consumer(); producer.start(); consumer.start(); } class Consumer extends Thread{ @Override public void run() { while(true){ try { //從阻塞隊(duì)列中取出一個(gè)元素 queue.take(); System.out.println("隊(duì)列剩余" + queue.size() + "個(gè)元素"); } catch (InterruptedException e) { } } } } class Producer extends Thread{ @Override public void run() { while (true) { try { //向阻塞隊(duì)列中插入一個(gè)元素 queue.put(1); System.out.println("隊(duì)列剩余空間:" + (size - queue.size())); } catch (InterruptedException e) { } } } } }
本文名稱:Java面試問(wèn)題知識(shí)點(diǎn)總結(jié)-創(chuàng)新互聯(lián)
標(biāo)題URL:http://chinadenli.net/article6/dhihog.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應(yīng)網(wǎng)站、網(wǎng)站營(yíng)銷、品牌網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、App設(shè)計(jì)、企業(yè)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容