一:繼承、抽象類與接口區別、訪問控制(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高級
一:多線程 public class RunThread implements Runnable{} public static void main(String[] args){ RunThread thread = new RunThread(); new Thread(thread).start(); new Thread(thread).start(); }
%四、如何中止一個線程? !五、解釋是一下什麼是線程安全?舉例說明一個線程不安全的例子。解釋Synchronized關鍵字的做用。
!六、當一個線程進入一個對象的一個synchronized方法後,其它線程是否可進入此對象的其它方法? 二:內存結構,GC %二、Java中的內存溢出是如何形成的 第一種OutOfMemoryError: PermGen space
%三、jvm gc如何判斷對象是否須要回收,有哪幾種方式? 2.不可達對象必定會被回收嗎
三:CLASSLOADER
四:NIO 五:其餘 |
第三部分: JavaEE
一:Servlet的掌握,包括新的異步Servlet %二、servlet中,如何定製session的過時時間? session.setMaxInactiveInterval(30*60); !三、Servlet中的session工做原理 (禁用cookie如何使用session)
服務器在執行jsp的時候,首先把jsp翻譯成一個Servlet,因此咱們訪問jsp時,其實不是在訪問jsp,而是在訪問jsp翻譯事後的那個Servlet ?六、JSP的動態include和靜態include
三:http相關(內部重定向,外部重定向),http返回碼 !五、在web開發中,用redirect與forward作跳轉有什麼區別?web應用服務器對用戶請求一般返回一些狀態碼,請描述下分別以4和5開頭的狀態碼 四:spring,ibatis,hibernate相關 五:jboss,tomcat等容器相關 六:web安全,SQL注入,XSS, CSRF等 七:AJAX相關 八:Web Service 九:JMS 十:其餘 |
第四部分: 數據庫相關
一:關係模型理論: 二:事務相關 三:併發控制 四:ORACLE或MYSQL題目 五:其餘 |
第五部分: 設計模式
一:高內聚,低耦合方面的理解 二:設計模式方面 三:其餘 |
第六部分: 其餘清單 只有題目
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反向代理
業務篇
一、 訂單:大併發問題
二、 訂單或產品數據量變大以後如何優化
三、 交易付款如何操做
四、 與物流接口
五、 畫出你負責的項目的架構圖
大概總結就這麼多了, 文章內容有點多, 你們能夠慢慢去看, 不少答案的話須要本身百度了, 學習是一個積累的過程, 這些東西只是一些濃縮的映射, 若是哪裏有不太清楚就說明你尚未掌握透徹了.
但願對真正找工做的朋友有些幫助, 加油吧.