[Java面經]乾貨整理, Java面試題(覆蓋Java基礎,Java高級,JavaEE,數據庫,設計模式等)

一:繼承、抽象類與接口區別、訪問控制(private, public, protected,默認)、多態相關
!一、interface和 abstract class的區別
interface是接口,abstract class是抽象類。
1,語法層次
抽象類中能夠擁有任意範圍的成員數據,能夠定義非抽象方法。而接口中只能擁有靜態的不能修改的成員數據,同時全部的方法必須是抽象的。
因此說接口是抽象類的一種特例。
2,跨域不一樣
a,抽象類是對類的總體進行抽象,包括類的屬性和行爲。接口是對類的局部(行爲)進行抽象。
b,抽象類是is-a,跨域的是具備類似特色的類。接口是like-a,能夠跨域不一樣的類。
例如貓、狗能夠抽象一個動物類的抽象類,具有叫的方法。鳥、飛機能夠實現Fly接口,具有飛的行爲。
3,設計層次
抽象類是自下而上的一種設計思想,而接口是自頂而下的一種設計思想。
抽象類中咱們要知道子類才能抽象出父類。而接口不一樣,它只須要定義一個規則便可。
html

!二、是否能夠繼承多個接口,是否能夠繼承多個抽象類
java能夠實現多個接口,對於類是單繼承體系結構。
java

%三、Static Nested Class 和 Inner Class的不一樣
靜態內部類沒有了指向外部的引用,能夠直接被實例化而不須要依附與外部類的實例化。
非靜態內部類保留了指向外部的引用,必須依附於外部類的實例化纔可以實例化內部類。
靜態嵌套類內部中:內部類不能訪問外部類的非靜態成員。外部類不能直接訪問靜態類中的屬性,須要經過內部類去訪問。
非靜態內部類中:內部類能夠直接訪問外部類的屬性成員。外部類不能直接訪問靜態類中的屬性,須要經過內部類去訪問。
延伸:使用內部類最吸引人的緣由是:每一個內部類都能獨立地繼承一個類,因此不管外圍類是否已經繼承某個類,對內部類都沒有影響。
內部類:成員內部類(直接在外部類中)、局部內部類(內部類在方法或者做用域中)、嵌套內部類(static 修飾的內部類)、匿名內部類
這裏須要說明一點:局部內部類和匿名內部類訪問局部變量時爲和須要加final關鍵字?
局部變量的生命週期與局部內部類的對象的生命週期的不一致性。例如內部類innerClass在方法f()中,而方法f()中定義局部變量i且被內部類使用。
當方法f()運行結束後,局部變量i就已經死亡不存在了,但局部內部類對象可能還存在(直道沒有人再引用該對象纔會消亡),這時出現一種狀況就是
局部內部類要訪問一個已經不存在的局部變量。而當變量被final修飾時,經過final將局部變量"複製"一份,複製品直接做爲局部變量中的數據成員。
mysql

!四、Overload和Override的區別。Overloaded的方法是否能夠改變返回值的類型?
overload重載和override重寫是Java多態性的不一樣表現。
overload是一個類多態性的表現,override是父類與之類多態性的不一樣表現。
override:子類中定義與父類相同的名稱及簽名. overload:方法相同方法簽名不一樣。
注意:不能經過訪問權限、返回類型、拋出的異常進行重載
linux

!五、abstract的method是否可同時是static,是否可同時是native,是否可同時是synchronized
static 修飾的方法不可以被重寫。
git


!六、是否能夠繼承String類
不能夠,String是被final修飾的類。
程序員

!七、構造器Constructor是否可被override?
構造器不能被繼承,因此也不可以被重寫。
web

!八、做用域public,protected,private,以及不寫時的區別?
不寫時默認是default,這裏主要說明這幾個做用域的使用範圍。
做用域 當前類 同一package 子孫類 其餘package
public √ √ √ √
protected √ √ √ ×
friendly √ √ × ×
private √ × × ×
這裏須要說明的是在同一個package, public、protected、friendly使用範圍一致。
而在其餘package中,只有子孫類中protected才能被訪問。
面試


二:collections相關的數據結構及API
http://cmsblogs.com/?p=106
!一、列舉幾個Java Collection類庫中的經常使用類
此處應該有Collection類圖。
Collection是java.util 中的一個接口。繼承自Iterable。
子接口:List、Set、Queue...
實現類:ArrayList、LinkedList、HashSet、TreeSet、Vector、Stack
其餘相關類:Iterator、TreeMap、HashTable、HashMap
Collection接口是最基本的集合接口,它不提供直接的實現,Java SDK提供的類都是繼承自Collection的"子接口"
如List和Set。Collection所表明的是一種規則,它所包含的元素都必須遵循一條或者多條規則。
若有些容許重複而有些則不能重複、有些必需要按照順序插入而有些則是散列,有些支持排序可是有些則不支持。
正則表達式

!二、List、Set、Map是否都繼承自Collection接口?
List、Set繼承自Collection接口,而Map不是。
(1)List 所表明的是有序的Collection。實現List接口的集合主要有:ArratList、LinkedList、Vector、Stack。
(2) Set是一種不包括重複元素的Collection。實現了Set接口的集合有:EnumSet、HashSet、TreeSet。
(3)Map與List、Set接口不一樣,它是由一系列鍵值對組成的集合,提供了key到Value的映射。同時它也沒有繼承Collection。
實現map的有:HashMap、TreeMap、HashTable、Properties、EnumMap。
redis

!三、HashMap和Hashtable的區別
需查看源碼。
一、歷史緣由:Hashtable是基於陳舊的Dictionary類的,HashMap是Java 1.2引進的Map接口的一個實現 。
二、同步性:Hashtable是線程安全的,也就是說是同步的,而HashMap是線程序不安全的,不是同步的 。
三、值:只有HashMap可讓你將空值做爲一個表的條目的key或value 。

1.HashTable的方法是同步的,在方法的前面都有synchronized來同步,HashMap未經同步,因此在多線程場合要手動同步
2.HashTable不容許null值(key和value都不能夠) ,HashMap容許null值(key和value均可以)。
3.HashTable有一個contains(Object value)功能和containsValue(Object value)功能同樣。
4.HashTable使用Enumeration進行遍歷,HashMap使用Iterator進行遍歷。
5.HashTable中hash數組默認大小是11,增長的方式是 old*2+1。HashMap中hash數組的默認大小是16,並且必定是2的指數。
6.哈希值的使用不一樣,HashTable直接使用對象的hashCode,代碼是這樣的:
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
而HashMap從新計算hash值,並且用與代替求模:

1 int hash = hash(k); 2 int i = indexFor(hash, table.length); 3 static int hash(Object x) { 4 h ^= (h >>> 20) ^ (h >>> 12); 5 return h ^ (h >>> 7) ^ (h >>> 4); 6 }

 

&&延展:
A、HashMap與HashSet的關係
一、HashSet底層是採用HashMap實現的:

public HashSet() { map = new HashMap<E,Object>(); }



二、調用HashSet的add方法時,其實是向HashMap中增長了一行(key-value對),該行的key就是向HashSet增長的那個對象,該行的value就是一個Object類型的常量。

複製代碼
private static final Object PRESENT = new Object(); public boolean add(E e) { return map.put(e, PRESENT)==null; } public boolean remove(Object o) { return map.remove(o)==PRESENT; }
複製代碼

 

