阿里巴巴面試題 知識越梳理越順暢

面試基礎javascript

 1.自我介紹。(第一印象超級超級重要)html

1. 介紹我的信息,說明本次應聘崗位。 2. 項目經驗,實習經驗。 3. 我的特色,愛好。 4. 對貴公司的價值觀承認。 5. 謝謝。

2. 面試聖經java

人品第一, 技術第二! 細節處體現人品,面試態度必定要和藹。把不懂的知識點往你懂的知識點處引導。始終有答案,不要被問住。

3. 你在項目中遇到的一個困難,你是怎麼解決的?(解決問題的邏輯過程 思路 總結性的結論)linux

  技術方面的,仍是團隊配合方面的。最好結合本身的工做經驗,先把困難和問題描述清楚,而後介紹,你如何去查找問題的緣由,任何問題,只要緣由查到了,基本就已經接近了百分之八十了。(本身能搞定的,就本身上網找資料;但若是好比在2個小時以內尚未頭緒,就考慮問公司技術水平比較高的同事之類的,而後還要及時和項目經理溝通)。這個問題若是回答的好,能夠把項目中的知識點導向你擅長的知識點處。c++

4. 你是如何與項目團隊之間進行溝通和合做的?程序員

Java基礎篇(50問)web

1. 你以爲Java語言怎麼樣?面試

  java是面向對象的語言;跨平臺可移植;解釋性語言;封裝、繼承、多態;Java中無指針,對象的引用實現鏈表;GC自動垃圾回收,不用擔憂內存泄露;單繼承,實現多接口;java中有異常處理(C++沒有)。算法

2. 說說你常使用的集合類,而後針對一個往死裏問。spring

  接口List和Set繼承自接口Collection,Map接口則不是。實現List的類有ArrayList、LinkedList、Vector;實現Set的類有HashSet、TreeSet;實現Map的類有HashMap、LinkedHashMap。

Hashtable和HashMap的區別:
1.Hashtable是Dictionary的子類,HashMap是Map接口的一個實現類;
2.Hashtable中的方法是同步的,而HashMap中的方法是非同步的。在多線程應用程序中能夠安全地可使用Hashtable;而對於HashMap,則須要額外的同步機制。但HashMap的同步問題可經過Collections的一個靜態方法獲得解決:Map Collections.synchronizedMap(Map m)。這個方法返回一個同步的Map,這個Map封裝了底層的HashMap的全部方法,使得底層的HashMap即便是在多線程的環境中也是安全的。
3.在HashMap中,容許key=null&&value=null,可是HashTable不容許。
// HashMap和ConcurrentHashMap的區別。
1. HashMap線程不安全。ConcurrentHashMap線程安全。 2. ConcurrentHashMap實現線程安全不是經過synchronized來實現的。而是採用了一個分段鎖的概念。 3. ConcurrentHashMap的工做機制,經過把整個Map分爲N個Segment, 當put和get的時候,經過使用key.hashCode()方法來算出放到哪一個setment中。
// HashMap和HashSet的區 map存鍵值對; Collections存對象。HashSet是用HashMap來實現的。
Map集合,就是有一對屬性值的集合,屬性包含key,和value。關鍵字key是惟一不重複的。Map是一個有序的集合,因此查詢起來速度很快。而HashSet就像是把HashMap中value去掉,說白了就是隻有一個key的HashMap集合。
Set是數學中定義的集合,因此元素無序, 且不能重複添加。java程序中Set集合用的很少,Map集合中的HashMap集合,List集合用的卻是很多。

1. HashSet存儲的元素不能重複。HashSet中有equals()和hasCode()方法,確保存入集合的元素不重複。add方法存入元素的時候,首先判斷要放入對象的hashcode值與集合中的任意一個元素的hashcode值是否相等,若是不相等直接將該對象放入集合中。若是hashcode值相等,而後再經過equals方法判斷要放入對象與集合中的任意一個對象是否相等,若是equals判斷不相等,直接將該元素放入到集合中,不然不放入。
2. HashSet中add元素的源碼以下:
public boolean add(E e) { return map.put(e, PRESENT)==null; } public V put(K key, V value) { if (key == null) return putForNullKey(value); int hash = hash(key.hashCode()); int i = indexFor(hash, table.length); for (Entry<K,V> e = table[i]; e != null; e = e.next) { Object k; if (e.hash == hash && ((k = e.key) == key || key.equals(k))) { V oldValue = e.value; e.value = value; e.recordAccess(this); return oldValue; } } modCount++; addEntry(hash, key, value, i); return null; }
3. HashMap保存了對象存入時候的順序,可是HashSet再輸出的時候,順序是跟存入時候的順序不同的。由於其內部是使用hashCode()方法來實現的。map用put()方法; set用add()方法。
// HashSet是如何遍歷的?遍歷hashSet有兩種方案:
1. clone出一個新的hashSet, 再用iterator迭代。(源碼中採用這種 推薦)
2. toArray建立一個新數組, 再用for each循環遍歷。(不推薦 效率不高)

