一、HashMap的工做原理java
二、ConcurrentHashMap實現原理linux
ConcurrentHashMap的同步是採用分段鎖的形式,一個ConcurrentHashMap由多個segment組成,每個segment都包含了一個HashEntry數組的hashtable, 每個segment包含了對本身的hashtable的操做,好比get,put,replace等操做,這些操做發生的時候,對本身的hashtable進行鎖定。因爲每個segment寫操做只鎖定本身的hashtable,因此可能存在多個線程同時寫的狀況,性能無疑好於只有一個hashtable鎖定的狀況。web
首先,它是一個數據結構,有點像HashMap,能夠保存"key : value"鍵值對,可是一個ThreadLocal只能保存一個,而且各個線程的數據互不干擾,它是一個以ThreadLocal對象爲鍵、任意對象爲值的存儲結構。能夠經過set(T)方法設置一個值,在當前線程下以get()方法獲取到原先設置的值。應用場景:在多線程環境下,如何防止本身的變量被其它線程篡改,就能夠用到ThreadLocal。redis
原理:每一個Thread維護一個ThreadLocalMap映射表,這個映射表的key是ThreadLocal實例自己,value是真正須要存儲的Object。算法
在ThreadLoalMap中,也是初始化一個大小16的Entry數組,Entry對象用來保存每個key-value鍵值對,只不過這裏的key永遠都是ThreadLocal對象,ThreadLocalMap是使用ThreadLocal的弱引用做爲Key的,經過ThreadLocal對象的set方法,結果把ThreadLocal對象本身當作key,放進了ThreadLoalMap中。
spring
缺陷:ThreadLocal可能致使內存泄漏,緣由:當使用ThreadLocal保存一個value時,會在ThreadLocalMap中的數組插入一個Entry對象,按理說key-value都應該以強引用保存在Entry對象中,但在ThreadLocalMap的實現中,key被保存到了WeakReference對象中。這就致使了一個問題,ThreadLocal在沒有外部強引用時,發生GC時會被回收,若是建立ThreadLocal的線程一直持續運行,那麼這個Entry對象中的value就有可能一直得不到回收,發生內存泄露。【簡單的說就是本該回收的對象一直都沒有被回收。】sql
如何避免:只要清除ThreadLocalMap中key爲null的Entry對象,這樣對應的value就沒有GC Roots可達了,下次GC的時候就能夠被回收,固然若是調用remove方法,確定會刪除對應的Entry對象。若是使用ThreadLocal的set方法以後,沒有顯示的調用remove方法,就有可能發生內存泄露,因此養成良好的編程習慣十分重要,使用完ThreadLocal以後,記得調用remove方法。數據庫
四、volatile關鍵字編程
一個共享變量(類的成員變量、類的靜態成員變量)被volatile修飾以後,保證了不一樣線程對這個變量進行操做時的可見性,即一個線程修改了某個變量的值,這新值對其餘線程來講是當即可見的。使用volatile關鍵字會強制將修改的值當即寫入主存,使其它線程的工做內存中的這個變量失效,必須再次從主內存中從新讀取。volatile保證原子性嗎?答案是不能,根源就在這裏,自增操做不是原子性操做,並且volatile也沒法保證對變量的任何操做都是原子性的。可使用synchronized、加鎖、和atomicInteger實現原子性。設計模式
4.一、wait和sleep
wait是Object類中的方法,而sleep是Thread類中的方法。
最主要的是sleep方法調用以後,並沒有釋放鎖。使得線程仍然能夠同步控制。sleep不會讓出系統資源;
而wait是進入線程等待池中等待,讓出系統資源。
調用wait方法的線程,不會本身喚醒,須要線程調用 notify / notifyAll 方法喚醒等待池中的全部線程,纔會進入就緒隊列中等待系統分配資源。sleep方法會自動喚醒,若是時間不到,想要喚醒,可使用interrupt方法強行打斷。
使用範圍:
sleep能夠在任何地方使用。而wait,notify,notifyAll只能在同步控制方法或者同步控制塊中使用。
sleep必須捕獲異常,而wait,notify,notifyAll的不須要捕獲異常
五、爲何String要設計成不可變的
六、數據庫的ACID是什麼意思?
所謂事務,它是一個操做序列,這些操做要麼都執行,要麼都不執行,它是一個不可分割的工做單位。
原子性是指事務是一個不可再分割的工做單位,事務中的操做要麼都發生,要麼都不發生。
一致性是指在事務開始以前和事務結束之後,數據庫的完整性約束沒有被破壞。這是說數據庫事務不能破壞關係數據的完整性以及業務邏輯上的一致性。
多個事務併發訪問時,事務之間是隔離的,一個事務不該該影響其它事務運行效果。
持久性,意味着在事務完成之後,該事務所對數據庫所做的更改便持久的保存在數據庫之中,並不會被回滾。
七、樂觀鎖和悲觀鎖及其適用場景
樂觀鎖(Optimistic Lock), 顧名思義,就是很樂觀,每次去拿數據的時候都認爲別人不會修改,因此不會上鎖,可是在更新的時候會判斷一下在此期間別人有沒有去更新這個數據,可使用版本號等機制。樂觀鎖適用於多讀的應用類型,這樣能夠提升吞吐量。樂觀鎖解決不了髒讀。
悲觀鎖(Pessimistic Lock), 顧名思義,就是很悲觀,每次去拿數據的時候都認爲別人會修改,因此每次在拿數據的時候都會上鎖,這樣別人想拿這個數據就會block【阻塞】直到它拿到鎖。傳統的關係型數據庫裏邊就用到了不少這種鎖機制,好比行鎖,表鎖等,讀鎖,寫鎖等,都是在作操做以前先上鎖。
兩種鎖各有優缺點,不可認爲一種好於另外一種,像樂觀鎖適用於寫比較少的狀況下,即衝突真的不多發生的時候,這樣能夠省去了鎖的開銷,加大了系統的整個吞吐量。但若是常常產生衝突,上層應用會不斷的進行retry,這樣反卻是下降了性能,因此這種狀況下用悲觀鎖就比較合適。
八、數據庫索引
參考:http://blog.csdn.net/kennyrose/article/details/7532032
索引的實現一般使用B樹及其變種B+樹。
建立索引能夠大大提升系統的性能。
第一,經過建立惟一性索引,能夠保證數據庫表中每一行數據的惟一性。
第二,能夠大大加快數據的檢索速度,這也是建立索引的最主要的緣由。
缺點:
第一,索引須要佔物理空間,除了數據表佔數據空間以外,每個索引還要佔必定的物理空間,若是要創建聚簇索引,那麼須要的空間就會更大。
第二,當對錶中的數據進行增長、刪除和修改的時候,索引也要動態的維護,花的時間比較多。
應該建立索引的列:
(1)、在常常須要搜索的列上,能夠加快搜索的速度
(2)、在常常用在鏈接的列上,這些列主要是一些外鍵,能夠加快鏈接的速度
(3)、在常常須要根據範圍進行搜索的列上建立索引,由於索引已經排序,其指定的範圍是連續的
(4)、在常常須要排序的列上建立索引,由於索引已經排序,這樣查詢能夠利用索引的排序,加快排序查詢時間
(5)、在常用在WHERE子句中的列上面建立索引,加快條件的判斷速度。
不該該建立索引的列:
(1)、對於那些在查詢中不多使用或者參考的列不該該建立索引
(2)、對於那些只有不多數據值的列也不該該增長索引。例如性別等
(3)、對於那些定義爲text, image和bit數據類型的列不該該增長索引
根據數據庫的功能,能夠在數據庫設計器中建立三種索引:惟一索引、主鍵索引和彙集索引。
惟一索引
惟一索引是不容許其中任何兩行具備相同索引值的索引。
主鍵索引
數據庫表常常有一列或列組合,其值惟一標識表中的每一行。該列稱爲表的主鍵。
在數據庫關係圖中爲表定義主鍵將自動建立主鍵索引,主鍵索引是惟一索引的特定類型。該索引要求主鍵中的每一個值都惟一。當在查詢中使用主鍵索引時,它還容許對數據的快速訪問。
彙集索引
在彙集索引中,表中行的物理順序與鍵值的邏輯(索引)順序相同。一個表只能包含一個彙集索引。
九、事務
DEFAULT | 使用當前數據庫默認的隔離級別。 |
READ_UNCOMMITD 可讀未提交的 |
在一個事務裏能夠讀取到另外一個事務未提交的數據,會產生髒讀、不可重複讀、幻讀。 |
READ_COMMITTED 提交了才能讀 |
只有當一個事務提交後,才能被另外一個事務讀取到數據,不會產生髒讀,會產生不可重複讀、幻讀。 |
REPEATABLE_READ 可重複讀 |
實現了READ_COMMITTED級別,並且一個事務讀取了數據,另外一個事務不容許修改。不會產生髒讀、不可重複讀,會產生幻讀。 |
SERIALIZABLE 序列化讀寫 |
要求事務按照順序執行,不會產生髒讀、不可重複讀、幻讀,性能極差嚴重影響性能。 |
REQUIRED | 必需要在事務下執行,若是當前存在事務則加入該事務,不然建立新的事務執行。例如: A方法調用B方法,A方法已經在事務下了,調用B的時候,B會加入到A的事務中,處於同一事務下,若是出錯全部的操做都將回滾。 |
SUPPORTS | 當前若是存在事務則加入該事務,若是沒有就不用事務執行。 |
MANDATORY | 必需要在事務下執行,若是當前存在事務則加入該事務,若是不存在事務則拋異常。 |
REQUIRES_NEW | 必需要在一個新的事務下執行,若是當前存在事務,則會建立新的事務執行,若是出現錯誤不會回滾其它事務。例如:A調用B,B出錯不會致使A事務數據回滾。 |
NOT_SUPPORTED | 不能在事務下執行,若是當前存在事務則把當前事務掛起。 |
NEVER | 不能在事務下執行,若是當前存在事務則拋異常。 |
NESTED | 若是當前存在事務,則會建立新的事務執行。具體的這個我也不是怎麼清楚,不多用到。 |
十、Redis底層數據結構有哪些
在 redis 中一共有5種數據結構、String、list、list、set、sortSet,
(1)、String,String 數據結構是簡單的 key-value 類型,value 不只能夠是 String,也能夠是數字.
(2)、HASH,Redis 的 Hash 結構可使你像在數據庫中 Update 一個屬性同樣只修改某一項屬性值。應用有:存儲、讀取、修改用戶屬性
(3)、List 說白了就是鏈表(redis 使用雙端鏈表實現的 List)。使用 List 結構,咱們能夠輕鬆地實現最新消息排行等功能(好比新浪微博的 TimeLine )。List 的另外一個應用就是消息隊列,能夠利用 List 的 *PUSH 操做,將任務存在 List 中,而後工做線程再用 POP 操做將任務取出進行執行。Redis 還提供了操做 List 中某一段元素的 API,你能夠直接查詢,刪除 List 中某一段的元素。
(4)、Set,Set 就是一個集合,集合的概念就是一堆不重複值的組合。利用 Redis 提供的 Set 數據結構,能夠存儲一些集合性的數據。應用:1.共同好友、二度好友2.利用惟一性,能夠統計訪問網站的全部獨立 IP 3.好友推薦的時候,根據 tag 求交集,大於某個 threshold 就能夠推薦。
(5)、和Sets相比,Sorted Sets是將 Set 中的元素增長了一個權重參數 score,使得集合中的元素可以按 score 進行有序排列,應用:帶有權重的元素,好比一個遊戲的用戶得分排行榜
(6) 訂閱-發佈系統
Pub/Sub 從字面上理解就是發佈(Publish)與訂閱(Subscribe),在 Redis 中,你能夠設定對某一個 key 值進行消息發佈及消息訂閱,當一個 key 值上進行了消息發佈後,全部訂閱它的客戶端都會收到相應的消息。這一功能最明顯的用法就是用做實時消息系統,好比普通的即時聊天,羣聊等功能。
(7)、事務——Transactions
Redis 事務能夠一次執行多個命令, 而且帶有如下兩個重要的保證:a、事務是一個單獨的隔離操做:事務中的全部命令都會序列化、按順序地執行。事務在執行的過程當中,不會被其餘客戶端發送來的命令請求所打斷。b、事務是一個原子操做:事務中的命令要麼所有被執行,要麼所有都不執行。
十一、線程池實現和原理
到這裏,大部分朋友應該對任務提交給線程池以後到被執行的整個過程有了一個基本的瞭解,下面總結一下:
1)首先,要清楚corePoolSize和maximumPoolSize的含義;
2)其次,要知道Worker是用來起到什麼做用的;
3)要知道任務提交給線程池以後的處理策略,這裏總結一下主要有4點:
1
2
3
4
|
ThreadPoolExecutor.AbortPolicy:丟棄任務並拋出RejectedExecutionException異常。
ThreadPoolExecutor.DiscardPolicy:也是丟棄任務,可是不拋出異常。
ThreadPoolExecutor.DiscardOldestPolicy:丟棄隊列最前面的任務,而後從新嘗試執行任務(重複此過程)
ThreadPoolExecutor.CallerRunsPolicy:由調用線程處理該任務
|
一個線程池包括如下四個基本組成部分:
(1)、線程池管理器(ThreadPool):用於建立並管理線程池,包括 建立線程池,銷燬線程池,添加新任務;
(2)、工做線程(PoolWorker):線程池中線程,在沒有任務時處於等待狀態,能夠循環的執行任務;
(3)、任務接口(Task):每一個任務必須實現的接口,以供工做線程調度任務的執行,它主要規定了任務的入口,任務執行完後的收尾工做,任務的執行狀態等;
(4)、任務隊列(taskQueue):用於存放沒有處理的任務。提供一種緩衝機制。
線程池技術能夠縮短或調整建立線程和銷燬線程時間的技術,從而提升服務器程序性能的。它把建立線程和銷燬線程分別安排在服務器程序的啓動和結束的時間段或者一些空閒的時間段,這樣在服務器程序處理客戶請求時,不會有建立線程和銷燬線程開銷了。線程池不只調整建立線程和銷燬線程產生的時間段,並且它還顯著減小了建立線程的數目。
線程池工做原理:
將一個任務經過execute()方法加到線程池中後分下面4中狀況來執行。
(1)、若是當前的運行的線程數小於核心線程池中的線程數,則建立一個新的線程來執行任務,(執行這一步須要獲取全局鎖)
(2)、若是運行的線程等於或多於核心線程池中線程數,則將任務加到任務隊列中
(3)、若是任務隊列已滿,則建立新的線程來處理任務,(執行這一步須要獲取全局鎖)
(4)、若是建立新的線程後,超過線程池中最大線程數,任務被拒絕。
十一、消息隊列
消息隊列技術是分佈式應用間交換信息的一種技術。消息隊列可駐留在內存或磁盤上,隊列存儲消息直到它們被應用程序讀走。經過消息隊列,應用程序可獨立地執行--它們不須要知道彼此的位置、或在繼續執行前不須要等待接收程序接收此消息。
十二、hash一致性算法
參考:http://blog.csdn.net/cywosp/article/details/23397179/
在分佈式集羣中,對機器的添加刪除,或者機器故障後自動脫離集羣這些操做是分佈式集羣管理最基本的功能。若是採用經常使用的hash(object)%N算法,那麼在有機器添加或者刪除後,不少原有的數據就沒法找到了,這樣嚴重的違反了單調性原則。接下來主要講解一下一致性哈希算法是如何設計的。
環形Hash空間
按照經常使用的hash算法來將對應的key哈希到一個具備2^32次方個桶的空間中,即0~(2^32)-1的數字空間中。如今咱們能夠將這些數字頭尾相連,想象成一個閉合的環形。
把數據經過必定的hash算法處理後映射到環上
如今咱們將object一、object二、object三、object4四個對象經過特定的Hash函數計算出對應的key值,而後散列到Hash環上。以下圖:
Hash(object1) = key1;
Hash(object2) = key2;
Hash(object3) = key3;
Hash(object4) = key4;
將機器經過hash算法映射到環上
在採用一致性哈希算法的分佈式集羣中將新的機器加入,其原理是經過使用與對象存儲同樣的Hash算法將機器也映射到環中(通常狀況下對機器的hash計算是採用機器的IP或者機器惟一的別名做爲輸入值),而後以順時針的方向計算,將全部對象存儲到離本身最近的機器中。
假設如今有NODE1,NODE2,NODE3三臺機器,經過Hash算法獲得對應的KEY值,映射到環中,其示意圖以下:
Hash(NODE1) = KEY1;
Hash(NODE2) = KEY2;
Hash(NODE3) = KEY3;
在這樣的部署環境中,hash環是不會變動的,所以,經過算出對象的hash值就能快速的定位到對應的機器中,這樣就能找到對象真正的存儲位置了。
1. 節點(機器)的刪除
以上面的分佈爲例,若是NODE2出現故障被刪除了,那麼按照順時針遷移的方法,object3將會被遷移到NODE3中,這樣僅僅是object3的映射位置發生了變化,其它的對象沒有任何的改動。
2. 節點(機器)的添加
若是往集羣中添加一個新的節點NODE4,經過對應的哈希算法獲得KEY4,並映射到環中,經過按順時針遷移的規則,那麼object2被遷移到了NODE4中,其它對象還保持這原有的存儲位置。經過對節點的添加和刪除的分析,一致性哈希算法在保持了單調性的同時,仍是數據的遷移達到了最小,這樣的算法對分佈式集羣來講是很是合適的,避免了大量數據遷移,減少了服務器的的壓力。
平衡性
根據上面的圖解分析,一致性哈希算法知足了單調性和負載均衡的特性以及通常hash算法的分散性,但這還並不能當作其被普遍應用的起因,由於還缺乏了平衡性。下面將分析一致性哈希算法是如何知足平衡性的。hash算法是不保證平衡的,如上面只部署了NODE1和NODE3的狀況(NODE2被刪除的圖),object1存儲到了NODE1中,而object二、object三、object4都存儲到了NODE3中,這樣就照成了很是不平衡的狀態。在一致性哈希算法中,爲了儘量的知足平衡性,其引入了虛擬節點。以上面只部署了NODE1和NODE3的狀況(NODE2被刪除的圖)爲例,以前的對象在機器上的分佈很不均衡,如今咱們以2個副本(複製個數)爲例,這樣整個hash環中就存在了4個虛擬節點,最後對象映射的關係圖以下:根據上圖可知對象的映射關係:object1->NODE1-1,object2->NODE1-2,object3->NODE3-2,object4->NODE3-1。經過虛擬節點的引入,對象的分佈就比較均衡了。
虛擬節點」的hash計算能夠採用對應節點的IP地址加數字後綴的方式。例如假設NODE1的IP地址爲192.168.1.100。引入「虛擬節點」前,計算 cache A 的 hash 值:
Hash(「192.168.1.100」);
引入「虛擬節點」後,計算「虛擬節」點NODE1-1和NODE1-2的hash值:
Hash(「192.168.1.100#1」); // NODE1-1
Hash(「192.168.1.100#2」); // NODE1-2
1三、jvm
一、jvm 的體系結構:java堆、java棧、方法區、PC寄存器。
其中java堆和方法區是被全部的線程共享的。在方法區中,存儲了每一個類的信息(包括類的名稱、方法信息、字段信息)、靜態變量、常量以及編譯器編譯後的代碼等。當建立一個新的線程時,JVM回爲這個線程建立一個Java棧,同時也會爲這個線程分配一個PC寄存器,這個PC寄存器指向的是這個線程執行的第一行代碼。每當調用一個新的方法時,就會在這個java棧上面建立一個新的棧幀。棧幀上面主要存放的是這個方法中定義的變量、運行是常量池的引用、方法正常返回的地址。
Object 類中的方法
Object()
默認構造方法
clone()
建立並返回此對象的一個副本。
equals(Object obj)
指示某個其餘對象是否與此對象「相等」。
hashCode()
返回該對象的哈希碼值。
finalize()
當垃圾回收器肯定不存在對該對象的更多引用時,由對象的垃圾回收器調用此方法。
getClass()
返回一個對象的運行時類。
notify()
喚醒在此對象監視器上等待的單個線程。
notifyAll()
喚醒在此對象監視器上等待的全部線程。
toString()
返回該對象的字符串表示。
wait()
致使當前的線程等待,直到其餘線程調用此對象的 notify() 方法或 notifyAll() 方法。
wait(long timeout)
致使當前的線程等待,直到其餘線程調用此對象的 notify() 方法或 notifyAll() 方法,或者超過指定的時間量。
wait(long timeout, int nanos)
致使當前的線程等待,直到其餘線程調用此對象的 notify() 方法或 notifyAll() 方法,或者其餘某個線程中斷當前線程,或者已超過某個實際時間量。
1、Java基礎
1. String類爲何是final的。
(1)、不可變性支持字符串常量池
String另一個字符串常量池的屬性。2個字符串都用同一個字面量賦值。它們其實都指向同一個內存地址
(2)、不可變性支持線程安全
就是在併發場景下,多個線程同時讀一個資源,是不會引起竟態條件的。只有對資源作寫操做纔有危險。不可變對象不能被寫,因此線程安全。
2. HashMap的源碼,實現原理,底層結構。
HashMap基於hashing原理,咱們經過put()和get()方法儲存和獲取對象。當咱們將鍵值對傳遞給put()方法時,它調用鍵對象的hashCode()方法來計算hashcode,而後找到bucket位置來儲存值對象。當獲取對象時,經過鍵對象的equals()方法找到正確的鍵值對,而後返回值對象。HashMap使用鏈表來解決碰撞問題,當發生碰撞了,會採用頭插入的方式將對象將會儲存在鏈表中,而且對象的指針指向下一個對象節點。 HashMap在每一個鏈表節點中儲存鍵值對對象。
當兩個不一樣的鍵對象的hashcode相同時會發生什麼? 它們會儲存在同一個bucket位置的鏈表中。鍵對象的equals()方法用來找到鍵值對。HasMap初始長度?HashMap的初始長度默認是16,而且每次自動擴展或者手動初始化時,長度必須是2的冪,之因此選擇16,是爲了服務於從key映射到index的hash算法。從key映射到HashMap數組對應的位置會用到下面的方式:index = HashCode(key)& (length -1). length 是2的冪,能夠有效的減小index的重複。
若是HashMap的大小超過了負載因子(load factor)定義的容量,怎麼辦?」默認的負載因子大小爲0.75,也就是說,當一個map填滿了75%的bucket時候,和其它集合類(如ArrayList等)同樣,將會建立原來HashMap大小的兩倍的bucket數組,來從新調整map的大小,並將原來的對象放入新的bucket數組中。這個過程叫做rehashing【重散列】,由於它調用hash方法找到新的bucket位置。
你瞭解從新調整HashMap大小存在什麼問題嗎?」當多線程的狀況下,可能產生條件競爭(race condition)。當從新調整HashMap大小的時候,確實存在條件競爭,由於若是兩個線程都發現HashMap須要從新調整大小了,它們會同時試着調整大小。在調整大小的過程當中,存儲在鏈表中的元素的次序會反過來,由於移動到新的bucket位置的時候,HashMap並不會將元素放在鏈表的尾部,而是放在頭部,這是爲了不尾部遍歷(tail traversing)。主要是多線程同時put時,若是同時觸發了rehash操做,會致使HashMap中的鏈表中出現循環節點,進而使得後面get的時候,會死循環若是條件競爭發生了,那麼就死循環了。
3. 說說你知道的幾個Java集合類:list、set、queue、map實現類咯
Java容器類類庫的用途是"保存對象",並將其劃分爲兩個不一樣的概念:
1) Collection
Collection 每一個位置只能保存一個元素(對象)
1.1) List必須保持元素特定的順序
1.1) HashSet
HashSet是Set接口的典型實現,HashSet使用HASH算法來存儲集合中的元素,所以具備良好的存取和查找性能。當向HashSet集合中存入一個元素時,HashSet會調用該對象的hashCode()方法來獲得該對象的hashCode值,而後根據該HashCode值決定該對象在HashSet中的存儲位置。值得主要的是,HashSet集合判斷兩個元素相等的標準是兩個對象經過equals()方法比較相等,而且兩個對象的hashCode()方法的返回值相等。
1.1.1) LinkedHashSet
LinkedHashSet集合也是根據元素的hashCode值來決定元素的存儲位置,但和HashSet不一樣的是,它同時使用鏈表維護元素的次序,
這樣使得元素看起來是以插入的順序保存的。當遍歷LinkedHashSet集合裏的元素時,LinkedHashSet將會按元素的添加順序來訪問集合裏的元素。
LinkedHashSet須要維護元素的插入順序,所以性能略低於HashSet的性能,但在迭代訪問Set裏的所有元素時(遍歷)將有很好的性能(鏈表很適合進行遍歷)
1.2) Set不能有重複元素
1.3) Queue保持一個隊列(先進先出)的順序
2) Map
Map保存的是"鍵值對",咱們能夠經過"鍵"找到該鍵對應的"值"
4. 描述一下ArrayList和LinkedList各自實現和區別
5. Java中的隊列都有哪些,有什麼區別。
6. 反射中,Class.forName和classloader的區別
7. Java7、Java8的新特性(baidu問的,好BT)
8. Java數組和鏈表兩種結構的操做效率,在哪些狀況下(從開頭開始,從結尾開始,從中間開始),哪些操做(插入,查找,刪除)的效率高
9. Java內存泄露的問題調查定位:jmap,jstack的使用等等
10. string、stringbuilder、stringbuffer區別
11. hashtable和hashmap的區別
13 .異常的結構,運行時異常和非運行時異常,各舉個例子
14. String a= 「abc」 String b = 「abc」 String c = new String(「abc」) String d = 「ab」 + 「c」 .他們之間用 ==比較的結果
15. String 類的經常使用方法
16. Java 的引用類型有哪幾種
17. 抽象類和接口的區別
18. java的基礎類型和字節大小。
19. Hashtable,HashMap,ConcurrentHashMap 底層實現原理與線程安全問題(建議熟悉 jdk 源碼,才能從容應答)
20. 若是不讓你用Java Jdk提供的工具,你本身實現一個Map,你怎麼作。說了很久,說了HashMap源代碼,若是我作,就會借鑑HashMap的原理,說了一通HashMap實現
21. Hash衝突怎麼辦?哪些解決散列衝突的方法?
22. HashMap衝突很厲害,最差性能,你會怎麼解決?從O(n)提高到log(n)咯,用二叉排序樹的思路說了一通
23. rehash
24. hashCode() 與 equals() 生成算法、方法怎麼重寫
2、Java IO
1. 講講IO裏面的常見類,字節流、字符流、接口、實現類、方法阻塞。
2. 講講NIO。
3. String 編碼UTF-8 和GBK的區別?
4. 何時使用字節流、何時使用字符流?
5. 遞歸讀取文件夾下的文件,代碼怎麼實現
3、Java Web
1. session和cookie的區別和聯繫,session的生命週期,多個服務部署時session管理。
2. servlet的一些相關問題
3. webservice相關問題
4. jdbc鏈接,forname方式的步驟,怎麼聲明使用一個事務。舉例並具體代碼
5. 無框架下配置web.xml的主要配置內容
6. jsp和servlet的區別
4、JVM
1. Java的內存模型以及GC算法
2. jvm性能調優都作了什麼
3. 介紹JVM中7個區域,而後把每一個區域可能形成內存的溢出的狀況說明
4. 介紹GC和GC Root不正常引用。
5. 本身從classload 加載方式,加載機制說開去,從程序運行時數據區,講到內存分配,講到String常量池,講到JVM垃圾回收機制,算法,hotspot。反正就是各類擴展
6. jvm 如何分配直接內存, new 對象如何不分配在堆而是棧上,常量池解析
7. 數組多大放在 JVM 老年代(不僅是設置 PretenureSizeThreshold ,問一般多大,沒作過一問便知)
8. 老年代中數組的訪問方式
9. GC 算法,永久代對象如何 GC , GC 有環怎麼處理
10. 誰會被 GC ,何時 GC
11. 若是想不被 GC 怎麼辦
12. 若是想在 GC 中生存 1 次怎麼辦
5、開源框架
1. hibernate和ibatis的區別
2. 講講mybatis的鏈接池。
3. spring框架中須要引用哪些jar包,以及這些jar包的用途
4. springMVC的原理
5. springMVC註解的意思
6. spring中beanFactory和ApplicationContext的聯繫和區別
7. spring注入的幾種方式(循環注入)
8. spring如何實現事物管理的
9. springIOC
10. spring AOP的原理
11. hibernate中的1級和2級緩存的使用方式以及區別原理(Lazy-Load的理解)
12. Hibernate的原理體系架構,五大核心接口,Hibernate對象的三種狀態轉換,事務管理。
6、多線程
1. Java建立線程以後,直接調用start()方法和run()的區別
2. 經常使用的線程池模式以及不一樣線程池的使用場景
3. newFixedThreadPool此種線程池若是線程數達到最大值後會怎麼辦,底層原理。
4. 多線程之間通訊的同步問題,synchronized鎖的是對象,衍伸出和synchronized相關不少的具體問題,例如同一個類不一樣方法都有synchronized鎖,一個對象是否能夠同時訪問。或者一個類的static構造方法加上synchronized以後的鎖的影響。
5. 瞭解可重入鎖的含義,以及ReentrantLock和synchronized的區別
6. 同步的數據結構,例如concurrentHashMap的源碼理解以及內部實現原理,爲何他是同步的且效率高
7. atomicinteger和Volatile等線程安全操做的關鍵字的理解和使用
8. 線程間通訊,wait和notify
9. 定時線程的使用
10. 場景:在一個主線程中,要求有大量(不少不少)子線程執行完以後,主線程才執行完成。多種方式,考慮效率。
11. 進程和線程的區別
12. 什麼叫線程安全?舉例說明
13. 線程的幾種狀態
14. 併發、同步的接口或方法
15. HashMap 是否線程安全,爲什麼不安全。 ConcurrentHashMap,線程安全,爲什麼安全。底層實現是怎麼樣的。
16. J.U.C下的常見類的使用。 ThreadPool的深刻考察; BlockingQueue的使用。(take,poll的區別,put,offer的區別);原子類的實現。
17. 簡單介紹下多線程的狀況,從創建一個線程開始。而後怎麼控制同步過程,多線程經常使用的方法和結構
18. volatile的理解
19. 實現多線程有幾種方式,多線程同步怎麼作,說說幾個線程裏經常使用的方法
7、網絡通訊
1. http是無狀態通訊,http的請求方式有哪些,能夠本身定義新的請求方式麼。
2. socket通訊,以及長鏈接,分包,鏈接異常斷開的處理。
3. socket通訊模型的使用,AIO和NIO。
4. socket框架netty的使用,以及NIO的實現原理,爲何是異步非阻塞。
5. 同步和異步,阻塞和非阻塞。
6. OSI七層模型,包括TCP,IP的一些基本知識
7. http中,get post的區別
8. 說說http,tcp,udp之間關係和區別。
9. 說說瀏覽器訪問www.taobao.com,經歷了怎樣的過程。
10. HTTP協議、 HTTPS協議,SSL協議及完整交互過程;
11. tcp的擁塞,快回傳,ip的報文丟棄
12. https處理的一個過程,對稱加密和非對稱加密
13. head各個特色和區別
14. 說說瀏覽器訪問www.taobao.com,經歷了怎樣的過程。
8、數據庫MySql
1. MySql的存儲引擎的不一樣
2. 單個索引、聯合索引、主鍵索引
3. Mysql怎麼分表,以及分表後若是想按條件分頁查詢怎麼辦(若是不是按分表字段來查詢的話,幾乎效率低下,無解)
4. 分表以後想讓一個id多個表是自增的,效率實現
5. MySql的主從實時備份同步的配置,以及原理(從庫讀主庫的binlog),讀寫分離
6. 寫SQL語句。。。
7. 索引的數據結構,B+樹
8. 事務的四個特性,以及各自的特色(原子、隔離)等等,項目怎麼解決這些問題
9. 數據庫的鎖:行鎖,表鎖;樂觀鎖,悲觀鎖
10. 數據庫事務的幾種粒度;
11. 關係型和非關係型數據庫區別
9、設計模式
1. 單例模式:飽漢、餓漢。以及餓漢中的延遲加載,雙重檢查
2. 工廠模式、裝飾者模式、觀察者模式。
3. 工廠方法模式的優勢(低耦合、高內聚,開放封閉原則)
10、算法
1. 使用隨機算法產生一個數,要求把1-1000W之間這些數所有生成。(考察高效率,解決產生衝突的問題)
2. 兩個有序數組的合併排序
3. 一個數組的倒序
4. 計算一個正整數的正平方根
5. 說白了就是常見的那些查找、排序算法以及各自的時間複雜度
6. 二叉樹的遍歷算法
7. DFS,BFS算法
9. 比較重要的數據結構,如鏈表,隊列,棧的基本理解及大體實現。
10. 排序算法與時空複雜度(快排爲何不穩定,爲何你的項目還在用)
11. 逆波蘭計算器
12. Hoffman 編碼
13. 查找樹與紅黑樹
11、併發與性能調優
1. 有個每秒鐘5k個請求,查詢手機號所屬地的筆試題(記得不完整,沒列出),如何設計算法?請求再多,好比5w,如何設計整個系統?
2. 高併發狀況下,咱們系統是如何支撐大量的請求的
3. 集羣如何同步會話狀態
4. 負載均衡的原理
5 .若是有一個特別大的訪問量,到數據庫上,怎麼作優化(DB設計,DBIO,SQL優化,Java優化)
6. 若是出現大面積併發,在不增長服務器的基礎上,如何解決服務器響應不及時問題「。
7. 假如你的項目出現性能瓶頸了,你以爲可能會是哪些方面,怎麼解決問題。
8. 如何查找形成性能瓶頸出現的位置,是哪一個位置照成性能瓶頸。
9. 你的項目中使用過緩存機制嗎?有沒用用戶非本地緩存
12、其餘
1.經常使用的linux下的命令