B、HashMap 和 ConcurrentHashMap 的關係
關於這部份內容建議本身去翻翻源碼,ConcurrentHashMap 也是一種線程安全的集合類,他和HashTable也是有區別的,主要區別就是加鎖的粒度以及如何加鎖,ConcurrentHashMap 的加鎖粒度要比HashTable更細一點。將數據分紅一段一段的存儲,而後給每一段數據配一把鎖,當一個線程佔用鎖訪問其中一個段數據的時候,其餘段的數據也能被其餘線程訪問。

%四、HashMap中是否任何對象均可以作爲key,用戶自定義對象作爲key有沒有什麼要求?
用戶自定義的對象看成key須要實現Map中的hashCode和Equals方法。
HashMap用能夠的哈希值來存儲和查找鍵值對。
當插入一個Entry時,HashMap會計算Entry Key 的哈希值。Map會根據這個哈希值把Entry插入到相應的位置。
查找時,HashMap經過計算Key的哈希值到特定的位置查找這個Entry。
若是咱們在使用自定義對象作爲Key時,咱們須要保證當改變對象的狀態的時候,不改變它的哈希值。

!五、Collection 和 Collections的區別
Collection 是一個接口,它是各類集合結構的父接口。
Collections是一個包裝類,它包含有各類有關集合操做的靜態方法。Collcetions不能被實例化,它的構造函數是私有的。
例如:
sort():專門針對LIST進行排序,在實際開發中,咱們確實常常須要對一個裝有一些對象的LIST進行排序!
min/max():若是,咱們想取一個集合中的最小、最大值,如何快速的取到呢?上面的方法將幫咱們實現。
reverse():若是,咱們僅僅須要獲得一個LIST的相反順序!
Shuffle():經過這個方法,將使得LIST中元素的順序不可預測,即順序是隨機的,混排的。
synchronizedList():返回指定列表支持的同步(線程安全的)列表。
...

%六、其餘的集合類:concurrenthashmap,treemap,treeset,linkedhashmap等。
(1)ConcurrentHashMap:http://www.cnblogs.com/ITtangtang/p/3948786.html
(2)TreeMap:
(3)TreeSet:
(4)LinkedHashMap:


三:異常體系
!一、Error、Exception和RuntimeException的區別,做用又是什麼?列舉3個以上的RuntimeException
Throwable是java語言中全部錯誤和異常的超類。它有兩個子類:Error、Exception。
Error爲錯誤的意思,是程序沒法處理的,如OutOfMemoryErro、ThreadDeath等,出現這種狀況你惟一能作的就是聽之任之,交由JVM來處理,不過JVM在大多數狀況下會選擇停止線程。
Exception是程序能夠處理的異常,分爲CheckedException(受檢異常),另外一種是UncheckedException(不受檢異常)。其中CheckExpection是發生在編譯階段,必需要使用try...catch(或者throws),不然編譯不經過。
而UnceckedException發生在運行期,具備不肯定性,主要是由程序的邏輯問題引發的,難以排查,咱們通常須要縱觀全局纔可以發現這類的異常錯誤。因此在程序設計中咱們須要認真考慮,儘可能處理異常,即便產生了異常,也能儘可能保證程序朝着有利方向發展。


!二、Java中的異常處理機制的簡單原理和應用
(1)當Java程序違反了Java的語義規則時,Java虛擬機就會將發生的錯誤表示爲一個異常。
違反語義規則包括2種狀況:
(a)一種是Java類庫內置的語義檢查。
(b)另外一種狀況就是Java容許程序員擴展這種語義檢查,程序員能夠建立本身的異常,並自由選擇在什麼時候用throw關鍵字引起異常。
(2)全部的異常都是java.lang.Throwable的子類。

!三、內存溢出和內存泄露
http://wade6.iteye.com/blog/1842907
內存溢出:指在指定大小的內存空間,寫入了超出大小的數據,從而致使了內存益處。通俗地說,就是內存不夠,沒辦法支持當前程序。
當發生內存益出時,程序將沒法進行,強制終止。
內存泄露:指某個程序已再也不執行,卻始終佔用着內存,不釋放,從而消耗着資源,稱其爲內存泄露。
當發生內存泄露,那麼可用內存會逐漸減小,從而下降性能。

(a)對於內存的溢出可能發生的狀況,大概有幾種:
一、在程序中存在死循環,或者循環過多,而產生了過多重複的對象的實例。
二、存在對象的引用,使用完後沒有清除,致使Java虛擬機不能回收。
三、一次操做時,在內存中加載了大量的數據,原則上說,在java中,因爲它的自動垃圾回收機制,出現內存溢出的可能性並非很大。

(b)對於內存泄露可能發生的狀況,大概有幾種:
一、長生命週期的對象持有短生命週期的引用。
這是內存泄露最多見的場景,也是代碼設計中常常出現的問題。
例如:在全局靜態map中緩存局部變量,且沒有清空操做,隨着時間的推移,這個map會愈來愈大,形成內存泄露。

二、修改hashset中對象的參數值,且參數是計算哈希值的字段。
當一個對象被存儲進HashSet集合中之後,就不能修改這個對象中的那些參與計算哈希值的字段,不然對象修改後的哈希值與最初存儲進HashSet集合中時的哈希值就不一樣了,在這種狀況下,即便在contains方法使用該對象的當前引用做爲參數去HashSet集合中檢索對象,也將返回找不到對象的結果,這也會致使沒法從HashSet集合中刪除當前對象,形成內存泄露。

三、機器的鏈接數和關閉時間設置。
長時間開啓很是耗費資源的鏈接,也會形成內存泄露。

解決方案:
一、儘早釋放無用對象的引用
二、使用字符串處理,避免使用String,應大量使用StringBuffer,每個String對象都得獨立佔用內存一塊區域
三、儘可能少用靜態變量,由於靜態變量存放在永久代(方法區),永久代基本不參與垃圾回收
四、避免在循環中建立對象
五、開啓大型文件或從數據庫一次拿了太多的數據很容易形成內存溢出,因此在這些地方要大概計算一下數據量的最大值是多少,而且設定所需最小及最大的內存空間值。

四:其餘
!一、String和StringBuffer、StringBuilder的區別
http://www.cnblogs.com/xudong-bupt/p/3961159.html
1,可變與不可變化性
String類中使用字符數組保存字符串,由於有final修飾,因此string是不可變的。
private final char value[];
關於不可變性:http://www.hollischuang.com/archives/1230
StringBUilder和StringBuffer的公共父類是:AbstracStringBuilder類,在AbstracStringBu中也是使用字符數組保存字符串,可知這兩種對象都是可變的。
char[] value;

2,是否多線程安全
String中對象是不可變得,也能夠理解爲常量,顯然是線程安全的。
StringBuffer對方法加了同步鎖或者對調用的方法加了同步鎖,因此是線程安全的。
StringBuilder並無對方法進行加同步鎖,因此是非線程安全的。

!二、String s = 「123」;這個語句有幾個對象產生
建立了一個對象,將「123」存儲到常量池中。
延展:String s = new String("abc")這個語句建立了幾個對象?
這種題目主要就是爲了考察程序員對字符串對象的常量池掌握與否。上述的語句中是建立了2個對象,第一個對象是」abc」字符串存儲在常量池中,第二個對象在JAVA Heap中的 String 對象。