3. length()和size()

  size用於集合類,length用於字符串和數組,字符串是函數,數組是屬性。

4. Java集合類中的排序:

// ArrayList中有sort() 方法, 對 Java Arrays.sort()源代碼解析:
1. sort()方法的源碼中對基本數據類型使用快速排序; 對引用數據類型使用歸併排序。理由:對象排序,穩定性更重要,對象移動開銷大。具體的快速排序方法是有必定優化的,根據數組大小的不一樣,有不一樣的分割位置。

//ArrayList 默認初始容量是10,擴容1.5倍。LinkedList不須要,那麼Vector是擴容2倍。Vector線程安全。
//HashTable怎麼
實現線程安全的,調用了Hashtable.Synchronized方法後才變成線程安全,內部使用一個靜態字段實現鎖定。

5. equals( )方法和 = = 比較。 equals( )方法和hasCode( )方法比較。

// 首先equals 和 == 比較。
1. 一個是運算符,一個是方法 2. 比較無非就是在比較基本數據類型和引用數據類型。當比較基本數據類型的時候,equals和==均可以比較兩個值是否相等,相等爲true,不然爲false。 當比較的是引用數據類型的時候,==和equals都是比較對象在內存中的地址是否相等,相等爲true,不然爲false。 3.特別注意的就是String了。object中的equals方法是==,string重寫了==方法,因此,在String在比較的是對象的時候,equals同,==不一樣。比較字符串的時候是相同的。 public class Test{ public static void main(String args[]){ String s1 = "abc"; String s2 = "abc"; System.out.println(s1==s2?Boolean.TRUE:Boolean.FALSE); System.out.println(s1.equals(s2)?Boolean.TRUE:Boolean.FALSE); } }
// 其次, equals()和hasCode()方法比較

1. 先掌握兩個知識點:HashMap中put元素的實現; HashSet中add元素時候, 如何判斷元素是否相同。
2. Object中默認的equals是比較內存地址的; 通常對象重寫equals方法是爲了比較內容。Object類的對象的hashCode是每new一個都不同。 可是若是你new兩個相同的String,那麼他們的hashCode是同樣的。hashcode大部分狀況下映射到內存地址。
 

6. Java抽象類和接口的區別。

  抽象類能夠有構造方法,構造方法不能夠繼承。可是能夠供子類使用super來調用。

  接口中的方法和變量是共有的,由於要供別人使用。抽象類中的方法和變量則是能夠私有的。

  能夠繼承一個類,可是能夠實現多個接口。

  接口定義方法,不能實現。抽象類能夠實現部分方法。抽象類動物。接口是抽出公有的行爲。動做。

  概念不同:實現接口的必定要實現接口裏定義的全部方法,而實現抽象類能夠有選擇地重寫須要用到的方法,通常的應用裏,最頂級的是接口,而後是抽象類實現接口,最後纔到具體類實現public class ArrayList<E> extends AbstractList<E> implements List<E> 

7. Java多態的實現機制。

重載和重寫。
子類重寫父類方法。
參數不一樣,重載。

8. Java類加載的原理。

                                                  

每一個java開發人員對java.lang.ClassNotFoundExcetpion這個異常確定都不陌生,這背後就涉及到了java技術體系中的類加載。Java的類加載機制是java技術體系中比較核心的部分,雖然和大部分開發人員直接打交道很少,可是對其背後的機理有必定理解有助於排查程序中出現的類加載失敗等技術問題,對理解java虛擬機的鏈接模型和java語言的動態性都有很大幫助。(跟異常結合來問) 最佳答案

9. Object類有幾個方法?

1. clone( )方法, 建立並返回對象的一個副本。
2. getClass()方法,返回運行時類。
3. hashCode()方法,返回對象的哈希碼。
4. toString()方法,返回對象的字符串表示。
5. wait()方法,使當前線程等待,知道被喚醒

// 咱們知道萬事萬物都是聯繫的,java對象世界也是如此; 因此要有一個超類Object,對象之間要發生關係,要併發、要同步,必需要使用wait()方法,學了JavaScript的繼承機制,你就知道了爲何要有一個超類。

10. try-catch-finally中,若是在try或catch中有return過,是否還執行 。

// 執行順序總結:一句話描述「finally 永遠執行」

