-
1 # 北大青鳥中博軟體學院
-
2 # IT萬事通
1.公司有自己成熟的開發框架,這樣的公司主要考察Java基礎,比如io、集合、多執行緒、常用演算法等,如果基礎好,員工進入公司以後會進行一段時間的培訓,學習如何使用內部框架進行開發。
2.公司沒有自己的框架,使用主流框架開發,會多問框架的內容,這樣的公司希望員工進入公司後能夠馬上參與開發,所以主要會考察應用能力。
-
3 # 這樣學程式設計不枯燥
java基礎,反射,多執行緒,static的作用,集合,資料庫等基礎知識,還有就是資料庫,前端,java web(servlet,xml),ajax是面試的時候問的比較多的,以及一些主流框架的使用。還有做過的專案,以及在專案中遇到哪些比較難解決的問題,最後是怎麼解決的。
學習java是在“如鵬網”上學習的,有詳細的課程體系,有網路的地方就可以學習,每個章節的後面都有相應的練習題和麵試口才題,需要以錄音的方式進行提交,實時把控學習質量,為面試做準備。java重要知識點列舉。
如何準備面試?在準備面試之前,簡歷是很必要的,怎麼寫簡歷,投簡歷,才能吸引面試官的眼球,簡歷上哪些內容可以寫,哪些內容是不能寫的。
在面試的過程中,應該注意哪些問題,對於面試官提出來的問題,應該怎麼去回答。
看過“如鵬網”的免費公開課《程式設計師找工作的六大環節揭秘》,從寫簡歷,投簡歷,面試,籤協議等方面進行講解,分析的挺透徹的,可以去看看。
-
4 # 大學生程式設計指南
java面試主體分為兩個部分:
1.基礎知識的面試(1).如何理解面向物件的程式設計
(2).如何理解記憶體中的堆疊和靜態儲存區的用法
(3).是否可以繼承String 類
(4).String和StringBuilder、StringBuffer區別?
等等這些常見的java基礎類題目
2.框架及程式設計思想(1).spring mvc 工作機制原理
(2).Struts工作機制?為什麼要使用Struts?
(3).如何最佳化Hibernate?
現在只是簡單的列舉幾個面試題目,很多公司的面試直接都沒有筆試,因為水平的高低通常意義上講幾句話就能測試出水平的深淺,所以在面試需要注意以下幾點:
1.簡歷上面不要摻雜太多的水份
2.面試過程中要懂得實事求是,不要吹的太厲害,中間遇上一個技術高手幾句話就能讓自己下不了臺
3.對於一些沒有工作經驗的初學者能做的事情,就是老老實實把基礎做好,沒有經驗能證明自己的只有基礎,也只有打好自己的基礎才靠譜。
-
5 # 千鋒鄭州
\Java是老牌程式語言,人才需求一直遙遙居上,如果你想進入Java開發行業,而面試就是你入職的第一道關卡。不同的企業根據崗位需求不同會有不同的考察重點,但絕大多數企業都會考察求職者以下幾點,你可以作為參考。
1、Java基礎知識很重要
對Java基礎知識的熟練掌握,是很多大公司非常重視的基本能力,但是總有同學沉迷高深的技術,而忽視這一點。如果你的底層知識紮實,有一套完整的知識框架,會為你今後的所有面試打下牢固的基礎。
2、對Java應用能力考察點和加分項有所認知
不同的型別的公司,對於候選人的能力需求是不一樣的。對於社交門戶類,一般對Java工程師的考查點是大規模高併發場景的應用與架構能力;O2O行業則會側重於對面試者綜合能力的考察。
3、要清晰瞭解面試官的意圖,不要答非所問
針對Java不同的工作職位要求,面試考察的能力側重點是不同的。
如果你是校招面試,會考察你的基礎知識、邏輯思維,更多以培養潛力的考察為主;
如果你是初中級Java工程師,你需要多關注知識的廣度與基礎知識的應用;
對於高階或者資深Java工程師來說,則更需要深入理解基本原理,是以綜合的能力考查為主。
出於學習效率和學習效果的考慮,你可以專業學習一下。不斷接觸到企業常用的技術,也有有較多的專案練習,可以讓你快速將知識融會貫通並積累經驗。在學習的過程中可以達到既定效果,進而養成思考問題、透徹理解、解決問題的能力。
-
6 # 看不見的外星人
一般來說,對於初級中級java來說,問的spring家族框架工作原理,多執行緒,jvm的執行機制,設計模式,對於高階來說,java底層的實現原理,演算法,分散式快取,資料庫事物,分表分庫,秒殺實現解決方案,高併發處理等等
-
7 # 武漢朝夕教育科技
給你列舉了以下幾項: 如果以下都高畫質楚了,你已經是一個頂尖的java工程師了!
一、Java基礎
1. String類為什麼是final的。
1.執行緒安全2.支援字串常量池資料共享,節省資源,提高效率(因為如果已經存在這個常量便不會再建立,直接拿來用)
2. HashMap的原始碼,實現原理,底層結構。
總的來說,HashMap就是陣列+連結串列(雜湊表或者雜湊函式)的組合實現,每個陣列元素儲存一個連結串列的頭結點,本質上來說是雜湊表“拉鍊法”的實現。
HashMap的連結串列元素對應的是一個靜態內部類Entry,Entry主要包含key,value,next三個元素
主要有put和get方法,put的原理是,透過hash&length-1計算index,此時記作Entry[index]=該元素。如果index相同
就是新入的元素放置到Entry[index],原先的元素記作Entry[index].next
get就比較簡單了,先遍歷陣列,再遍歷連結串列元素。
null key總是放在Entry陣列的第一個元素(允許存放一個空鍵值對的原因)
解決hash衝突的方法:鏈地址法
再雜湊rehash的過程:確定容量超過目前雜湊表的容量,重新調整table 的容量大小,當超過容量的最大值時
HashMap的容量size乘以負載因子[預設0.75] = threshold 將會觸發擴容
3. 說說你知道的幾個Java集合類:list、set、queue、map實現類咯。。。
queue的實現類: AbstractQueue, ArrayBlockingQueue, ConcurrentLinkedQueue, LinkedBlockingQueue, DelayQueue, LinkedList, PriorityBlockingQueue, PriorityQueue和ArrayDqueue
4. 描述一下ArrayList和LinkedList各自實現和區別
5. Java中的佇列都有哪些,有什麼區別。
Queue: 基本上,一個佇列就是一個先入先出(FIFO)的資料結構
Queue介面與List、Set同一級別,都是繼承了Collection介面。LinkedList實現了Deque接 口。
Queue的實現
1、沒有實現的阻塞介面的LinkedList: 實現了java.util.Queue介面和java.util.AbstractQueue介面
內建的不阻塞佇列: PriorityQueue 和 ConcurrentLinkedQueue
PriorityQueue 和 ConcurrentLinkedQueue 類在 Collection Framework 中加入兩個具體集合實現。
PriorityQueue 類實質上維護了一個有序列表。加入到 Queue 中的元素根據它們的天然排序(透過其 java.util.Comparable 實現)或者根據傳遞給建構函式的 java.util.Comparator 實現來定位。
ConcurrentLinkedQueue 是基於連結節點的、執行緒安全的佇列。併發訪問不需要同步。因為它在佇列的尾部新增元素並從頭部刪除它們,所以只要不需要知道佇列的大 小, ConcurrentLinkedQueue 對公共集合的共享訪問就可以工作得很好。收集關於佇列大小的資訊會很慢,需要遍歷佇列。
2)實現阻塞介面的:
五個佇列所提供的各有不同:
* ArrayBlockingQueue :一個由陣列支援的有界佇列。
* LinkedBlockingQueue :一個由連結節點支援的可選有界佇列。
* PriorityBlockingQueue :一個由優先順序堆支援的無界優先順序佇列。
* DelayQueue :一個由優先順序堆支援的、基於時間的排程佇列。
* SynchronousQueue :一個利用 BlockingQueue 介面的簡單聚集(rendezvous)機制。
6. 反射中,Class.forName和classloader的區別
class.forName()除了將類的.class檔案載入到jvm中之外,還會對類進行解釋,執行類中的static塊。
而classLoader只幹一件事情,就是將.class檔案載入到jvm中,不會執行static中的內容,只有在newInstance才會去執行static塊。
Class.forName(name, initialize, loader)帶參函式也可控制是否載入static塊。並且只有呼叫了newInstance()方法採用呼叫建構函式,建立類的物件
7. Java7、Java8的新特性(baidu問的,好BT)
java7有一些比較重要的更新,如異常處理增加了被抑制的異常、捕獲多異常、try-with-resource自動釋放資源等,還有應用了G1垃圾回收器、switch可以使用String型別、泛型自動判斷型別、fork/join框架把任務細分並使用多處理器處理、支援二進位制字面量等
毫無疑問,Java 8是自Java 5(2004年)釋出以來Java語言最大的一次版本升級,Java 8帶來了很多的新特性,比如編譯器、類庫、開發工具和JVM(Java虛擬機器)。在這篇教程中我們將會學習這些新特性,並透過真例項子演示說明它們適用的場景。
最最重要的是Java8開始支援了Lambda表示式
9. Java記憶體洩露的問題調查定位:jmap,jstack的使用等等
10. string、stringbuilder、stringbuffer區別
11. hashtable和hashmap的區別
HashMap是非執行緒同步的,HashTable是執行緒同步的。
HashMap允許null作為鍵或者值,HashTable不允許
HashTable中有個一個contains方法,HashMap去掉了此方法
效率上來講,HashMap因為是非執行緒安全的,因此效率比HashTable高
hashTable繼承Dictionary,而HashMap繼承Abstract
13 .異常的結構,執行時異常和非執行時異常,各舉個例子
14. String a= “abc” String b = “abc” String c = new String(“abc”) String d = “ab” + “c” .他們之間用 == 比較的結果
編譯時最佳化
15. String 類的常用方法
16. Java 的引用型別有哪幾種
物件的強、軟、弱和虛引用(四種引用)
在JDK 1.2以前的版本中,若一個物件不被任何變數引用,那麼程式就無法再使用這個物件。也就是說,只有物件處於可觸及(reachable)狀態,程式才能使用它。從JDK 1.2版本開始,把物件的引用分為4種級別,從而使程式能更加靈活地控制物件的生命週期。這4種級別由高到低依次為:強引用、軟引用、弱引用和虛引用。
⑴強引用(StrongReference)
強引用是使用最普遍的引用。如果一個物件具有強引用,那垃圾回收器絕不會回收它。當記憶體空間不足,Java虛擬機器寧願丟擲OutOfMemoryError錯誤,使程式異常終止,也不會靠隨意回收具有強引用的物件來解決記憶體不足的問題。 ps:強引用其實也就是我們平時A a = new A()這個意思。
⑵軟引用(SoftReference)
如果一個物件只具有軟引用,則記憶體空間足夠,垃圾回收器就不會回收它;如果記憶體空間不足了,就會回收這些物件的記憶體。只要垃圾回收器沒有回收它,該物件就可以被程式使用。軟引用可用來實現記憶體敏感的快取記憶體(下文給出示例)。
軟引用可以和一個引用佇列(ReferenceQueue)聯合使用,如果軟引用所引用的物件被垃圾回收器回收,Java虛擬機器就會把這個軟引用加入到與之關聯的引用佇列中。
⑶弱引用(WeakReference)
弱引用與軟引用的區別在於:只具有弱引用的物件擁有更短暫的生命週期。在垃圾回收器執行緒掃描它所管轄的記憶體區域的過程中,一旦發現了只具有弱引用的物件,不管當前記憶體空間足夠與否,都會回收它的記憶體。不過,由於垃圾回收器是一個優先順序很低的執行緒,因此不一定會很快發現那些只具有弱引用的物件。
弱引用可以和一個引用佇列(ReferenceQueue)聯合使用,如果弱引用所引用的物件被垃圾回收,Java虛擬機器就會把這個弱引用加入到與之關聯的引用佇列中。
⑷虛引用(PhantomReference)
“虛引用”顧名思義,就是形同虛設,與其他幾種引用都不同,虛引用並不會決定物件的生命週期。如果一個物件僅持有虛引用,那麼它就和沒有任何引用一樣,在任何時候都可能被垃圾回收器回收。
虛引用主要用來跟蹤物件被垃圾回收器回收的活動。虛引用與軟引用和弱引用的一個區別在於:虛引用必須和引用佇列 (ReferenceQueue)聯合使用。當垃圾回收器準備回收一個物件時,如果發現它還有虛引用,就會在回收物件的記憶體之前,把這個虛引用加入到與之 關聯的引用佇列中。
ReferenceQueue queue = new ReferenceQueue ();
PhantomReference pr = new PhantomReference (object, queue);
程式可以透過判斷引用佇列中是否已經加入了虛引用,來了解被引用的物件是否將要被垃圾回收。如果程式發現某個虛引用已經被加入到引用佇列,那麼就可以在所引用的物件的記憶體被回收之前採取必要的行動。
17. 抽象類和介面的區別
18. java的基礎型別和位元組大小。
19. Hashtable,HashMap,ConcurrentHashMap 底層實現原理與執行緒安全問題(建議熟悉 jdk 原始碼,才能從容應答)
20. 如果不讓你用Java Jdk提供的工具,你自己實現一個Map,你怎麼做。說了好久,說了HashMap原始碼,如果我做,就會借鑑HashMap的原理,說了一通HashMap實現
21. Hash衝突怎麼辦?哪些解決雜湊衝突的方法?
開放地址法 插入元素時,如果發生衝突,演算法會簡單的從該槽位置向後迴圈遍歷hash表,直到找到表中的下一個空槽,並將該元素放入該槽中(會導致相同hash值的元素挨在一起和其他hash值對應的槽被佔用)。查詢元素時,首先雜湊值所指向的槽,如果沒有找到匹配,則繼續從該槽遍歷hash表,直到:(1)找到相應的元素;(2)找到一個空槽,指示查詢的元素不存在,(所以不能隨便刪除元素);(3)整個hash表遍歷完畢(指示該元素不存在並且hash表是滿的)
拉鍊法(hashMap採用的是該種方法)
再雜湊(雙重雜湊,多重雜湊)
建立一個公共溢位區
22. HashMap衝突很厲害,最差效能,你會怎麼解決?從O(n)提升到log(n)咯,用二叉排序樹的思路說了一通
23. rehash
24. hashCode() 與 equals() 生成演算法、方法怎麼重寫
如何重寫equals()方法
如果你決定要重寫equals()方法,那麼你一定要明確這麼做所帶來的風險,並確保自己能寫出一個健壯的equals()方法.一定要注意的一點是,在重寫equals()後,一定要重寫hashCode()方法.具體原因稍候再進行說明.
我們先看看 JavaSE 7 Specification中對equals()方法的說明:
It is reflexive: for any non-null reference value x, x.equals(x) should return true.
It is symmetric: for any non-null reference values x and y, x.equals(y) should return true if and only if y.equals(x) returns true.
It is transitive: for any non-null reference values x, y, and z, if x.equals(y) returns true and y.equals(z) returns true, then x.equals(z) should return true.
It is consistent: for any non-null reference values x and y, multiple invocations of x.equals(y) consistently return true or consistently return false, provided no information used in equals comparisons on the objects is modified.
For any non-null reference value x, x.equals(null) should return false.
這段話用了很多離散數學中的術數.簡單說明一下:
1. 自反性:A.equals(A)要返回true.
2. 對稱性:如果A.equals(B)返回true, 則B.equals(A)也要返回true.
3. 傳遞性:如果A.equals(B)為true, B.equals(C)為true, 則A.equals(C)也要為true. 說白了就是 A = B , B = C , 那麼A = C.
4. 一致性:只要A,B物件的狀態沒有改變,A.equals(B)必須始終返回true.
5. A.equals(null) 要返回false.
相信只要不是專業研究數學的人,都對上面的東西不來電.在實際應用中我們只需要按照一定的步驟重寫equals()方法就可以了.為了說明方便,我們先定義一個程式設計師類(Coder):
[java] view plain copy
class Coder {
private String name;
private int age;
// getters and setters
}
我們想要的是,如果2個程式設計師物件的name和age都是相同的,那麼我們就認為這兩個程式設計師是一個人.這時候我們就要重寫其equals()方法.因為預設的equals()實際是判斷兩個引用是否指向內在中的同一個物件,相當於 == . 重寫時要遵循以下三步:
1. 判斷是否等於自身.
[java] view plain copy
if(other == this)
return true;
2. 使用instanceof運算子判斷 other 是否為Coder型別的物件.
[java] view plain copy
if(!(other instanceof Coder))
return false;
3. 比較Coder類中你自定義的資料域,name和age,一個都不能少.
[java] view plain copy
Coder o = (Coder)other;
return o.name.equals(name) && o.age == age;
看到這有人可能會問,第3步中有一個強制轉換,如果有人將一個Integer類的物件傳到了這個equals中,那麼會不會扔ClassCastException呢?這個擔心其實是多餘的.因為我們在第二步中已經進行了instanceof 的判斷,如果other是非Coder物件,甚至other是個null, 那麼在這一步中都會直接返回false, 從而後面的程式碼得不到執行的機會.
上面的三步也是<Effective Java>中推薦的步驟,基本可保證萬無一失.
如何重寫hashCode()方法
在JavaSE 7 Specification中指出,"Note that it is generally necessary to override the hashCode method whenever this method(equals) is overridden, so as to maintain the general contract for the hashCode method, which states that equal objects must have equal hash codes."
如果你重寫了equals()方法,那麼一定要記得重寫hashCode()方法.我們在大學計算機資料結構課程中都已經學過雜湊表(hash table)了,hashCode()方法就是為雜湊表服務的.
<Effective Java>中給出了一個能最大程度上避免雜湊衝突的寫法,但我個人認為對於一般的應用來說沒有必要搞的這麼麻煩.如果你的應用中HashSet中需要存放上萬上百萬個物件時,那你應該嚴格遵循書中給定的方法.如果是寫一箇中小型的應用,那麼下面的原則就已經足夠使用了:
要保證Coder物件中所有的成員都能在hashCode中得到體現.
對於本例,我們可以這麼寫:
[java] view plain copy
@Override
public int hashCode() {
int result = 17;
result = result * 31 + name.hashCode();
result = result * 31 + age;
return result;
}
其中int result = 17你也可以改成20, 50等等都可以.看到這裡我突然有些好奇,想看一下String類中的hashCode()方法是如何實現的.查文件知:
"Returns a hash code for this string. The hash code for a String object is computed as
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
using int arithmetic, where s[i] is the ith character of the string, n is the length of the string, and ^ indicates exponentiation. (The hash value of the empty string is zero.)"
對每個字元的ASCII碼計算n - 1次方然後再進行加和,可見Sun對hashCode的實現是很嚴謹的. 這樣能最大程度避免2個不同的String會出現相同的hashCode的情況.
重寫equals()而不重寫hashCode()的風險
在Oracle的Hash Table實現中引用了bucket的概念.如下圖所示:
從上圖中可以看出,帶bucket的hash table大致相當於雜湊表與連結串列的結合體.即在每個bucket上會掛一個連結串列,連結串列的每個結點都用來存放物件.Java透過hashCode()方法來確定某個物件應該位於哪個bucket中,然後在相應的連結串列中進行查詢.在理想情況下,如果你的hashCode()方法寫的足夠健壯,那麼每個bucket將會只有一個結點,這樣就實現了查詢操作的常量級的時間複雜度.即無論你的物件放在哪片記憶體中,我都可以透過hashCode()立刻定位到該區域,而不需要從頭到尾進行遍歷查詢.這也是雜湊表的最主要的應用.
如:
當我們呼叫HashSet的put(Object o)方法時,首先會根據o.hashCode()的返回值定位到相應的bucket中,如果該bucket中沒有結點,則將 o 放到這裡,如果已經有結點了, 則把 o 掛到連結串列末端.同理,當呼叫contains(Object o)時,Java會透過hashCode()的返回值定位到相應的bucket中,然後再在對應的連結串列中的結點依次呼叫equals()方法來判斷結點中的物件是否是你想要的物件.
下面我們透過一個例子來體會一下這個過程:
我們先建立2個新的Coder物件:
[java] view plain copy
Coder c1 = new Coder("bruce", 10);
Coder c2 = new Coder("bruce", 10);
假定我們已經重寫了Coder的equals()方法而沒有重寫hashCode()方法:
[java] view plain copy
@Override
public boolean equals(Object other) {
System.out.println("equals method invoked!");
if(other == this)
return true;
if(!(other instanceof Coder))
return false;
Coder o = (Coder)other;
return o.name.equals(name) && o.age == age;
}
然後我們構造一個HashSet,將c1物件放入到set中:
[java] view plain copy
Set<Coder> set = new HashSet<Coder>();
set.add(c1);
再執行:
[java] view plain copy
System.out.println(set.contains(c2));
我們期望contains(c2)方法返回true, 但實際上它返回了false.
c1和c2的name和age都是相同的,為什麼我把c1放到HashSet中後,再呼叫contains(c2)卻返回false呢?這就是hashCode()在作怪了.因為你沒有重寫hashCode()方法,所以HashSet在查詢c2時,會在不同的bucket中查詢.比如c1放到05這個bucket中了,在查詢c2時卻在06這個bucket中找,這樣當然找不到了.因此,我們重寫hashCode()的目的在於,在A.equals(B)返回true的情況下,A, B 的hashCode()要返回相同的值.
我讓hashCode()每次都返回一個固定的數行嗎
有人可能會這樣重寫:
[java] view plain copy
@Override
public int hashCode() {
return 10;
}
如果這樣的話,HashMap, HashSet等集合類就失去了其 "雜湊的意義".用<Effective Java>中的話來說就是,雜湊表退化成了連結串列.如果hashCode()每次都返回相同的數,那麼所有的物件都會被放到同一個bucket中,每次執行查詢操作都會遍歷連結串列,這樣就完全失去了雜湊的作用.所以我們最好還是提供一個健壯的hashCode()為妙.
二、Java IO
1. 講講IO裡面的常見類,位元組流、字元流、介面、實現類、方法阻塞。
2. 講講NIO。
3. String 編碼UTF-8 和GBK的區別?
4. 什麼時候使用位元組流、什麼時候使用字元流?
5. 遞迴讀取資料夾下的檔案,程式碼怎麼實現
三、Java Web
1. session和cookie的區別和聯絡,session的生命週期,多個服務部署時session管理。
2. servlet的一些相關問題
3. webservice相關問題
4. jdbc連線,forname方式的步驟,怎麼宣告使用一個事務。舉例並具體程式碼
5. 無框架下配置web.xml的主要配置內容
6. jsp和servlet的區別
四、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 次怎麼辦
五、開源框架
1. hibernate和ibatis的區別
2. 講講mybatis的連線池。
3. spring框架中需要引用哪些jar包,以及這些jar包的用途
4. springMVC的原理
5. springMVC註解的意思
6. spring中beanFactory和ApplicationContext的聯絡和區別
BeanFactory特點
BeanFactory常用的實現類是DefaultListableBeanFactory,呼叫者只需要使用getBean()方法就可以獲得指定的引用,無須關心Bean的例項化過程。建立Spring容器的例項時,必須提供Spring容器管理的Bean的詳細配置資訊。Spring的配置資訊通常採用XML配置檔案來設定,因此,建立BeanFactory例項時,應該提供XML配置檔案作為引數。XML配置檔案通常使用Resource物件傳入。
Resource isr = new ClassPathResource("beans.xml");
//Resource isr = new FileSystemResource("beans.xml");
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
new XmlBeanDefinitionReader(beanFactory).loadBeanDefinition(isr);
ApplicationContext特點
ApplicationContext常用的實現類是FileSystemXmlApplicationContext、ClassPathXmlApplicationContext和AnnotationConfigApplicationContext。如果在Web應用中使用Spring容器,則通常使用XmlWebApplicationContext、AnnotationConfigApplicationContext兩個實現類。如果需要使用多個XML配置檔案建立Spring容器,可以使用FileSystemXmlApplicationContext或者是ClassPathXmlApplicationContext。
除了提供BeanFactory所支援的所有功能外,ApplicationContext還有額外的功能
預設初始化所有的Singleton,也可以透過配置取消預初始化。
繼承MessageSource,因此支援國際化。
資源訪問,比如訪問URL和檔案。
事件機制。
同時載入多個配置檔案。
以宣告式方式啟動並建立Spring容器。
由於ApplicationContext會預先初始化所有的Singleton Bean,於是在系統建立前期會有較大的系統開銷,但一旦ApplicationContext初始化完成,程式後面獲取Singleton Bean例項時候將有較好的效能。也可以為bean設定lazy-init屬性為true,即Spring容器將不會預先初始化該bean。
7. spring注入的幾種方式(迴圈注入)
8. spring如何實現事物管理的
set注入(通常也叫屬性注入),建構函式注入,介面注入(這個現在基本不用),註解注入(@Autowire)
9. springIOC
10. spring AOP的原理
11. hibernate中的1級和2級快取的使用方式以及區別原理(Lazy-Load的理解)
12. Hibernate的原理體系架構,五大核心介面,Hibernate物件的三種狀態轉換,事務管理。
六、多執行緒
1. Java建立執行緒之後,直接呼叫start()方法和run()的區別
2. 常用的執行緒池模式以及不同執行緒池的使用場景
3. newFixedThreadPool此種執行緒池如果執行緒數達到最大值後會怎麼辦,底層原理。
4. 多執行緒之間通訊的同步問題,synchronized鎖的是物件,衍伸出和synchronized相關很多的具體問題,例如同一個類不同方法都有synchronized鎖,一個物件是否可以同時訪問。或者一個類的static構造方法加上synchronized之後的鎖的影響。
5. 瞭解可重入鎖的含義,以及Lock 和synchronized的區別
1. lock是一個介面,而synchronized是java的一個關鍵字,synchronized是內建的語言實現;(具體實現上的區別在《Java虛擬機器》中有講解底層的CAS不同,以前有讀過現在又遺忘了。)
2. synchronized在發生異常時候會自動釋放佔有的鎖,因此不會出現死鎖;而lock發生異常時候,不會主動釋放佔有的鎖,必須手動unlock來釋放鎖,可能引起死鎖的發生。(所以最好將同步程式碼塊用try catch包起來,finally中寫入unlock,避免死鎖的發生。)
3. lock等待鎖過程中可以用interrupt來終端等待,而synchronized只能等待鎖的釋放,不能響應中斷;
4. lock可以透過trylock來知道有沒有獲取鎖,而synchronized不能;
5. Lock可以提高多個執行緒進行讀操作的效率。(可以透過readwritelock實現讀寫分離)
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. 實現多執行緒有幾種方式,多執行緒同步怎麼做,說說幾個執行緒裡常用的方法
七、網路通訊
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,經歷了怎樣的過程。
八、資料庫MySql
1. MySql的儲存引擎的不同
2. 單個索引、聯合索引、主鍵索引
3. Mysql怎麼分表,以及分表後如果想按條件分頁查詢怎麼辦(如果不是按分表字段來查詢的話,幾乎效率低下,無解)
4. 分表之後想讓一個id多個表是自增的,效率實現
5. MySql的主從實時備份同步的配置,以及原理(從庫讀主庫的binlog),讀寫分離
6. 寫SQL語句。。。
7. 索引的資料結構,B+樹
8. 事務的四個特性,以及各自的特點(原子、隔離)等等,專案怎麼解決這些問題
9. 資料庫的鎖:行鎖,表鎖;樂觀鎖,悲觀鎖
10. 資料庫事務的幾種粒度;
11. 關係型和非關係型資料庫區別
九、設計模式
1. 單例模式:飽漢、餓漢。以及餓漢中的延遲載入,雙重檢查
2. 工廠模式、裝飾者模式、觀察者模式。
3. 工廠方法模式的優點(低耦合、高內聚,開放封閉原則)
十、演算法
1. 使用隨機演算法產生一個數,要求把1-1000W之間這些數全部生成。(考察高效率,解決產生衝突的問題)
2. 兩個有序陣列的合併排序
3. 一個數組的倒序
4. 計算一個正整數的正平方根
5. 說白了就是常見的那些查詢、排序演算法以及各自的時間複雜度
6. 二叉樹的遍歷演算法
7. DFS,BFS演算法
9. 比較重要的資料結構,如連結串列,佇列,棧的基本理解及大致實現。
10. 排序演算法與時空複雜度(快排為什麼不穩定,為什麼你的專案還在用)
11. 逆波蘭計算器
12. Hoffman 編碼
13. 查詢樹與紅黑樹
十一、併發與效能調優
1. 有個每秒鐘5k個請求,查詢手機號所屬地的筆試題(記得不完整,沒列出),如何設計算法?請求再多,比如5w,如何設計整個系統?
2. 高併發情況下,我們系統是如何支撐大量的請求的
3. 叢集如何同步會話狀態
4. 負載均衡的原理
5 .如果有一個特別大的訪問量,到資料庫上,怎麼做最佳化(DB設計,DBIO,SQL最佳化,Java最佳化)
6. 如果出現大面積併發,在不增加伺服器的基礎上,如何解決伺服器響應不及時問題“。
7. 假如你的專案出現效能瓶頸了,你覺得可能會是哪些方面,怎麼解決問題。
8. 如何查詢 造成 效能瓶頸出現的位置,是哪個位置照成效能瓶頸。
9. 你的專案中使用過快取機制嗎?有沒用使用者非本地快取
————————————————
原文連結:https://blog.csdn.net/zhouwei1818/article/details/80180872
-
8 # Java碼農之路
Java 面試的各個方面,整理Java面試高常問題目整理包括基+JVM+演算法+資料庫最佳化+演算法資料結構+分散式+併發程式設計+快取等,使用層面廣,知識量大,涉及你的知識盲點。要想在面試者中出類拔萃就要比人付出更多的努力,共勉!
java基礎
Arrays.sort實現原理和Collection實現原理foreach和while的區別(編譯之後)執行緒池的種類,區別和使用場景分析執行緒池的實現原理和執行緒的排程過程執行緒池如何調優執行緒池的最大執行緒數目根據什麼確定動態代理的幾種方式HashMap的併發問題了解LinkedHashMap的應用嗎反射的原理,反射建立類例項的三種方式是什麼?cloneable介面實現原理,淺複製or深複製Java NIO使用hashtable和hashmap的區別及實現原理,hashmap會問到陣列索引,hash碰撞怎麼解決arraylist和linkedlist區別及實現原理反射中,Class.forName和ClassLoader區別String,Stringbuffer,StringBuilder的區別?有沒有可能2個不相等的物件有相同的hashcode簡述NIO的最佳實踐,比如netty,minaTreeMap的實現原理JVM相關
類的例項化順序,比如父類靜態資料,建構函式,欄位,子類靜態資料,建構函式,欄位,他們的執行順序JVM記憶體分代Java 8的記憶體分代改進JVM垃圾回收機制,何時觸發MinorGC等操作jvm中一次完整的GC流程(從ygc到fgc)是怎樣的,重點講講物件如何晉升到老年代,幾種主要的jvm引數等你知道哪幾種垃圾收集器,各自的優缺點,重點講下cms,g1新生代和老生代的記憶體回收策略Eden和Survivor的比例分配等深入分析了Classloader,雙親委派機制JVM的編譯最佳化對Java記憶體模型的理解,以及其在併發中的應用指令重排序,記憶體柵欄等OOM錯誤,stackoverflow錯誤,permgen space錯誤JVM常用引數tomcat結構,類載入器流程volatile的語義,它修飾的變數一定執行緒安全嗎g1和cms區別,吞吐量優先和響應優先的垃圾收集器選擇說一說你對環境變數classpath的理解?如果一個類不在classpath下,為什麼會丟擲ClassNotFoundException異常,如果在不改變這個類路徑的前期下,怎樣才能正確載入這個類?說一下強引用、軟引用、弱引用、虛引用以及他們之間和gc的關係JUC/併發相關
ThreadLocal用過麼,原理是什麼,用的時候要注意什麼Synchronized和Lock的區別synchronized 的原理,什麼是自旋鎖,偏向鎖,輕量級鎖,什麼叫可重入鎖,什麼叫公平鎖和非公平鎖concurrenthashmap具體實現及其原理,jdk8下的改版用過哪些原子類,他們的引數以及原理是什麼cas是什麼,他會產生什麼問題(ABA問題的解決,如加入修改次數、版本號)如果讓你實現一個併發安全的連結串列,你會怎麼做簡述ConcurrentLinkedQueue和LinkedBlockingQueue的用處和不同之處簡述AQS的實現原理countdowlatch和cyclicbarrier的用法,以及相互之間的差別?concurrent包中使用過哪些類?分別說說使用在什麼場景?為什麼要使用?LockSupport工具Condition介面及其實現原理Fork/Join框架的理解jdk8的parallelStream的理解分段鎖的原理,鎖力度減小的思考Spring
Spring AOP與IOC的實現原理Spring的beanFactory和factoryBean的區別為什麼CGlib方式可以對介面實現代理?RMI與代理模式Spring的事務隔離級別,實現原理對Spring的理解,非單例注入的原理?它的生命週期?迴圈注入的原理,aop的實現原理,說說aop中的幾個術語,它們是怎麼相互工作的?Mybatis的底層實現原理MVC框架原理,他們都是怎麼做url路由的spring boot特性,優勢,適用場景等quartz和timer對比spring的controller是單例還是多例,怎麼保證併發的安全分散式相關
Dubbo的底層實現原理和機制描述一個服務從釋出到被消費的詳細過程分散式系統怎麼做服務治理介面的冪等性的概念訊息中介軟體如何解決訊息丟失問題Dubbo的服務請求失敗怎麼處理重連機制會不會造成錯誤對分散式事務的理解如何實現負載均衡,有哪些演算法可以實現?Zookeeper的用途,選舉的原理是什麼?資料的垂直拆分水平拆分。zookeeper原理和適用場景zookeeper watch機制redis/zk節點宕機如何處理分散式叢集下如何做到唯一序列號如何做一個分散式鎖用過哪些MQ,怎麼用的,和其他mq比較有什麼優缺點,MQ的連線是執行緒安全的嗎MQ系統的資料如何保證不丟失列舉出你能想到的資料庫分庫分表策略;分庫分表後,如何解決全表查詢的問題。演算法和資料結構以及設計模式
海量url去重類問題(布隆過濾器)陣列和連結串列資料結構描述,各自的時間複雜度二叉樹遍歷快速排序BTree相關的操作在工作中遇到過哪些設計模式,是如何應用的hash演算法的有哪幾種,優缺點,使用場景什麼是一致性hashpaxos演算法在裝飾器模式和代理模式之間,你如何抉擇,請結合自身實際情況聊聊程式碼重構的步驟和原因,如果理解重構到模式?資料庫
MySQL InnoDB儲存的檔案結構索引樹是如何維護的?資料庫自增主鍵可能的問題MySQL的幾種最佳化mysql索引為什麼使用B+樹資料庫鎖表的相關處理索引失效場景高併發下如何做到安全的修改同一行資料,樂觀鎖和悲觀鎖是什麼,INNODB的行級鎖有哪2種,解釋其含義資料庫會死鎖嗎,舉一個死鎖的例子,mysql怎麼解決死鎖Redis&快取相關
Redis的併發競爭問題如何解決了解Redis事務的CAS操作嗎快取機器增刪如何對系統影響最小,一致性雜湊的實現Redis持久化的幾種方式,優缺點是什麼,怎麼實現的Redis的快取失效策略快取穿透的解決辦法redis叢集,高可用,原理mySQL裡有2000w資料,redis中只存20w的資料,如何保證redis中的資料都是熱點資料用Redis和任意語言實現一段惡意登入保護的程式碼,限制1小時內每使用者Id最多隻能登入5次redis的資料淘汰策略網路相關
http1.0和http1.1有什麼區別TCP/IP協議TCP三次握手和四次揮手的流程,為什麼斷開連線要4次,如果握手只有兩次,會出現什麼TIME_WAIT和CLOSE_WAIT的區別說說你知道的幾種HTTP響應碼當你用瀏覽器開啟一個連結的時候,計算機做了哪些工作步驟TCP/IP如何保證可靠性,資料包有哪些資料組成長連線與短連線Http請求get和post的區別以及資料包格式簡述tcp建立連線3次握手,和斷開連線4次握手的過程;關閉連線時,出現TIMEWAIT過多是由什麼原因引起,是出現在主動斷開方還是被動斷開方。其他
maven解決依賴衝突,快照版和發行版的區別Linux下IO模型有幾種,各自的含義是什麼實際場景問題,海量登入日誌如何排序和處理SQL操作,主要是索引和聚合函式的應用實際場景問題解決,典型的TOP K問題線上bug處理流程如何從線上日誌發現問題linux利用哪些命令,查詢哪裡出了問題(例如io密集任務,cpu過度)場景問題,有一個第三方介面,有很多個執行緒去呼叫獲取資料,現在規定每秒鐘最多有10個執行緒同時呼叫它,如何做到。用三個執行緒按順序迴圈列印abc三個字母,比如abcabcabc。常見的快取策略有哪些,你們專案中用到了什麼快取系統,如何設計的設計一個秒殺系統,30分鐘沒付款就自動關閉交易(併發會很高)請列出你所瞭解的效能測試工具後臺系統怎麼防止請求重複提交?總結在以往的面試經歷中總結了一些經驗,其實當你面試到一個水平相對較高的職位時,往往較量的技術方面已經是其次,大部分公司在與你聊完技術之後,更看重你的溝通能力、解決問題的能力、以及你以往的一些比較成功的經歷。
面試不光是這些準備不光包括技術,還有你對公司的瞭解,這是在hr這關更看重的,他們想找的不光是技術大拿,更重要的事可以跟公司共同進步的夥伴,所以當你真正開始面試,那麼就要拿出自己的真誠,讓hr感受到你對公司的興趣、熱情和自信,從談吐上表現出果斷和堅定往往會是很多招聘人事更加青睞的。如果你對某一個公司很感興趣並且技術通關了,那麼如何才能在多個選擇中讓公司選擇你,那就是可以讓hr在和你的交流中感覺到愉快和流暢,這點事相當重要的,可以勝任一份工作的人很多,但是能夠在溝通上略勝一籌,那麼這份工作一定會是非你莫屬!
部分資料如下:
-
9 # 可可愛愛的程式媛
1、Java中操作字串都有哪些類?它們之間有什麼區別?
2、JDK和JRE有什麼區別?
3、== 和 equals 的區別是什麼?
4、HashMap、Hashtable、TreeMap有什麼區別?
這是我之前面試遇到的面試問題,總的來說答的還行,正好在面試前也刷到類似問題了,當時就問了我動力節點的老師,面試的時候就排上用場了,最後很順利地拿到了offer。
回覆列表
1.請先簡單做一個自我介紹
這個問題,基本上可以說是所有面試者都會遇到的一個問題。而一般人回答往往也只說姓名、年齡、愛好、工作經驗,基本上都是簡歷上會有的。其實,HR想聽的是簡歷上看不到的,比如擅長的技能,做過的專案,主要成就,特別是專案細節部分,能幫助HR對你有一個更直觀的認識。其次,自我介紹的時間也要把握好,過長過短都不合適。記住一點,簡單不代表不重要!
2、你對我們公司瞭解多少?HR問這個問題,其實最主要的目的就是想了解下你的誠意,如果面試前沒有了解公司,可能會覺得無從回答。
所以,較穩妥的辦法就是在面試前最好先了解下公司基本情況,這樣面對這個問題,也就有的談了。但是,萬一自己真的不清楚,也不能直接說“不知道”,會讓HR覺得你並沒有提前做準備,可以說,自己上網搜尋過公司相關簡介,但瞭解的不是很多。
3、為什麼要從上家公司離職?這是一個需要慎重回答的問題,切記不要一上來就噼裡啪啦的說一堆原來公司及管理人員的各種不好和怨言。這樣,會給面試官帶來很多負面情緒。可以很委婉的從自己的職業規劃、技術路線、發展等方面回答。將這個難題,變成自己的加分項。
4、你對薪資的要求?這也是個需要慎重回答的問題,要價太低,顯然會貶低自己的能力;盲目自大,漫天要價,公司就會受用不起。
所以,當各位面試者面對這個問題的時候,一定要擺正心態,提前備好功課,瞭解好應聘崗位的是市場薪資區間,這樣當遇到這個問題時,也就可以說:“我是透過**平臺投遞的簡歷,我看了這個崗位的薪資區間,薪資要求在簡歷上也有寫到,我對自己的技術很有信心,相信公司也能根據我的情況和市場標準的水平,給我合理的薪水”。當然,關於工資是稅前,還是稅後,要提前詢問清楚。
5、你對加班的看法?雖然程式設計師加班是常態,但當HR問這個問題時,也不能直接回答以前都是天天加班,我已經習慣了;或者說我不能接受加班,這樣會讓HR覺得你並不是一個搞技術的。你可以說:“對於加班,我是這樣認為的,如果專案比較趕,短期的加班我是理解並支援的,如果專案長期加班的話,對程式設計師的身體和腦力休息不好,也會降低開發效率,可能有點不太好。”這樣的回答,既表達了你不是不加班的人,也不會覺得你加班也是理所當然的事情。