!三、reader和inputstream區別
首先要分清reader和inputstream,一個是讀取字符流,一個是讀取字節流。
InputStream是表示字節輸入流的全部類的超類,Reader是用於讀取字符流的抽象類
InputStream提供的是字節流的讀取,而非文本讀取,這是和Reader類的根本區別。
即用Reader讀取出來的是char數組或者String ,使用InputStream讀取出來的是byte數組。
http://blog.sina.com.cn/s/blog_6d3183b50101cri5.html


!四、==和equals的區別
1.基本數據類型,也稱原始數據類型。byte,short,char,int,long,float,double,boolean
他們之間的比較,應用雙等號(==),比較的是他們的值。
2.複合數據類型(類)
當他們用(==)進行比較的時候,比較的是他們在內存中的存放地址,因此,除非是同一個new出來的對象,他們的比較後的結果爲true,不然比較後結果爲false。
JAVA當中全部的類都是繼承於Object這個基類的,在Object中的基類中定義了一個equals的方法,這個方法的初始行爲是比較對象的內存地 址,但在一些類庫當中這個方法被覆蓋掉了,如String,Integer,Date在這些類當中equals有其自身的實現,而再也不是比較類在堆內存中的存放地址了。
對於複合數據類型之間進行equals比較,在沒有覆寫equals方法的狀況下,他們之間的比較仍是基於他們在內存中的存放位置的地址值的,由於Object的equals方法也是用雙等號(==)進行比較的,因此比較後的結果跟雙等號(==)的結果相同。

對於String複寫Object的equals方法,只是比較字符串值是否相等:
String類中的equals()方法:

複製代碼
 1 public boolean equals(Object anObject)  2 {  3 //若是是同一個對象  4 if (this == anObject)  5  {  6 return true;  7  }  8 //若是傳遞進來的參數是String類的實例  9 if (anObject instanceof String) 10  { 11 String anotherString = (String)anObject; 12 int n = count;//字符串長度 13 if (n == anotherString.count) //若是長度相等就進行比較 14  { 15 char v1[] = value;//取每個位置的字符 16 char v2[] = anotherString.value; 17 int i = offset; 18 int j = anotherString.offset; 19 while (n-- != 0) //對於每一位置逐一比較 20  { 21 if (v1[i++] != v2[j++]) 22 return false; 23  } 24 return true; 25  } 26  } 27 return false; 28 }
複製代碼


%五、hashCode的做用
http://www.cnblogs.com/dolphin0520/p/3681042.html
不少地方都會利用到hash表來提升查找效率。在Java的Object類中有一個方法:
public native int hashCode();
hashCode方法的主要做用是爲了配合基於散列的集合一塊兒正常運行,這樣的散列集合包括HashSet、HashMap以及HashTable。
考慮一種狀況,當向集合中插入對象時,如何判別在集合中是否已經存在該對象了?(注意:集合中不容許重複的元素存在)
也許大多數人都會想到調用equals方法來逐個進行比較,這個方法確實可行。可是若是集合中已經存在一萬條數據或者更多的數據,若是採用equals方法去逐一比較,效率必然是一個問題。此時hashCode方法的做用就體現出來了,當集合要添加新的對象時,先調用這個對象的hashCode方法,獲得對應的hashcode值,實際上在HashMap的具體實現中會用一個table保存已經存進去的對象的hashcode值,若是table中沒有該hashcode值,它就能夠直接存進去,不用再進行任何比較了;若是存在該hashcode值, 就調用它的equals方法與新元素進行比較,相同的話就不存了,不相同就散列其它的地址,因此這裏存在一個衝突解決的問題,這樣一來實際調用equals方法的次數就大大下降了,說通俗一點:Java中的hashCode方法就是根據必定的規則將與對象相關的信息(好比對象的存儲地址,對象的字段等)映射成一個數值,這個數值稱做爲散列值。


%六、hashCode和equals方法的關係
在有些狀況下,程序設計者在設計一個類的時候爲須要重寫equals方法,好比String類,可是千萬要注意,在重寫equals方法的同時,必須重寫hashCode方法。
也就是說對於兩個對象,若是調用equals方法獲得的結果爲true,則兩個對象的hashcode值一定相等;
若是equals方法獲得的結果爲false,則兩個對象的hashcode值不必定不一樣;
若是兩個對象的hashcode值不等,則equals方法獲得的結果一定爲false;
若是兩個對象的hashcode值相等,則equals方法獲得的結果未知。


?七、Object類中有哪些方法,列舉3個以上(能夠引導)
媽蛋,這個在我校招也是我參加的第一次面試時問到了,當時以爲怎麼會問這麼簡單的問題,可是最後本身仍是回答不全。
Object方法:equals()、toString()、finalize()、hashCode()、getClass()、clone()、wait()、notify()、notifyAll()


!八、char型變量中能不能存貯一箇中文漢字?爲何?
CHAR類型變量時可以定義成爲一箇中文的,由於java中以unicode編碼,一個char佔16個字節,因此放一箇中文是沒問題的。
char型變量是用來存儲Unicode編碼的字符的,unicode編碼字符集中包含了漢字,因此,char型變量中固然能夠存儲漢字啦。不過,若是某個特殊的漢字沒有被包含在unicode編碼字符集中,那麼,這個char型變量中就不能存儲這個特殊漢字。補充說明:unicode編碼佔用兩個字節,因此,char類型的變量也是佔用兩個字節。

%九、瞭解過哪些JDK8的新特性,舉例描述下相應的特性?
!十、Input/OutputStream和Reader/Writer有何區別?何爲字符,何爲字節?
!十一、如何在字符流和字節流之間轉換?
InputStreamReader是字節流向字符流的橋樑,它使用指定的charset讀取字節並將其解碼爲字符。
OutputStreamWriter是字符流通向字節流的橋樑,它使用指定的charset將要寫入流中的字符編碼成字節,它使用的字符集能夠由名稱指定或顯示給定,不然將接受默認的字符集:

!十二、啓動一個線程是用run()仍是start()?
start()方法是啓動(即開闢)一個線程的方法,所以線程的啓動必須經過此方法,
而run()方法,只是Thread類的一個方法,它自己並不能開闢線程。


%1三、海量數據查詢、存儲
!1四、switch能夠使用那些數據類型
A switch works with the byte, short, char, and int primitive data types. It also works with enumerated types (discussed in Enum Types), the String class, and a few special classes that wrap certain primitive types: Character, Byte, Short, and Integer (discussed in Numbers and Strings).

!1五、多線程與死鎖
實現多線程的幾種方式:
繼承Thread/實現Runnable接口。
所謂死鎖: 是指兩個或兩個以上的進程在執行過程當中,因爭奪資源而形成的一種互相等待的現象,若無外力做用,它們都將沒法推動下去。

%1六、Java的四種引用
!1七、序列化與反序列化
!1八、自動裝箱與拆箱
!1九、正則表達式

五:JAVA開發工具、環境的使用
IDE、maven、svn/git、Linux、Firebug


第二部分: Java高級

一:多線程
!一、多線程的實現方式,有什麼區別
java中能夠經過繼承Thread和實現Runnable接口來實現多線程。
二者的區別:
a,一個類只能繼承一個父類,存在侷限;一個類中能夠實現多個接口。
b,在實現Runable接口的時候調用Thread的Thread(Runnable run)或者Thread(Runnable run, String name)構造方法建立進程時,使用同一個Runnable實例,因此創建的多線程的實例變量是能夠共享的。

public class RunThread implements Runnable{} public static void main(String[] args){ RunThread thread = new RunThread(); new Thread(thread).start(); new Thread(thread).start(); }


c,Runnable接口和Thread之間的聯繫:
public class Thread extends Object implements Runnable


%二、同步和併發是如何解決的


三、什麼叫守護線程,用什麼方法實現守護線程(Thread.setDeamon()的含義)
在Java中有兩類線程:User Thread(用戶線程)、Daemon Thread(守護線程)
用個比較通俗的好比,任何一個守護線程都是整個JVM中全部非守護線程的保姆:
只要當前JVM實例中尚存在任何一個非守護線程沒有結束,守護線程就所有工做;只有當最後一個非守護線程結束時,守護線程隨着JVM一同結束工做。
JVM內部的實現是若是運行的程序只剩下守護線程的話,程序將終止運行,直接結束。因此守護線程是做爲輔助線程存在的,主要的做用是提供計數等等輔助的功能。

%四、如何中止一個線程?
終止線程的三種方法:
1. 使用退出標誌,使線程正常退出,也就是當run方法完成後線程終止。
在定義退出標誌exit時,使用了一個Java關鍵字volatile,這個關鍵字的目的是使exit同步,也就是說在同一時刻只能由一個線程來修改exit的值,
2. 使用stop方法強行終止線程(這個方法不推薦使用,由於stop和suspend、resume同樣,也可能發生不可預料的結果)。
使用stop方法能夠強行終止正在運行或掛起的線程。咱們能夠使用以下的代碼來終止線程:
thread.stop();
雖然使用上面的代碼能夠終止線程,但使用stop方法是很危險的,就象忽然關閉計算機電源,而不是按正常程序關機同樣,可能會產生不可預料的結果,所以,並不推薦使用stop方法來終止線程。
3. 使用interrupt方法中斷線程。
使用interrupt方法來終端線程可分爲兩種狀況:
(1)線程處於阻塞狀態,如使用了sleep方法。
(2)使用while(!isInterrupted()){……}來判斷線程是否被中斷。
在第一種狀況下使用interrupt方法,sleep方法將拋出一個InterruptedException例外,而在第二種狀況下線程將直接退出。下面的代碼演示了在第一種狀況下使用interrupt方法。
注意:在Thread類中有兩個方法能夠判斷線程是否經過interrupt方法被終止。一個是靜態的方法interrupted(),一個是非靜態的方法isInterrupted(),這兩個方法的區別是interrupted用來判斷當前線是否被中斷,而isInterrupted能夠用來判斷其餘線程是否被中斷。所以,while (!isInterrupted())也能夠換成while (!Thread.interrupted())。

!五、解釋是一下什麼是線程安全?舉例說明一個線程不安全的例子。解釋Synchronized關鍵字的做用。
線程安全就是多線程訪問時,採用了加鎖機制,當一個線程訪問該類的某個數據時,進行保護,其餘線程不能進行訪問直到該線程讀取完,其餘線程纔可以使用。不會出現數據不一致或者數據污染。
線程不安全就是不提供數據訪問保護,有可能出現多個線程前後更改數據形成所獲得的數據是髒數據
在多線程的狀況下,因爲同一進程的多個線程共享同一片存儲空間,在帶來方便的同時,也帶來了訪問衝突這個嚴重的問題。Java語言提供了專門機制以解決這種衝突,有效避免了同一個數據對象被多個線程同時訪問。
因爲咱們能夠經過 private 關鍵字來保證數據對象只能被方法訪問,因此咱們只需針對方法提出一套機制,這套機制就是 synchronized 關鍵字,它包括兩種用法:synchronized 方法和 synchronized 塊。

 

!六、當一個線程進入一個對象的一個synchronized方法後,其它線程是否可進入此對象的其它方法?
可進入其餘對象的非synchronized方法,可是若是其餘有加synchronized的方法將處於阻塞狀態。

二:內存結構,GC
!一、gc的概念,若是A和B對象循環引用,是否能夠被GC?
兩個對象相互引用,是會不會被GC沒有直接關係。採用的GC Roots可達性來決定是否會被GC回收。
如今的GC都採用分代收集的方式,不一樣的區採用不一樣的算法,大體有:複製,標記-清掃,標記-壓縮,標記-清掃-壓縮等。

%二、Java中的內存溢出是如何形成的
http://outofmemory.cn/java/OutOfMemoryError/PermGen-space-Java-heap-space-unable-create-new-native-thread
jvm管理的內存大體包括三種不一樣類型的內存區域:Permanent Generation space(永久保存區域)、Heap space(堆區域)、Java Stacks(Java棧)。
其中永久保存區域主要存放Class(類)和Meta的信息,Class第一次被Load的時候被放入PermGen space區域,Class須要存儲的內容主要包括方法和靜態屬性。
堆區域用來存放Class的實例(即對象),對象須要存儲的內容主要是非靜態屬性。每次用new建立一個對象實例後,對象實例存儲在堆區域中,這部分空間也被jvm的垃圾回收機制管理。
而Java棧跟大多數編程語言包括彙編語言的棧功能類似,主要基本類型變量以及方法的輸入輸出參數。Java程序的每一個線程中都有一個獨立的堆棧。容易發生內存溢出問題的內存空間包括:Permanent Generation space和Heap space。

第一種OutOfMemoryError: PermGen space
發生這種問題的原意是程序中使用了大量的jar或class,使java虛擬機裝載類的空間不夠,與Permanent Generation space有關。解決這類問題有如下兩種辦法:
1,增長java虛擬機中的XX:PermSize和XX:MaxPermSize參數的大小,其中XX:PermSize是初始永久保存區域大小,XX:MaxPermSize是最大永久保存區域大小。如針對tomcat6.0,在catalina.sh 或catalina.bat文件中一系列環境變量名說明結束處(大約在70行左右) 增長一行: JAVA_OPTS=" -XX:PermSize=64M -XX:MaxPermSize=128M" 若是是windows服務器還能夠在系統環境變量中設置。感受用tomcat發佈sprint+struts+hibernate架構的程序時很容易發生這種內存溢出錯誤。使用上述方法,我成功解決了部署ssh項目的tomcat服務器常常宕機的問題。
2,清理應用程序中web-inf/lib下的jar,若是tomcat部署了多個應用,不少應用都使用了相同的jar,能夠將共同的jar移到tomcat共同的lib下,減小類的重複加載。這種方法是網上部分人推薦的,我沒試過,但感受減小不了太大的空間,最靠譜的仍是第一種方法。
第二種OutOfMemoryError: Java heap space
發生這種問題的緣由是java虛擬機建立的對象太多,在進行垃圾回收之間,虛擬機分配的到堆內存空間已經用滿了,與Heap space有關。解決這類問題有兩種思路:
1,檢查程序,看是否有死循環或沒必要要地重複建立大量對象。找到緣由後,修改程序和算法。 我之前寫一個使用K-Means文本聚類算法對幾萬條文本記錄(每條記錄的特徵向量大約10來個)進行文本聚類時,因爲程序細節上有問題,就致使了Java heap space的內存溢出問題,後來經過修改程序獲得瞭解決。
2,增長Java虛擬機中Xms(初始堆大小)和Xmx(最大堆大小)參數的大小。如:set JAVA_OPTS= -Xms256m -Xmx1024m


%三、jvm gc如何判斷對象是否須要回收,有哪幾種方式?
(1)、引數記數 (Reference Counting)
給對象添加一個引用計數其,每有一個地方引用這個對象,計數器值加1,每有一個引用失效則減1。
優勢:實現簡單、判斷效率高。 缺點:難以解決對象之間的循環引用問題。
(2)、可達性分析(Reachability Analysis)
從GC Roots(每種具體實現對GC Roots有不一樣的定義)做爲起點,向下搜索它們引用的對象,能夠生成一棵引用樹,樹的節點視爲可達對象,反之視爲不可達。
JVM使用「可達性分析算法」來斷定一個對象是否會能夠被回收,有兩個細節須要注意:
1.Java的GC Roots如何定義
Java中GC Roots包括如下幾種對象:
a.虛擬機棧(幀棧中的本地變量表)中引用的對象
b.方法區中靜態屬性引用的對象
c.方法區中常量引用的對象
d.本地方法棧中JNI引用的對象

2.不可達對象必定會被回收嗎
不是。
執行垃圾回收前JVM會執行不可達對象的finalize方法,若是執行完畢以後該對象變爲可達,則不會被回收它。
但一個對象的finalize方法只會被執行一次。


?四、Java中的內存溢出和C++中的內存溢出,是一個概念嗎?
!五、引用計數,對象引用遍歷;jvm有哪幾種垃圾回收機制?講講分代回收機制
引用技術法 Reference Counting:
引用計數器的實現很簡單,對於一個對象 A,只要有任何一個對象引用了 A,則 A 的引用計數器就加 1,當引用失效時,引用計數器就減 1。只要對象 A 的引用計數器的值爲 0,則對象 A 就不可能再被使用。
引用計數器的實現也很是簡單,只須要爲每一個對象配置一個整形的計數器便可。可是引用計數器有一個嚴重的問題,即沒法處理循環引用的狀況。所以,在 Java 的垃圾回收器中沒有使用這種算法。
分帶回收:Generational Collection

 

三:CLASSLOADER
!一、ClassLoader的功能和工做模式
Java中的全部類,必須被裝載到jvm中才能運行,這個裝載工做是由jvm中的類裝載器完成的,類裝載器所作的工做實質是把類文件從硬盤讀取到內存中,JVM在加載類的時候,都是經過ClassLoader的loadClass()方法來加載class的,loadClass使用雙親委派模式。

 

四:NIO
?一、IO和NIO本質不一樣在實際項目使用場景及如何使用

五:其餘
?一、hashcode 有哪些算法
%二、反射,是否能夠調用私有方法,在框架中的運用
?三、知道範型的實現機制嗎?
?四、Socket編程一般出現的異常有哪些,什麼狀況下會出現
?五、瞭解JVM啓動參數嗎?-verbose -Xms -Xmx的意思是什麼?
%六、StringBuffer的實現方式,容量如何擴充
%七、代理機制的實現


第三部分: JavaEE

一:Servlet的掌握,包括新的異步Servlet
!一、Servelt的概念。常問http request能得到的參數
Servlet 是一種基於java技術的web組件,是一種基於java的且與第三方平臺無關的類。一般,它能夠被Web 服務器編譯、加載和運行,最後生成動態的資源內容。

%二、servlet中,如何定製session的過時時間?
在web.xml中配置:
<session-config>
<session-timeout>20</session-timeout>
</session-config>
上面這種設置,對整個web應用生效。當客戶端20分鐘內都沒有發起請求時,容器會將session幹掉。單位爲分鐘。

session.setMaxInactiveInterval(30*60);
單位是秒。Session設置產生效果的優先循序是,先程序後配置,先局部後總體。

!三、Servlet中的session工做原理 (禁用cookie如何使用session)
http://dxz.iteye.com/blog/2193399?utm_source=tuicool&utm_medium=referral
session,中文常常翻譯爲會話,其原本的含義是指善始善終的一系列動做/消息。
Cookies是一種可以讓網站服務器把少許數據儲存到客戶端的硬盤或內存,或是從客戶端的硬盤讀取數據的一種技術。Cookies是當你瀏覽某網站時,由Web服務器置於你硬盤上的一個很是小的文本文件,它能夠記錄你的用戶ID、密碼、瀏覽過的網頁、停留的時間等信息。
session: 當用戶請求來自應用程序的 Web 頁時,若是該用戶尚未會話,則 Web 服務器將自動建立一個 Session 對象。當會話過時或被放棄後,服務器將終止該會話。
cookie機制:採用的是在客戶端保持狀態的方案,而session機制採用的是在服務端保持狀態的方案。同時咱們看到因爲服務器端保持狀態的方案在客戶端也須要保存一個標識,因此session機制可能須要藉助cookie機制來達到保存標識的目的。
session機制:服務器首先檢查這個客戶端的請求裏是否已經包含了一個session標識(session id)若是含有sessionid則說明之前爲此客戶端建立過session服務器就會把這個按照session Id把session給檢索出來(若是檢索不到就會從新創建一個session),若是客戶端請求不包含session id,
則爲此客戶端建立一個session而且生成一個與此對應的session id,session id是一個不會重複的字符串,該id會在本次響應客戶端的時候傳送給客戶端。
保存這個session id的方式:
a、能夠採用cookie,這樣就能夠在交互的過程當中自動的按照規則把這個表示發送給服務器。通常這個cookie的名字相似於SEEESIONID的,可是cookie能夠被人爲禁止。
b、因此也常用一種使用一種叫作URL重寫的技術,就是把sessionid直接附加在URL路徑的後面。
c、還有一種技術叫作表單隱藏字段。就是服務器會自動修改表單添加一個隱藏的字段,在表單提交的時候就會把這個session id傳遞會服務器。

session和cookie的區別:
cookie數據放在客戶端,session數據放在服務器端。
cookie不是很安全,別人能夠分析存放在本地的cookie並進行cookie欺騙考慮安全性的話應該使用session。
session由於在服務器上保存了不少信息,當在訪問量比較大的時候會增長服務器的負擔,從這方面考慮應該使用cookie
單個cookie的數據不能超過4K,不少瀏覽器都限制一個站點最多保存20個cookie
有人建議將登陸信息等重要信息放在session中,非重要的信息能夠放在cookie中。


!四、servlet中,filter的應用場景有哪些?
1,經過filter進行全站字符編碼過濾
get/post 提交不一樣。
post 是表單提交
get方法提交的話是將數據帶在你的url上面傳過去的。
request.setCharacterEncoding("UTF-8");這個是隻對post方法有用,若是想對get方法有用就在tomcat配置文件server.xml中Connector元素下設置
URIEncoding="UTF-8"


!五、描述JSP和Servlet的區別、共同點(JSP的工做原理)。
儘管JSP在本質上就是SERVLET,可是二者的建立方式不同.Servlet徹底是JAVA程序代碼構成擅長於流程控制和事務處理而經過Servlet
來生成動態網頁很不直觀;JSP由HTML代碼和JSP標籤構成能夠方便地編寫動態網頁所以在實際應用中採用Servlet來控制業務流程,而採
用JSP來生成動態網頁.在struts框架中,JSP位於MVC設計模式的視圖層,而Servlet位於控制層。

服務器在執行jsp的時候,首先把jsp翻譯成一個Servlet,因此咱們訪問jsp時,其實不是在訪問jsp,而是在訪問jsp翻譯事後的那個Servlet

?六、JSP的動態include和靜態include
!七、Servlet的生命週期
init service destory


二:WEB框架的掌握(挑其掌握的一種)
!一、Struts中請求的實現過程
!二、MVC概念
%三、談一下本身最熟悉的web框架?而後就瞭解的web框架再深刻下去
%四、Spring mvc與Struts mvc的區別 (什麼是Mvc框架)
?五、Service嵌套事務處理,如何回滾

三:http相關(內部重定向,外部重定向),http返回碼
!一、session和cookie的區別
!二、HTTP請求中Session實現原理?
%三、若是客戶端禁止Cookie能實現Session嗎?
!四、http get和post區別
GET在瀏覽器回退時是無害的,而POST會再次提交請求。
GET產生的URL地址能夠被Bookmark,而POST不能夠。
GET請求會被瀏覽器主動cache,而POST不會,除非手動設置。
GET請求只能進行url編碼,而POST支持多種編碼方式。
GET請求參數會被完整保留在瀏覽器歷史記錄裏,而POST中的參數不會被保留。
GET請求在URL中傳送的參數是有長度限制的,而POST麼有。
對參數的數據類型,GET只接受ASCII字符,而POST沒有限制。
GET比POST更不安全,由於參數直接暴露在URL上,因此不能用來傳遞敏感信息。
GET參數經過URL傳遞,POST放在Request body中。

!五、在web開發中,用redirect與forward作跳轉有什麼區別?web應用服務器對用戶請求一般返回一些狀態碼,請描述下分別以4和5開頭的狀態碼
100-199:表示成功接收請求,要求客戶端繼續提交下一次請求才能完成整個處理過程。
200-299:表示成功接收請求並已完成整個處理過程,經常使用200.
300-399:爲完成請求,客戶需進一步細化請求。例如,請求的資源已經移動一個新地址,經常使用30二、307和304
400-499:客戶端的請求有錯誤,經常使用404.
500-599:服務器出現錯誤,經常使用500。

四:spring,ibatis,hibernate相關
?一、Hibernate/Ibatis二者的區別
?二、OR Mapping的概念
%三、hibernate一級和二級緩存是否知道
?四、使用hibernate實現集羣部署,須要注意些什麼
!五、Spring如何實現AOP和IOC的?
!六、Spring的核心理念是什麼?是否瞭解IOC和AOP
!七、Spring的事務管理 ,Spring bean注入的幾種方式
!八、Spring AOP解決了什麼問題

五:jboss,tomcat等容器相關
?一、Tomcat和weblogic的最根本的區別
?二、Jboss端口在哪一個配置文件中修改

六:web安全,SQL注入,XSS, CSRF等
%一、SQL注入 SQL安全

七:AJAX相關
?一、AJAX感覺,有什麼缺點?
%二、你使用的是Ajax的那種框架?
?三、Ajax如何解決跨域問題

八:Web Service
?一、簡述WebService是怎麼實現的

九:JMS
?一、JMS的模式兩種模式
隊列模式: 一對一
主題(訂閱)模式: 一對多

十:其餘
?一、Js:confirm()方法
?二、Iframe的優缺點
%三、咱們在web應用開發過程當中常常遇到輸出某種編碼的字符,如iso8859-1等,如何輸出一個某種編碼的字符串?(主要是考量有沒有碰到過編碼問題,問題是如何解決的)
?四、怎麼獲取到客戶端的真實IP?
?五、名詞解釋:jndi,rmi,jms,事務,若是有了解的話能夠深刻
?六、WEB層如何實現Cluster




 

第四部分: 數據庫相關

一:關係模型理論:
!一、範式
?二、rownum和rowid的區別與使用

二:事務相關
%一、Transaction有哪幾種隔離級別?(Isolation Level)
?二、Global transaction的原理是什麼?
!三、事務是什麼?

三:併發控制
%一、樂觀鎖,悲觀鎖

四:ORACLE或MYSQL題目
!一、分頁如何實現(Oracle,MySql)
!二、Mysql引擎

五:其餘
%一、數據庫操做的性能瓶頸一般在哪裏, 1000萬級別訪問,在數據庫和java程序上考慮哪些來進行性能優化
%二、性能方面。多數結合多線程、同步來問,以提取一張大表數據來做爲例子 解決性能的方法
!三、表關聯時,內鏈接,左鏈接,右鏈接怎麼理解?
!四、Statement和PreparedStatement之間的區別
!五、用JDBC怎樣從數據庫中查詢一條記錄
%六、索引以及索引的實現(B+樹介紹、和B樹、R樹區別

 

第五部分: 設計模式

一:高內聚,低耦合方面的理解
?一、在項目中是否採用分層的結構,是怎樣劃分的,各層之間採用了哪些相關技術? 對哪些設計模式比較熟悉?
%二、什麼是低耦合和高聚合?封裝原則又是什麼意思?
%三、類A依賴類B,會產生什麼問題?怎樣解除這種耦合?

二:設計模式方面
%一、談一下本身瞭解或者熟悉的設計模式
!二、Singleton的幾種實現方式
?三、工廠模式和抽象工廠模式之間的區別
!四、簡述M-V-C模式解決了什麼問題?

三:其餘
%一、說說你所知道的UML圖,在項目中是如何運用

 

 

第六部分: 其餘清單 只有題目

複製代碼
J2SE基礎
1. 九種基本數據類型的大小,以及他們的封裝類。
(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
static Integer valueOf(int i) : 切記-127--+127範圍, 使用cache


2. Switch可否用string作參數?
能夠。在 Java 7以前,switch 只能支持 byte、short、char、int或者其對應的封裝類以及 Enum 類型。
在 Java 7中,String支持被加上了。

3. equals與==的區別。
在java中的數據類型能夠分爲兩類。
1,基本數據類型,他們之間的比較用==表示比較它們的值。
2,引用數據類型,當使用==進行比較時,比較的是它們內存中的存放地址是否相同。而equals內部也是直接引用的==。
可是equals是Object中的方法, 咱們能夠經過複寫來改變equals的用法, 好比String中的equals只是比較兩個變量的值是否相等:
public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        int n = count;
        if (n == anotherString.count) {
            char v1[] = value;
            char v2[] = anotherString.value;
            int i = offset;
            int j = anotherString.offset;
            while (n-- != 0) {
                if (v1[i++] != v2[j++])
                    return false;
            }
            return true;
        }
    }
    return false;
}


4. Object有哪些公用方法?
equals(), toString(), hashCode(), getClass(), notify(), notifyAll(), wait(), finalize(), clone()

5. Java的四種引用,強弱軟虛,用到的場景。


6. Hashcode的做用。(這裏來講明equals和hashCode的關聯)
若是兩個對象相等,那麼他們必定有相同的哈希值(hash code)。
若是兩個對象的哈希值相等,那麼這兩個對象有可能相等也有可能不相等。(須要再經過equals來判斷)
一、equals方法用於比較對象的內容是否相等(覆蓋之後)
二、hashcode方法只有在集合中用到
三、當覆蓋了equals方法時,比較對象是否相等將經過覆蓋後的equals方法進行比較(判斷對象的內容是否相等)。
四、將對象放入到集合中時,首先判斷要放入對象的hashcode值與集合中的任意一個元素的hashcode值是否相等,
   若是不相等直接將該對象放入集合中。若是hashcode值相等,而後再經過equals方法判斷要放入對象與集合中的任意一個對象是否相等,
   若是equals判斷不相等,直接將該元素放入到集合中,不然不放入。

7. ArrayList、LinkedList、Vector的區別。
ArrayList: 內部採用數組存儲元素,支持高效隨機訪問,支持動態調整大小
    增刪慢,查詢快。
LinkedList: 內部採用鏈表來存儲元素,支持快速插入/刪除元素,但不支持高效地隨機訪問.
    增刪快,查詢慢。
Vector: 能夠看做線程安全版的ArrayList

8. String、StringBuffer與StringBuilder的區別。
這裏插入知識點:String的intern
直接使用雙引號聲明出來的String對象會直接存儲在常量池中。
若是不是用雙引號聲明的String對象,能夠使用String提供的intern方法。intern 方法會從字符串常量池中查詢當前字符串是否存在,若不存在就會將當前字符串放入常量池中
1. String類型是Java內的對象,是個不可變的對象,當每次對String進行改變時都須要生成一個新的String對象,而後將指針指向一個新的對象,若是在一個循環裏面,不斷的改變一個對象,就要不斷的生成新的對象,並且對象多了,Java的垃圾自動回收機制會開始工做,因此效率很低,建議在不斷更改String對象的地方不要使用String類型
2. StringBuffer 是個可變的對象,就是每次操做都是對對象自己進行操做,而不用生成新的對象,這樣效率確定就會有有很大的提升,在大部分狀況下StringBuffer的效率要比String類型要高
3. StringBuilder 與StringBuffer同樣是個可變的字符序列,提供與StringBuffer兼容的API,可是不能保證同步,用在字符串緩衝區被當個線程使用的狀況,在單機非多線程的狀況下使用StringBuilder會有比較好的效率,由於StringBuilder沒有處理同步(Synchronized)問題。StringBuffer則會處理同步問題,若是StringBuilder會在多線程下被操做,則要改用StringBuffer,讓對象自行管理同步問題。

9. Map、Set、List、Queue、Stack的特色與用法。
10. HashMap和HashTable的區別。
11. HashMap和ConcurrentHashMap的區別,HashMap的底層源碼。
12. TreeMap、HashMap、LindedHashMap的區別。
13. Collection包結構,與Collections的區別。
14. try catch finally,try裏有return,finally還執行麼?
15. Excption與Error包結構。OOM你遇到過哪些狀況,SOF你遇到過哪些狀況。
16. Java面向對象的三個特徵與含義。
17. Override和Overload的含義去區別。
18. Interface與abstract類的區別。
19. Static class 與non static class的區別。
20. java多態的實現原理。
21. 實現多線程的兩種方法:Thread與Runable。
22. 線程同步的方法:sychronized、lock、reentrantLock等。
23. 鎖的等級:方法鎖、對象鎖、類鎖。
24. 寫出生產者消費者模式。
25. ThreadLocal的設計理念與做用。
26. ThreadPool用法與優點。
27. Concurrent包裏的其餘東西:ArrayBlockingQueue、CountDownLatch等等。
28. wait()和sleep()的區別。
29. foreach與正常for循環效率對比。
30. Java IO與NIO。
31. 反射的做用於原理。
32. 泛型經常使用特色,List<String>可否轉爲List<Object>。 33. 解析XML的幾種方式的原理與特色:DOM、SAX、PULL。 34. Java與C++對比。 35. Java1.7與1.8新特性。 36. 設計模式:單例、工廠、適配器、責任鏈、觀察者等等。 37. JNI的使用。 JVM 1. 內存模型以及分區,須要詳細到每一個區放什麼。 2. 堆裏面的分區:Eden,survival from to,老年代,各自的特色。 3. 對象建立方法,對象的內存分配,對象的訪問定位。 4. GC的兩種斷定方法:引用計數與引用鏈。 5. GC的三種收集方法:標記清除、標記整理、複製算法的原理與特色,分別用在什麼地方,若是讓你優化收集方法,有什麼思路? 6. GC收集器有哪些?CMS收集器與G1收集器的特色。 7. Minor GC與Full GC分別在何時發生? 8. 幾種經常使用的內存調試工具:jmap、jstack、jconsole。 9. 類加載的五個過程:加載、驗證、準備、解析、初始化。 10. 雙親委派模型:Bootstrap ClassLoader、Extension ClassLoader、ApplicationClassLoader。 11. 分派:靜態分派與動態分派。 操做系統 1. 進程和線程的區別。 2. 死鎖的必要條件,怎麼處理死鎖。 3. Window內存管理方式:段存儲,頁存儲,段頁存儲。 4. 進程的幾種狀態。 5. IPC幾種通訊方式。 6. 什麼是虛擬內存。 7. 虛擬地址、邏輯地址、線性地址、物理地址的區別 TCP/IP 1. OSI與TCP/IP各層的結構與功能,都有哪些協議。 2. TCP與UDP的區別。 3. TCP報文結構。 4. TCP的三次握手與四次揮手過程,各個狀態名稱與含義,TIMEWAIT的做用。 5. TCP擁塞控制。 6. TCP滑動窗口與回退N針協議。 7. Http的報文結構。 8. Http的狀態碼含義。 9. Http request的幾種類型。 10. Http1.1和Http1.0的區別 11. Http怎麼處理長鏈接。 12. Cookie與Session的做用於原理。 13. 電腦上訪問一個網頁,整個過程是怎麼樣的:DNS、HTTP、TCP、OSPF、IP、ARP。 14. Ping的整個過程。ICMP報文是什麼。 15. C/S模式下使用socket通訊,幾個關鍵函數。 16. IP地址分類。 17. 路由器與交換機區別。 數據結構與算法 1. 鏈表與數組。 2. 隊列和棧,出棧與入棧。 3. 鏈表的刪除、插入、反向。 4. 字符串操做。 5. Hash表的hash函數,衝突解決方法有哪些。 6. 各類排序:冒泡、選擇、插入、希爾、歸併、快排、堆排、桶排、基數的原理、平均時間複雜度、最壞時間複雜度、空間複雜度、是否穩定。 7. 快排的partition函數與歸併的Merge函數。 8. 對冒泡與快排的改進。 9. 二分查找,與變種二分查找。 10. 二叉樹、B+樹、AVL樹、紅黑樹、哈夫曼樹。 11. 二叉樹的前中後續遍歷:遞歸與非遞歸寫法,層序遍歷算法。 12. 圖的BFS與DFS算法,最小生成樹prim算法與最短路徑Dijkstra算法。 13. KMP算法。 14. 排列組合問題。 15. 動態規劃、貪心算法、分治算法。(通常不會問到) 16. 大數據處理:相似10億條數據找出最大的1000個數.........等等
複製代碼

 

複製代碼
基礎篇

JAVA基礎

一、  JAVA基礎

1)      抽象類和接口的區別?