1. 在try中沒有異常的狀況下try、catch、finally的執行順序 try --- finally
2. 若是try中有異常,執行順序是try --- catch --- finally
3. 若是try中沒有異常而且try中有return這時候正常執行順序是try ---- finally --- return
4. 若是try中有異常而且try中有return這時候正常執行順序是try----catch---finally--- return

try-catch-finally裏都沒有return ,finally 以後有個return ,若是try中有異常,finally執行完後,還能執行return嗎?那是不可能執行的了,try中有異常之後,根據java的異常機制先執行catch後執行finally,此時錯誤異常已經拋出,程序因異常而終止,因此你的return是不會執行的

//catch中同時有父異常和子異常,那麼子異常優先來捕獲異常。

11. JVM佈局,JVM內部內存的劃分。

首先知道,內存中被劃分紅這麼幾塊兒:堆、棧、程序計數器、本地方法棧、方法區。 

1.方法區是線程共享的,跟堆同樣; 本地方法棧,相似於棧,是用於執行本地方法的。

12. Java中序列化

第一點,要闡述的是當JVM處於運行時,java對象纔可能存在。即Java對象的生命週期不會比JVM的生命週期更長。但在現實應用中,就可能要求在JVM中止運行以後可以保存(持久化)指定的對象,並在未來從新讀取被保存的對象。Java對象序列化就可以幫助咱們實現該功能。使用Java對象序列化,在保存對象時,會把其狀態保存爲一組字節,在將來,再將這些字節組裝成對象。必須注意地是,對象序列化保存的是對象的"狀態",即它的成員變量。由此可知,對象序列化不會關注類中的靜態變量。除了在持久化對象時會用到對象序列化以外,當使用RMI(遠程方法調用),或在網絡中傳遞對象時,都會用到對象序列化。

第二點,在Java中,只要一個類實現了java.io.Serializable接口,那麼它就能夠被序列化。

13. Java中反射機制

  一句話說Java反射機制就是,運行狀態時動態獲取信息。不少開源框架實現都是使用了java的反射機制。爲何要使用java反射呢?有一句經典的話,叫作:父類引用指向子類對象。能發揮這種能力,須要配合在動態運行時肯定。體現了Java的靈活性,體現了多態,下降了類之間的耦合性。

1. 對於任意一個類,都可以知道這個類的全部屬性和方法;
2. 對於任意一個對象,都可以調用它的任意一個方法;

Java反射機制能幹什麼?若是不使用反射機制。一個對象,增刪改查,分別要建立四個Dao類來,有了Dao類,只須要寫一個Dao類,四個方法,其他的交給java反射機制來解決。

14. Java中多線程

1. 繼承Thread類,或者實現Runnable接口。
2. 重寫Runnable中的run方法,啓動線程用start方法。
3. java中有兩種線程,用戶線程和守護線程。 守護線程:優先級最低,setDaemon方法設置爲守護線程。GC垃圾回收就是一個守護線程。
4. 當JVM的線程都是守護線程的時候,JVM就能夠退出了。守護線程是用來服務用戶線程的。
5. Java線程池,若是併發的線程數量不少,而且每一個線程都是執行一個時間很短的任務就結束了,這樣頻繁建立線程就會大大下降系統的效率,由於頻繁建立線程和銷燬線程須要時間。那麼有沒有一種辦法使得線程能夠複用,就是執行完一個任務,並不被銷燬,而是能夠繼續執行其餘的任務。在Java中能夠經過線程池來達到這樣的效果。

6. Java中線程安全問題, 線程安全問題主要出如今訪問臨界資源的時候,就是訪問同一個對象的時候,可能會出現沒法挽回的損失,特別是在關於資金安全方面的時候,固然還有數據庫事務方面的問題。他們很相似,都是要保證數據的原子性。對與共同使用的對象進行加鎖,意思是我使用的時候,那麼你就必須等待,等我用完以後你再用,反之依然。加鎖使用關鍵字synchronized。將當前線程鎖定,讓別的線程等待。
7. HashMap爲什麼線程不安全,同時又讀又寫的時候,不能保證結果的惟一。就是線程不安全。
8. 線程有幾種狀態:就緒、運行、阻塞、掛起。

21. Java中哈希實現原理。

哈希的出現時由於傳統數據結構如線性表(數組,鏈表等),樹中,關鍵字與其它的存放位置不存在對應的關係。所以在查找關鍵字的時候須要逐個比對,雖然出現了二分查找等各類提升效率的的查找算法。可是這些並不足夠,但願在查詢關鍵字的時候不通過任何比較,一次存取便能獲得所查記錄。所以,咱們必須在關鍵字和其對應的存儲位置間創建對應的關係f。這種對應的關係f被稱爲哈希函數,按此思想創建的表爲哈希表。關鍵在於哈希函數如何構造。

