“面试不败计划”:集合、日期、异常、序列化、其他知识点
點(diǎn)擊上方“好好學(xué)java”,選擇“置頂公眾號(hào)”
優(yōu)秀學(xué)習(xí)資源、干貨第一時(shí)間送達(dá)!
好好學(xué)java
java知識(shí)分享/學(xué)習(xí)資源免費(fèi)分享
關(guān)注
?精彩內(nèi)容?
java實(shí)戰(zhàn)練習(xí)項(xiàng)目教程
全網(wǎng)最全電子圖書分享
你所需要的大數(shù)據(jù)視頻教程
java全套學(xué)習(xí)視頻教程及源碼
關(guān)于集合
思考題:1、Java中的集合及其繼承關(guān)系
思考題:希望大家積極的思考,并且可以踴躍的說出自己的想法,想法不管對(duì)與錯(cuò),只要說出來就是一種提高,所以,希望小伙伴們可以把自己的想法在留言區(qū)給出,這樣大家也可以相互學(xué)習(xí),有啟發(fā)的作用,擴(kuò)展知識(shí)面,提高面試能力~
思考題的解答將會(huì)在第二天給出!
這里寫圖片描述2、poll()方法和remove()方法區(qū)別?
poll() 和 remove() 都是從隊(duì)列中取出一個(gè)元素,但是 poll() 在獲取元素失敗的時(shí)候會(huì)返回空,但是 remove() 失敗的時(shí)候會(huì)拋出異常。
3、LinkedHashMap和PriorityQueue的區(qū)別
PriorityQueue 是一個(gè)優(yōu)先級(jí)隊(duì)列,保證最高或者最低優(yōu)先級(jí)的的元素總是在隊(duì)列頭部,但是 LinkedHashMap 維持的順序是元素插入的順序。當(dāng)遍歷一個(gè) PriorityQueue 時(shí),沒有任何順序保證,但是 LinkedHashMap 課保證遍歷順序是元素插入的順序。
4、WeakHashMap與HashMap的區(qū)別是什么?
WeakHashMap 的工作與正常的 HashMap 類似,但是使用弱引用作為 key,意思就是當(dāng) key 對(duì)象沒有任何引用時(shí),key/value 將會(huì)被回收。
5、ArrayList和LinkedList的區(qū)別?
最明顯的區(qū)別是 ArrrayList底層的數(shù)據(jù)結(jié)構(gòu)是數(shù)組,支持隨機(jī)訪問,而 LinkedList 的底層數(shù)據(jù)結(jié)構(gòu)是雙向循環(huán)鏈表,不支持隨機(jī)訪問。使用下標(biāo)訪問一個(gè)元素,ArrayList 的時(shí)間復(fù)雜度是 O(1),而 LinkedList 是 O(n)。
6、ArrayList和Array有什么區(qū)別?
Array可以容納基本類型和對(duì)象,而ArrayList只能容納對(duì)象。
Array是指定大小的,而ArrayList大小是固定的
7、ArrayList和HashMap默認(rèn)大小?
在 Java 7 中,ArrayList 的默認(rèn)大小是 10 個(gè)元素,HashMap 的默認(rèn)大小是16個(gè)元素(必須是2的冪)。這就是 Java 7 中 ArrayList 和 HashMap 類的代碼片段
private?static?final?int?DEFAULT_CAPACITY?=?10;//from?HashMap.java?JDK?7 static?final?int?DEFAULT_INITIAL_CAPACITY?=?1?<<?4;?//?aka?168、Comparator和Comparable的區(qū)別?
Comparable 接口用于定義對(duì)象的自然順序,而 comparator 通常用于定義用戶定制的順序。Comparable 總是只有一個(gè),但是可以有多個(gè) comparator 來定義對(duì)象的順序。
9、如何實(shí)現(xiàn)集合排序?
你可以使用有序集合,如 TreeSet 或 TreeMap,你也可以使用有順序的的集合,如 list,然后通過 Collections.sort() 來排序。
10、如何打印數(shù)組內(nèi)容
你可以使用 Arrays.toString() 和 Arrays.deepToString() 方法來打印數(shù)組。由于數(shù)組沒有實(shí)現(xiàn) toString() 方法,所以如果將數(shù)組傳遞給 System.out.println() 方法,將無法打印出數(shù)組的內(nèi)容,但是 Arrays.toString() 可以打印每個(gè)元素。
11、LinkedList的是單向鏈表還是雙向?
雙向循環(huán)列表,具體實(shí)現(xiàn)自行查閱源碼.
12、TreeMap是實(shí)現(xiàn)原理
采用紅黑樹實(shí)現(xiàn),具體實(shí)現(xiàn)自行查閱源碼.
13、遍歷ArrayList時(shí)如何正確移除一個(gè)元素
該問題的關(guān)鍵在于面試者使用的是 ArrayList 的 remove() 還是 Iterator 的 remove()方法。這有一段示例代碼,是使用正確的方式來實(shí)現(xiàn)在遍歷的過程中移除元素,而不會(huì)出現(xiàn) ConcurrentModificationException 異常的示例代碼。
14、什么是ArrayMap?它和HashMap有什么區(qū)別?
ArrayMap是Android SDK中提供的,非Android開發(fā)者可以略過.
ArrayMap是用兩個(gè)數(shù)組來模擬map,更少的內(nèi)存占用空間,更高的效率.
具體參考這篇文章:ArrayMap VS HashMap:http://lvable.com/?p=217%5D
15、HashMap的實(shí)現(xiàn)原理
1 HashMap概述: HashMap是基于哈希表的Map接口的非同步實(shí)現(xiàn)。此實(shí)現(xiàn)提供所有可選的映射操作,并允許使用null值和null鍵。此類不保證映射的順序,特別是它不保證該順序恒久不變。
2 HashMap的數(shù)據(jù)結(jié)構(gòu): 在java編程語言中,最基本的結(jié)構(gòu)就是兩種,一個(gè)是數(shù)組,另外一個(gè)是模擬指針(引用),所有的數(shù)據(jù)結(jié)構(gòu)都可以用這兩個(gè)基本結(jié)構(gòu)來構(gòu)造的,HashMap也不例外。HashMap實(shí)際上是一個(gè)“鏈表散列”的數(shù)據(jù)結(jié)構(gòu),即數(shù)組和鏈表的結(jié)合體。
當(dāng)我們往Hashmap中put元素時(shí),首先根據(jù)key的hashcode重新計(jì)算hash值,根絕hash值得到這個(gè)元素在數(shù)組中的位置(下標(biāo)),如果該數(shù)組在該位置上已經(jīng)存放了其他元素,那么在這個(gè)位置上的元素將以鏈表的形式存放,新加入的放在鏈頭,最先加入的放入鏈尾.如果數(shù)組中該位置沒有元素,就直接將該元素放到數(shù)組的該位置上.
需要注意Jdk 1.8中對(duì)HashMap的實(shí)現(xiàn)做了優(yōu)化,當(dāng)鏈表中的節(jié)點(diǎn)數(shù)據(jù)超過八個(gè)之后,該鏈表會(huì)轉(zhuǎn)為紅黑樹來提高查詢效率,從原來的O(n)到O(logn)
16、你了解Fail-Fast機(jī)制嗎
Fail-Fast即我們常說的快速失敗,
更多內(nèi)容參看fail-fast機(jī)制:http://blog.csdn.net/chenssy/article/details/38151189
17、Fail-fast和Fail-safe有什么區(qū)別
Iterator的fail-fast屬性與當(dāng)前的集合共同起作用,因此它不會(huì)受到集合中任何改動(dòng)的影響。Java.util包中的所有集合類都被設(shè)計(jì)為fail->fast的,而java.util.concurrent中的集合類都為fail-safe的。當(dāng)檢測到正在遍歷的集合的結(jié)構(gòu)被改變時(shí),Fail-fast迭代器拋出ConcurrentModificationException,而fail-safe迭代器從不拋出ConcurrentModificationException。
關(guān)于日期
1、SimpleDateFormat是線程安全的嗎?
非常不幸,DateFormat 的所有實(shí)現(xiàn),包括 SimpleDateFormat 都不是線程安全的,因此你不應(yīng)該在多線程序中使用,除非是在對(duì)外線程安全的環(huán)境中使用,如 將 SimpleDateFormat 限制在 ThreadLocal 中。如果你不這么做,在解析或者格式化日期的時(shí)候,可能會(huì)獲取到一個(gè)不正確的結(jié)果。因此,從日期、時(shí)間處理的所有實(shí)踐來說,我強(qiáng)力推薦 joda-time 庫。
2、如何格式化日期?
Java 中,可以使用 SimpleDateFormat 類或者 joda-time 庫來格式日期。DateFormat 類允許你使用多種流行的格式來格式化日期。參見答案中的示例代碼,代碼中演示了將日期格式化成不同的格式,如 dd-MM-yyyy 或 ddMMyyyy。
關(guān)于異常
1、簡單描述java異常體系
相比沒有人不了解異常體系,關(guān)于異常體系的更多信息可以見
2、throw和throws的區(qū)別
throw用于主動(dòng)拋出java.lang.Throwable 類的一個(gè)實(shí)例化對(duì)象,意思是說你可以通過關(guān)鍵字 throw 拋出一個(gè) Error 或者 一個(gè)Exception,如:throw new IllegalArgumentException(“size must be multiple of 2″),
而throws 的作用是作為方法聲明和簽名的一部分,方法被拋出相應(yīng)的異常以便調(diào)用者能處理。Java 中,任何未處理的受檢查異常強(qiáng)制在 throws 子句中聲明。
關(guān)于序列化
1、Java 中,Serializable 與 Externalizable 的區(qū)別
Serializable 接口是一個(gè)序列化 Java 類的接口,以便于它們可以在網(wǎng)絡(luò)上傳輸或者可以將它們的狀態(tài)保存在磁盤上,是 JVM 內(nèi)嵌的默認(rèn)序列化方式,成本高、脆弱而且不安全。Externalizable 允許你控制整個(gè)序列化過程,指定特定的二進(jìn)制格式,增加安全機(jī)制。
其他知識(shí)點(diǎn)
1、XML解析的幾種方式和特點(diǎn)
DOM,SAX,PULL三種解析方式:
DOM:消耗內(nèi)存:先把xml文檔都讀到內(nèi)存中,然后再用DOM API來訪問樹形結(jié)構(gòu),并獲取數(shù)據(jù)。這個(gè)寫起來很簡單,但是很消耗內(nèi)存。要是數(shù)據(jù)過大,手機(jī)不夠牛逼,可能手機(jī)直接死機(jī)
SAX:解析效率高,占用內(nèi)存少,基于事件驅(qū)動(dòng)的:更加簡單地說就是對(duì)文檔進(jìn)行順序掃描,當(dāng)掃描到文檔(document)開始與結(jié)束、元素(element)開始與結(jié)束、文檔(document)結(jié)束等地方時(shí)通知事件處理函數(shù),由事件處理函數(shù)做相應(yīng)動(dòng)作,然后繼續(xù)同樣的掃描,直至文檔結(jié)束。
PULL:與 SAX 類似,也是基于事件驅(qū)動(dòng),我們可以調(diào)用它的next()方法,來獲取下一個(gè)解析事件(就是開始文檔,結(jié)束文檔,開始標(biāo)簽,結(jié)束標(biāo)簽),當(dāng)處于某個(gè)元素時(shí)可以調(diào)用XmlPullParser的getAttributte()方法來獲取屬性的值,也可調(diào)用它的nextText()獲取本節(jié)點(diǎn)的值。
3、JDK 1.7特性
然 JDK 1.7 不像 JDK 5 和 8 一樣的大版本,但是,還是有很多新的特性,如 try-with-resource 語句,這樣你在使用流或者資源的時(shí)候,就不需要手動(dòng)關(guān)閉,Java 會(huì)自動(dòng)關(guān)閉。Fork-Join 池某種程度上實(shí)現(xiàn) Java 版的 Map-reduce。允許 Switch 中有 String 變量和文本。菱形操作符(\<>)用于類型推斷,不再需要在變量聲明的右邊申明泛型,因此可以寫出可讀寫更強(qiáng)、更簡潔的代碼
4、JDK 1.8特性
java 8 在 Java 歷史上是一個(gè)開創(chuàng)新的版本,下面 JDK 8 中 5 個(gè)主要的特性:
Lambda 表達(dá)式,允許像對(duì)象一樣傳遞匿名函數(shù)
Stream API,充分利用現(xiàn)代多核 CPU,可以寫出很簡潔的代碼
Date 與 Time API,最終,有一個(gè)穩(wěn)定、簡單的日期和時(shí)間庫可供你使用
擴(kuò)展方法,現(xiàn)在,接口中可以有靜態(tài)、默認(rèn)方法。
重復(fù)注解,現(xiàn)在你可以將相同的注解在同一類型上使用多次。
5、Maven和ANT有什么區(qū)別?
雖然兩者都是構(gòu)建工具,都用于創(chuàng)建 Java 應(yīng)用,但是 Maven 做的事情更多,在基于“約定優(yōu)于配置”的概念下,提供標(biāo)準(zhǔn)的Java 項(xiàng)目結(jié)構(gòu),同時(shí)能為應(yīng)用自動(dòng)管理依賴(應(yīng)用中所依賴的 JAR 文件.
6、JDBC最佳實(shí)踐
優(yōu)先使用批量操作來插入和更新數(shù)據(jù)
使用PreparedStatement來避免SQL漏洞
使用數(shù)據(jù)連接池
通過列名來獲取結(jié)果集
8、IO操作最佳實(shí)踐
使用有緩沖的IO類,不要單獨(dú)讀取字節(jié)或字符
使用NIO和NIO 2或者AIO,而非BIO
在finally中關(guān)閉流
使用內(nèi)存映射文件獲取更快的IO
往期推薦
“365算法每日學(xué)計(jì)劃”:05打卡-圖解冒泡排序(多解法)
并發(fā)基礎(chǔ)篇(四): 深入淺出java線程的狀態(tài)
“365算法每日學(xué)計(jì)劃”:04打卡-自己動(dòng)手寫一個(gè)單鏈表
并發(fā)基礎(chǔ)篇(四): 深入淺出java線程的狀態(tài)
附上熱門QQ群,存放資源和歷史資料,500容量(低門檻付費(fèi)群),長按二維碼入群
????????????????????????????????????????????? ? ? ? 長按二維碼關(guān)注
總結(jié)
以上是生活随笔為你收集整理的“面试不败计划”:集合、日期、异常、序列化、其他知识点的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: “365算法每日学计划”:05打卡-图解
- 下一篇: 算法每日学打卡:java语言基础题目打卡