補充問題:JAVA8中爲何要加入默認方法?

2)      靜態內部類(static class)的做用?

3)      序列化和反序列化

4)      動態代理和靜態代理的區別?

贈送問題:代理模式,什麼是代理模式?如何實現?代理模式結構圖是怎樣的?代理模式應用在什麼場景?

5)      nio熟悉嗎,nio和io的區別?

6)      java8有哪些新特性?

二、  JAVA API

1)      transient關鍵字的做用?

2)      volatile關鍵字的做用?

3)      abstract和final是否可同時使用?

4)      ArrayList、LinkedList、vector的區別?

5)      HashMap、LinkedHashMap,concurrentHashMap的區別,concurrentHashMap爲何特別好用,你看過源碼嗎?

6)      collection的繼承結構,你是否看過源碼?

三、  JVM調優(性能)

1)      有哪些調優工具

2)      如何快速定位有問題代碼

3)      內存溢出如何處理,如何調優

4)      垃圾回收機制,有哪些垃圾回收算法,如何配置垃圾回收策略

5)      新生代和老年代

四、  Tomcat

tomcat能夠穩定支持的最大併發用戶數

Tomcat集羣如何架設:Tomcat+Apache

集羣時特別關注兩個問題:

 1:如何實現多應用服務器間的session共享:(一臺服務器崩潰,另一臺服務器能夠繼續支持)

 2:如何分發請求到各個應用服務器實現壓力分解:(這裏的解決方案是用apache作 web服務器)

 