http://www.linuxidc.com/Linux/2014-04/100598.htm

HashMap裏面實現一個靜態內部類Entry, 

靜態定義,其實主要做用就是把初始化交給JVM,並且不須要人工初始化。 Entry就是用的LinkedList<E>裏面的E, javaAPI的設計者們把Entry設計成靜態內部類應該是爲了方便使用吧。

 22. 說說Java靜態內部類。

須要瞭解2個概念:內部類和靜態修飾符static
1)首先,用內部類是由於內部類與所在外部類有必定的關係,每每只有該外部類調用此內部類。因此沒有必要專門用一個Java文件存放這個類。
2)靜態都是用來修飾類的內部成員的。好比靜態方法,靜態成員變量,靜態常量。它惟一的做用就是隨着類的加載(而不是隨着對象的產生)而產生,以至能夠用類名+靜態成員名直接得到。
這樣靜態內部類就能夠理解了,由於這個類沒有必要單獨存放一個文件,它通常來講只被所在外部類使用。而且它能夠直接被用 外部類名+內部類名 得到。
如下舉例說明怎麼使用:
Student類有個叫School的內部類(非靜態)
Student stu = new Student();
stu.School sch = new stu.School();
sch就是School的一個對象。

假如School是內部靜態類:
Student.School sch = new Student.School();
首先你要明白靜態內部類和通常內部類的區別。
一、靜態內部類也叫嵌套類,用這個名字給他定義是更加形象的。意思是說內部類和外部類的關係只是層次嵌套關係,因此只是在建立類文件的時候類文件名是以下形式:outer$inner.java,在使用方面徹底和兩個普通類同樣。
二、通常內部類在我看來纔是真正的內部類,他們不只有着嵌套關係,更重要的是內部類能夠得到外部類的引用從而實現回調。並且經過建立內部類還可已讓java實現真正的多繼承!(interface名叫接口,顧名思義,他就是實現接口的,讓一個類繼承多個接口實現多繼承是不合適的)。關於內部類裏面的東西比較多,也是java比較特點之一,不要期望在網上看就能學會,買本書再多多練習才能掌握。
Java語言容許在類中再定義類,這種在其它類內部定義的類就叫內部類。內部類又分爲:常規內部類、局部內部類、匿名內部類和靜態嵌套類四種。
一、靜態內部類定義

靜態內部類,定義在類中,任何方法外,用static定義;靜態內部類只能訪問外部類的靜態成員。
生成(new)一個靜態內部類不須要外部類成員:這是靜態內部類和成員內部類的區別。靜態內部類的對象能夠直接生成:Outer.Inner in=new Outer.Inner();而不須要經過生成外部類對象來生成。這樣實際上使靜態內部類成爲了一個頂級類。能夠定義私有靜態內部類。
二、java實現靜態內部類注意事項 將某個內部類定義爲靜態類,跟將其餘類定義爲靜態類的方法基本相同,引用規則也基本一致。不過其細節方面仍然有很大的不一樣。具體來講,主要有以下幾個地方要引發注意。 1)通常狀況下,若是一個內部類不是被定義成靜態內部類,那麼在定義成員變量或者成員方法的時候,是不可以被定義成靜態成員變量與靜態成員方法的。也就是說,在非靜態內部類中不能夠聲明靜態成員。 2)通常非靜態外部類能夠隨意訪問其外部類的成員變量以及方法(包括聲明爲private的方法),可是若是一個內部類被聲明爲static,則其在訪問包括自身的外部類會有諸多的限制。靜態內部類不能訪問其外部類的非靜態成員變量和方法 3)在一個類中建立非靜態成員內部類的時候,有一個強制性的規定,即內部類的實例必定要綁定在外部類的實例中。而後要在一個外部類中定義一個靜態的內部類,不須要利用關鍵字new來建立內部類的實例。即在建立靜態類內部對象時,不須要其外部類的對象。

23. 說說Java內部類。

內部類的優勢是:內部類能夠訪問外部類的私有成員變量,而不須要new外部類的對象。
內部類又分爲:靜態內部類、匿名內部類、局部內部類、成員內部類。

  靜態內部類的應用場景是:只能夠訪問外部類的靜態成員變量和靜態成員方法。

  成員內部類的應用場景是:它能夠訪問它的外部類的全部成員變量和方法,無論是靜態的仍是非靜態的均可以。

  局部內部類:像局部變量同樣,不能被public, protected, private和static修飾。只能訪問方法中定義的final類型的局部變量。

  匿名內部類:匿名內部類就是沒有名字的局部內部類,不使用關鍵字class, extends, implements, 沒有構造方法。匿名內部類隱式地繼承了一個父類或者實現了一個接口。匿名內部類使用得比較多,一般是做爲一個方法參數。