算法問題

一、  生產者和消費者問題?

二、  查找算法有幾種,寫出實現代碼?

三、  排序算法有幾種,寫出實現代碼?

四、  遍歷二叉樹,分別按照前序、中序、後續?

五、  紅黑樹

程序題

一、  寫出一個字符串,打印出字符串中字符的全部排序

二、  無序的有重複數據的list變成有序的無重複數據的list

 

框架篇

一、  Spring核心:

 分別說說aop和IOC

事務配置的幾種方式?

spring有幾種注入方式?

spring依賴注入的四種裝配方式?

spring的幾個重要註解@Component(不推薦使用)、@Repository、@Service、@Controller

二、  SpringMVC和Struts2:二者的區別

三、  Mybatis和Hibernate:二者的區別

           mybatis如何實現多表關聯查詢

           mybatis的resultMap

           mybatis的#和$

四、  是否能夠用maven搭建項目,maven如何構建web項目?

五、  git的使用

六、  當日志很是大時,如何查找須要的日誌?

七、  SSH的侷限有哪些

 數據庫篇

數據庫基礎

一、  MySQL和oracle的區別

二、  Oracle移植到mysql須要處理哪些

三、  存儲過程

四、  mysql存儲引擎innodb和myisam的區別

 

數據庫優化

一、  sql優化

二、  索引

關於索引:聯合索引A和B,當按照A、A和B、B查詢時索引使用狀況?

三、  數據庫優化,使用過哪些優化工具:經常使用的SQLYOG、基準測試,expain、status等

具體問題:

           如何找到並定位慢SQL?

           如何肯定表和查詢是不是最優的?

           枚舉類型如何使用,枚舉類型的誤用帶來的損失?

有沒有什麼工具能夠監控數據庫,快速查看有問題的sql?若是存在大批量有問題的sql,如何排查?

如何診斷響應差的(太多線程),殭屍進程(無響應或長時間運行),或者診斷鏈接問題?

若是在某段時間內用戶反映服務器變慢,如何知道服務器性能差?

           假設已經檢查了全部常規信息——內存、磁盤等,而全部這些信息都在正常範圍內,沒有出現錯誤和異常,這時,你怎麼知道系統是否運行變慢?

 

數據庫進階

一、  當數據庫存儲數據出現瓶頸,如何處理?——數據庫水平拆分、垂直拆分

二、  說說水平拆分和垂直拆分,何時水平拆分,何時垂直拆分,分別解決了哪些問題,分別存在哪些不能解決的問題,如何結合使用?

三、  當水平拆分時,到不一樣的表和庫中或不一樣的分佈式服務器上時:不一樣的表能夠聯合查詢(union)、不一樣的庫能夠加上庫名進行聯合查詢;若是須要查詢的數據分佈在不一樣的服務器之間,如何查詢?如何在存儲數據時就將須要同時查詢的數據放在同一服務器上(存儲時取模或者按照時間分佈數據,查詢的時候取模或者按照時間查詢)