內部類不是很好理解,但說白了其實也就是一個類中還包含着另一個類。 如同一我的是由大腦、肢體、器官等身體結果組成,而內部類至關於其中的某個器官之一,例如心臟:它也有本身的屬性和行爲(血液、跳動)。

顯然,此處不能單方面用屬性或者方法表示一個心臟,而須要一個類。而心臟又在人體當中,正如同是內部類在外部內當中
從上面的例子不難看出,內部類其實嚴重破壞了良好的代碼結構,但爲何還要使用內部類呢? 由於內部類能夠隨意使用外部類的成員變量(包括私有)而不用生成外部類的對象,這也是內部類的惟一優勢 如同心臟能夠直接訪問身體的血液,而不是經過醫生來抽血

  程序編譯事後會產生兩個.class文件,分別是Out.class和Out$In.class。其中$表明了上面程序中Out.In中的那個。Out.In in = new Out().new In()能夠用來生成內部類的對象,這種方法存在兩個小知識點須要注意:1.開頭的Out是爲了標明須要生成的內部類對象在哪一個外部類當中。2.必須先有外部類的對象才能生成內部類的對象,由於內部類的做用就是爲了訪問外部類中的成員變量。

 24. Java中final和static區別。

  Java中的String類就是一個final類。當用final修飾一個類時,代表這個類不能被繼承。要注意final類中的全部成員方法都會被隱式地指定爲final方法。對於一個final變量,若是是基本數據類型的變量,則其數值一旦在初始化以後便不能更改;若是是引用類型的變量,則在對其初始化以後便不能再讓其指向另外一個對象。被final修飾的引用變量一旦初始化賦值以後就不能再指向其餘的對象,那麼該引用變量指向的對象的內容是可變的。

  在static方法內部不能調用非靜態方法,反過來是能夠的。static目的是,方便在沒有建立對象的狀況下來進行調用(方法/變量)。被static關鍵字修飾的方法或者變量不須要依賴於對象來進行訪問,只要類被加載了,就能夠經過類名去進行訪問。對於靜態方法來講,是沒有this的,由於它不依附於任何對象,既然都沒有對象,就談不上this了。在靜態方法中不能訪問類的非靜態成員變量和非靜態成員方法,由於非靜態成員方法/變量都是必須依賴具體的對象纔可以被調用。在靜態方法中不能訪問非靜態成員方法和非靜態成員變量,可是在非靜態成員方法中是能夠訪問靜態成員方法/變量的。

  附:常常翻java API麼?最新的JDK是哪一個版本?有什麼新特性。

當前JDK 1.8版本。新特性以下:

1.Java 8容許咱們給接口添加一個非抽象的方法實現,只須要使用 default關鍵字便可,這個特徵又叫作擴展方法。

2.Lambda 表達式 和 Functional 接口。Lambda表達式(也稱爲閉包)是整個Java 8發行版中最受期待的在Java語言層面上的改變,Lambda容許把函數做爲一個方法的參數(函數做爲參數傳遞進方法中),或者把代碼當作數據:函數式程序員對這一律念很是熟悉。在JVM平臺上的不少語言(Groovy,Scala,……)從一開始就有Lambda,可是Java程序員不得不使用毫無新意的匿名類來代替lambda。關於Lambda設計的討論佔用了大量的時間與社區的努力。可喜的是,最終找到了一個平衡點,使得可使用一種即簡潔又緊湊的新方式來構造Lambdas。在最簡單的形式中,一個lambda能夠由用逗號分隔的參數列表、–>符號與函數體三部分表示。
例如:
在看實例以前,先看一個函數的使用Arrays.asList()方法的使用:
Arrays首先是一個工具類,它提供了Arrays.sort()方法.

 

 

25 。 Collection 和 Collections的區別。 

Collection是集合類的上級接口,繼承與他的接口主要有Set 和List. 
Collections是針對集合類的一個幫助類,他提供一系列靜態方法實現對各類集合的搜索、排序、線程安全化等操做。 

 26. HashMap和Hashtable的區別。 
    HashMap是Hashtable的輕量級實現(非線程安全的實現),他們都完成了Map接口,主要區別在於HashMap容許空(null)鍵值(key),因爲非線程安全,效率上可能高於Hashtable。 