四、  mysql讀寫分離

五、  數據庫集羣

 

升級篇

分佈式

一、  有哪些分佈式框架,對比其性能優劣?

同步調用:RSET(JAX-RS、Spring Boot)、RPC(Thrift、Dubbo、HSF)

異步調用:Kafka、Notify、MetaQ

同步和異步的區別,分別用於什麼場景?

二、  dubbo + zookeeper

三、  nosql(redis、memcache、mongodb)

 

大併發的處理

一、  負載均衡

二、  分佈式

三、  緩存

四、  數據庫分庫分表

五、  數據庫集羣

六、  圖片服務器分離

七、  首頁靜態化

 

大數據問題:

假如天天產生5億行日誌文件,如何搜索到指定內容?

有一個100T大小的文件存放在磁盤中,不借助任何外部存儲設備,如何統計指定字符串的個數?

同上,有一個文件,存放天天訪問的URL,天天有100萬條,如何統計URL的個數?

測試1000萬條數據的查詢

 

多線程

一、  有哪些多線程的應用場景

二、  你本身有寫過多線程嗎,在哪些場景

三、  線程池,java提供的線程池有哪幾種?

四、  隊列

五、  servlet是線程安全的嗎,如何改進?

六、  實現同步的幾種方式?

 

安全

關於安全方面作了哪些工做?

手機、支付如何保證信息安全?

sql注入問題

如何保證訪問URL安全:如何不暴露真實的URL地址;如何防止篡改URL地址;如何防止在URL中SQL注入?

 

設計模式

一、  你熟悉哪些設計模式

二、  框架中用到哪些設計模式

           JAVA IO:裝飾器模式(Decorator)、適配器模式(Adapt)

           Spring :訪問者模式(Visitor)、代理模式(Proxy)、策略模式(Strategy)

           SpringMVC:模版模式(TempleteMethod)

           Mybatis: 簡單工廠模式、工廠方法模式(FactoryMethod)、抽象工廠模式(Abstract Factory)

           Tomcat:門面模式、觀察者模式(Observer)、命令模式(Command)、責任鏈模式(chainof responsible)

           Velocity :合成模式
三、  裝飾模式和適配器模式的區別
四、  寫一個單例模式
 

linux
一、會使用哪些命令
查看端口是否被佔用
如何查看指定的日誌


網絡
一、  通訊協議是否有了解,TCP/UDP等、HTTP
二、  http反向代理


業務篇
一、  訂單:大併發問題

二、  訂單或產品數據量變大以後如何優化

三、  交易付款如何操做

四、  與物流接口

五、  畫出你負責的項目的架構圖
複製代碼


大概總結就這麼多了, 文章內容有點多, 你們能夠慢慢去看, 不少答案的話須要本身百度了, 學習是一個積累的過程, 這些東西只是一些濃縮的映射, 若是哪裏有不太清楚就說明你尚未掌握透徹了.
但願對真正找工做的朋友有些幫助, 加油吧.

相關文章
相關標籤/搜索