HashMap容許將null做爲一個entry的key或者value,而Hashtable不容許。 
HashMap把Hashtable的contains方法去掉了,改爲containsvalue和containsKey。由於contains方法容易讓人引發誤解。 
Hashtable繼承自Dictionary類,而HashMap是Java1.2引進的Map interface的一個實現。 
最大的不一樣是,Hashtable的方法是Synchronize的,而HashMap不是,在多個線程訪問Hashtable時,不須要本身爲它的方法實現同步,而HashMap 就必須爲之提供外同步。 
Hashtable和HashMap採用的hash/rehash算法都大概同樣,因此性能不會有很大的差別。 

27. sleep() 和 wait() 有什麼區別? 
    sleep是線程類(Thread)的方法,致使此線程暫停執行指定時間,給執行機會給其餘線程,可是監控狀態依然保持,到時後會自動恢復。調用sleep不會釋放對象鎖。 
wait是Object類的方法,對此對象調用wait方法致使本線程放棄對象鎖,進入等待此對象的等待鎖定池,只有針對此對象發出notify方法(或notifyAll)後本線程才進入對象鎖定池準備得到對象鎖進入運行狀態。 

28. Overload和Override的區別。Overloaded的方法是否能夠改變返回值的類型? 
方法的重寫Overriding和重載Overloading是Java多態性的不一樣表現。重寫Overriding是父類與子類之間多態性的一種表現,重載Overloading是一個類中多態性的一種表現。若是在子類中定義某方法與其父類有相同的名稱和參數,咱們說該方法被重寫 (Overriding)。子類的對象使用這個方法時,將調用子類中的定義,對它而言,父類中的定義如同被"屏蔽"了。若是在一個類中定義了多個同名的方法,它們或有不一樣的參數個數或有不一樣的參數類型,則稱爲方法的重載(Overloading)。Overloaded的方法是能夠改變返回值的類型。 

29. error和exception有什麼區別? 
  error 表示恢復不是不可能但很困難的狀況下的一種嚴重問題。好比說內存溢出。不可能期望程序能處理這樣的狀況。 
      exception 表示一種設計或實現問題。也就是說,它表示若是程序運行正常,從不會發生的狀況。 

30.  同步和異步有何異同,在什麼狀況下分別使用他們?舉例說明。 
若是數據將在線程間共享。例如正在寫的數據之後可能被另外一個線程讀到,或者正在讀的數據可能已經被另外一個線程寫過了,那麼這些數據就是共享數據,必須進行同步存取。 
當應用程序在對象上調用了一個須要花費很長時間來執行的方法,而且不但願讓程序等待方法的返回時,就應該使用異步編程,在不少狀況下采用異步途徑每每更有效率。 

31。 forward是服務器請求資源,服務器直接訪問目標地址的URL,把那個URL的響應內容讀取過來,而後把這些內容再發給瀏覽器,瀏覽器根本不知道服務器發送的內容是從哪兒來的,因此它的地址欄中仍是原來的地址。 
       redirect就是服務端根據邏輯,發送一個狀態碼,告訴瀏覽器從新去請求那個地址,通常來講瀏覽器會用剛纔請求的全部參數從新請求,因此session,request參數均可以獲取。 

23. EJB與JAVA BEAN的區別? 
Java Bean 是可複用的組件,對Java Bean並無嚴格的規範,理論上講,任何一個Java類均可以是一個Bean。但一般狀況下,因爲Java Bean是被容器所建立(如Tomcat)的,因此Java Bean應具備一個無參的構造器,另外,一般Java Bean還要實現Serializable接口用於實現Bean的持久性。Java Bean實際上至關於微軟COM模型中的本地進程內COM組件,它是不能被跨進程訪問的。Enterprise Java Bean 至關於DCOM,即分佈式組件。它是基於Java的遠程方法調用(RMI)技術的,因此EJB能夠被遠程訪問(跨進程、跨計算機)。但EJB必須被佈署在諸如Webspere、WebLogic這樣的容器中,EJB客戶從不直接訪問真正的EJB組件,而是經過其容器訪問。EJB容器是EJB組件的代理, EJB組件由容器所建立和管理。客戶經過容器來訪問真正的EJB組件。 

24. 說出數據鏈接池的工做機制是什麼? 
J2EE 服務器啓動時會創建必定數量的池鏈接,並一直維持很多於此數目的池鏈接。客戶端程序須要鏈接時,池驅動程序會返回一個未使用的池鏈接並將其表記爲忙。若是當前沒有空閒鏈接,池驅動程序就新建必定數量的鏈接,新建鏈接的數量有配置參數決定。當使用的池鏈接調用完成後,池驅動程序將此鏈接表記爲空閒,其餘調用就可使用這個鏈接。

25.當一個線程進入一個對象的一個synchronized方法後,其它線程是否可進入此對象的其它方法? 
不能,一個對象的一個synchronized方法只能由一個線程訪問。 

26. Java中的異常處理機制的簡單原理和應用。 
當JAVA 程序違反了JAVA的語義規則時,JAVA虛擬機就會將發生的錯誤表示爲一個異常。違反語義規則包括2種狀況。一種是JAVA類庫內置的語義檢查。例如數組下標越界,會引起IndexOutOfBoundsException;訪問null的對象時會引起NullPointerException。另外一種狀況就是JAVA容許程序員擴展這種語義檢查,程序員能夠建立本身的異常,並自由選擇在什麼時候用throw關鍵字引起異常。全部的異常都是 java.lang.Thowable的子類。 

27. 垃圾回收的優勢和原理。並考慮2種回收機制。 
Java語言中一個顯著的特色就是引入了垃圾回收機制,使c++程序員最頭疼的內存管理的問題迎刃而解,它使得Java程序員在編寫程序的時候再也不須要考慮內存管理。因爲有個垃圾回收機制, Java中的對象再也不有"做用域"的概念,只有對象的引用纔有"做用域"。垃圾回收能夠有效的防止內存泄露,有效的使用可使用的內存。垃圾回收器一般是做爲一個單獨的低級別的線程運行,不可預知的狀況下對內存堆中已經死亡的或者長時間沒有使用的對象進行清楚和回收,程序員不能實時的調用垃圾回收器對某個對象或全部對象進行垃圾回收。回收機制有分代複製垃圾回收和標記垃圾回收,增量垃圾回收。 

28. 請說出你所知道的線程同步的方法。 
wait():使一個線程處於等待狀態,而且釋放所持有的對象的lock。 
sleep():使一個正在運行的線程處於睡眠狀態,是一個靜態方法,調用此方法要捕捉InterruptedException異常。 
notify():喚醒一個處於等待狀態的線程,注意的是在調用此方法的時候,並不能確切的喚醒某一個等待狀態的線程,而是由JVM肯定喚醒哪一個線程,並且不是按優先級。 
Allnotity():喚醒全部處入等待狀態的線程,注意並非給全部喚醒線程一個對象的鎖,而是讓它們競爭。 

29. 你所知道的集合類都有哪些?主要方法? 
最經常使用的集合類是 List 和 Map。 List 的具體實現包括 ArrayList 和 Vector,它們是可變大小的列表,比較適合構建、存儲和操做任何類型對象的元素列表。 List 適用於按數值索引訪問元素的情形。 
Map 提供了一個更通用的元素存儲方法。 Map 集合類用於存儲元素對(稱做"鍵"和"值"),其中每一個鍵映射到一個值。 

30. 描述一下JVM加載class文件的原理機制? 
JVM中類的裝載是由ClassLoader和它的子類來實現的,Java ClassLoader 是一個重要的Java運行時系統組件。它負責在運行時查找和裝入類文件的類。 

31. JSP的內置對象及方法。 
request表示HttpServletRequest對象。它包含了有關瀏覽器請求的信息,而且提供了幾個用於獲取cookie, header, 和session數據的有用的方法。 
    response表示HttpServletResponse對象,並提供了幾個用於設置送回瀏覽器的響應的方法(如cookies,頭信息等) 
    out對象是javax.jsp.JspWriter的一個實例,並提供了幾個方法使你能用於向瀏覽器回送輸出結果。 
    pageContext表示一個javax.servlet.jsp.PageContext對象。它是用於方便存取各類範圍的名字空間、servlet相關的對象的API,而且包裝了通用的servlet相關功能的方法。 
    session表示一個請求的javax.servlet.http.HttpSession對象。Session能夠存貯用戶的狀態信息 
    applicaton 表示一個javax.servle.ServletContext對象。這有助於查找有關servlet引擎和servlet環境的信息 
    config表示一個javax.servlet.ServletConfig對象。該對象用於存取servlet實例的初始化參數。 
    page表示從該頁面產生的一個servlet實例 

31. 線程的基本概念、線程的基本狀態以及狀態之間的關係 
線程指在程序執行過程當中,可以執行程序代碼的一個執行單位,每一個程序至少都有一個線程,也就是程序自己。 
Java中的線程有四種狀態分別是:運行、就緒、掛起、結束。 

32. servlet的生命週期 
web容器加載servlet,生命週期開始。經過調用servlet的init()方法進行servlet的初始化。經過調用service()方法實現,根據請求的不一樣調用不一樣的do***()方法。結束服務,web容器調用servlet的destroy()方法。 

http://www.aliyun.com/zixun/content/3_12_523694.html

http://wenku.baidu.com/link?url=tpivQbMVCwLtk8r24ggl7hcF-gXQ5-bTKrnYcMnYenvu-b7ylUBodmuZ0H52xVeN1KHNk0ciHygy0sshINcAxqCb4T19laxjUZ_npHZ6SSK

http://blog.csdn.net/sunshinesir/article/details/8221509

Java框架篇

1. Ajax實現機制。

  Ajax是異步通信,所謂的異步是指再不刷新頁面的狀況下與後臺進行的一次通訊。它的技術實現原理經過內置的XmlHttpRequest發送請求,至關於有一個小瀏覽器在你不知情的狀況下發送了一個小請求,從服務器獲取數據,經過javascript處理返回值來更新頁面上的東西。

2. Servlet線程安全麼?週期呢?

Servlet容器默認採用單實例多線程的方式來處理請求,默認是非線程安全的Servlet容器如何同時來處理多個請求,Servlet採用多線程來處理多個請求同時訪問。servlet依賴於一個線程池來服務請求。線程池其實是一系列的工做者線程集合。Servlet使用一個調度線程來管理工做者線程. 當容器收到一個Servlet請求,調度線程從線程池中選出一個工做者線程,將請求傳遞給該工做者線程,而後由該線程來執行Servlet的 service方法。當這個線程正在執行的時候,容器收到另一個請求,調度線程一樣從線程池中選出另外一個工做者線程來服務新的請求,容器並不關心這個請求是否訪問的是同一個Servlet.當容器同時收到對同一個Servlet的多個請求的時候,那麼這個Servlet的service()方法將在多線程中併發執行。 Servlet容器默認採用單實例多線程的方式來處理請求,這樣減小產生Servlet實例的開銷,提高了對請求的響應時間,對於Tomcat能夠在server.xml中經過<Connector>元素設置線程池中線程的數目。 就實現來講: 調度者線程類所擔負的責任如其名字,該類的責任是調度線程,只須要利用本身的屬性完成本身的責任。因此該類是承擔了責任的,而且該類的責任又集中到惟一的單體對象中。而其餘對象又依賴於該特定對象所承擔的責任,咱們就須要獲得該特定對象。那該類就是一個單例模式的實現了。

3. 

 

 

 

 

Hibernate爲何優於JDBC。

Hibernate一級緩存和二級緩存。

Servlet生命週期。

session是怎麼實現的?存儲在哪裏?   http://blog.csdn.net/zhq426/article/details/2992488

說說你認識的設計模式。及常見的應用場景。

http://zhidao.baidu.com/link?url=wTRk2ft-_lOZCHKiGp8_Wu2pi1pqUJC5GFwFVzpy1qmqZsGS5UkyllRaE0G-wlrKTMl4CYJ5rvOwINFqULoA_q

 +雜題

 

6. SpringMVC經常用的註解

// 經常使用註解總結

1.  @Controller , 標註在控制層。@Service 常標註在業務層,用於標誌業務邏輯。@Repository 標註在持久層,即dao。用於標註數據訪問。
2.  @RequestMapping , 同上標註在類定義出,將Controller和特定請求關聯起來。
3.  @PathVariable ,  該註解綁定它傳過來的值到方法的參數上。
4. @Autowired, Java web的實體類屬性中使用註解@Autowired以後, 不須要再寫getter和setter方法,spring會自動注入。

數據結構篇

6.

 

 

設計模式篇

1. 靜態代理模式,及其應用場景。

  最佳博客

2. Spring中用到的設計模式。

  http://www.360doc.com/content/13/0116/13/11261516_260506834.shtml

3.

SQL經常使用命令研究

1. 先來一個基礎複習,SQL語句基礎

 

// 先來幾組約定:
  1. sql語句不區分大小寫,但涉及到表名 字段名的時候要對應起來。
  2. 數據庫名約定爲DBName 表名約定爲tableName 列名約定爲columnName

1. create database DBName;
2. drop database DBName;
3. creat table tableName (id varchar(20) primary key, idCard varchar(18), address varchar(100))
4. drop table tableName
5. Alter table tableName add column columnName varchar(10)

6. select * from tableName where
7. insert into tableName(id,age) values(11,28)
8. delete from table where
9. update tableName set id=12 where
10. select * from tableName where name like '%李%'
11. select * from tableName order by id, age[des]
12. select count as totalCount from tableName //總數

2.數據庫中group by和having區別

having 和where 都是用來篩選用的   having 是篩選組 而where是篩選記錄; 當分組篩選的時候用having, 其餘的狀況用where。

使用having,就必定要與group by連用. 用group by不必定要用having,它只是當須要在組內篩選的時候用的.

 

 

 

 

 

 

項目篇 

1.

相關文章
相關標籤/搜索