1overload:編譯時多態(參數修改) 類中前端
override重寫: 運行多態(參數不修改) 父子.構造器可重載overloadjava
2checked uncheckednode
throw交給上一級處理(棧的上一個方法),程序中止git
throws 聲明可能程序員
3java字節碼的虛擬機進程github
4collection :使用 ==:1非new ,integer&integer =>128比較引用地址,當小於128時比較值;2當integer時new時,integer&integer永遠(不管是否小於128)比較是地址;3integer&int比價自動拆箱比較值。web
HashMap/Hashtable、ArrayList/LinkedList、Vector,算法
JUC:concurrentHashMap、Executor框架、CopyOnWrite容器sql
5****Swing編程和Android開發中經常使用此方式來實現事件監聽和回調。(匿名內部類)數據庫
一個內部類對象能夠訪問建立它的外部類對象的成員,包括私有成員。
6GC
一是Java的內存分配原理與C/C++不一樣,C/C++每次採用malloc或new申請內存時都要進行brk和mmap等系統調用,而系統調用發生在內核空間,每次都要中斷進行切換,這須要必定的開銷,而Java虛擬機是先一次性分配一塊較大的空間,而後每次new時都在該空間上進行分配和釋放,減小了系統調用的次數,節省了必定的開銷,這有點相似於內存池的概念;
二是有了這塊空間事後,如何進行分配和回收就跟GC機制有關。(GC結構+具體操做)
GC原理、畫圖表示年輕代(Eden區和Survival區)、年老代、比例分配及爲啥要這樣分代回收(我認爲巧妙就在於這裏),GC是具體如何進行內存分配和垃圾回收。
7項目的基本架構、所使用的算法原理、如何改進的、數據如何處理
UserCF的原理及如何使用用戶的社交數據和六維理論改進傳統的UserCF
用戶的類似性你怎麼算的:餘弦類似性的計算方式
數據的存儲格式
你剛說到struts有漏洞,那麼Hibernate是安全的嗎?有沒有可能發生xss攻擊和sql注入攻擊?
8username != null &&!username.equals("") NullPointerException異常
9四捨五入的原理是在參數上加0.5而後進行下取整。
10在Java 5之前,switch(expr)中,expr只能是byte、short、char、int。從Java 5開始,Java中引入了枚舉類型,expr也能夠是enum類型,從Java 7開始,expr還能夠是字符串(String),可是長整型(long)在目前全部的版本中都是不能夠的。
11數組沒有length()方法,有length 的屬性。String 有length()方法。JavaScript中,得到字符串的長度是經過length屬性獲得
12若是兩個對象相同(equals方法返回true),那麼它們的hashCode值必定要相同;(2)若是兩個對象的hashCode相同,它們並不必定相同。不這樣,則Set可存放相同元素,增長新元素性能降低
13equals重寫問題1. 使用==操做符檢查"參數是否爲這個對象的引用";2. 使用instanceof操做符檢查"參數是否爲正確的類型";3. 對於類中的關鍵屬性,檢查參數傳入對象的屬性是否與之相匹配;4.equals 四性 必重寫hashCode
14對String類型最好的重用方式是關聯關係(Has-A)和依賴關係(Use-A)而不是繼承關係(Is-A)。
A HAS-A relationship is dynamic (run time ) binding while inheritance is a static (compile time ) binding.
15傳遞,至關於=。 swap c中ref問題
16數組、列表、集合、哈希表、隊列
176. 會用框架,理解注入
7. 正確使用語言提供的模式,例如單例、觀察者等
8. 正確使用反射,正確使用切面,正確使用線程,8.0之後還要會正確使用 lambda
9. 理解JVM,會作優化,會根據須要改框架,或者本身寫框架
10. 本身定製JVM
18
19 2<<3 hashCode 31
20stringBuilder單線程環境下使用的,由於它的全部方面都沒有被synchronized修飾,所以它的效率也比StringBuffer要高。
21javap -c StringEqualTest.class命令得到class文件對應的JVM字節碼
22JVM中類的裝載是由類加載器(ClassLoader)和它的子類來實現的
Java中的類加載器負責在運行時查找和裝入類文件中的類。
源程序並非一個可執行程序,而是一個或多個類文件,使用某個類時,JVM會確保這個類已經被加載、鏈接(驗證、準備和解析)和初始化。
load:.class文件中的數據讀入到內存中即建立一個字節數組讀入,而後產生與所加載類對應的Class對象並將此實例返回
****link:驗證、準備(爲靜態變量分配內存並設置默認的初始值)和解析(將符號引用替換爲直接引用)三個步驟
****initialize:1)若是類存在直接的父類而且這個類尚未被初始化,那麼就先初始化父類;2)若是類中存在初始化語句,就依次執行這些初始化語句。
根加載器(BootStrap 加載核心類庫rt.jar resources.jar sunrsasign.jar jce.jar charsets.jar 等等,不是普通java類,在jvm中添加-Xbootclasspath參數,指定Bootstrcp ClassLoader加載類的路徑,並追加咱們自已的jar(ClassTestLoader.jar)或者將class文件放到JAVA_HOME/jre/classes/目錄下)、擴展加載器(Extension)、系統加載器(System)和用戶自定義類加載器(java.lang.ClassLoader的子類)
父親委託機制(PDM)保證了Java平臺的安全性也避免重複: JVM自帶的Bootstrap是根加載器,其餘的加載器都有且僅有一個父類加載器。類的加載首先請求父類加載器加載,父類加載器路徑中無時才由其子類加載器自行加載。JVM不會向Java程序提供對Bootstrap的引用。String已經在啓動時就被引導類加載器(Bootstrcp ClassLoader)加載,因此用戶自定義的ClassLoader永遠也沒法加載一個本身寫的String,除非你改變JDK中ClassLoader搜索類的默認算法。
如何判相同class?類名是否相同,並且要判斷是否由同一個類加載器實例加載的
定義classloader:一、繼承java.lang.ClassLoader二、重寫父類的findClass方法。loadClass方法中幫咱們實現了ClassLoader搜索類的算法,當在loadClass方法中搜索不到類時,loadClass方法就會調用findClass方法來搜索類,因此咱們只需重寫該方法便可。如沒有特殊的要求,通常不建議重寫loadClass搜索類的算法。目前經常使用web服務器中都定義了本身的類加載器,用於加載web應用指定目錄下的類庫(jar或class),如:Weblogic、Jboss、tomcat等
23Java中使用的編碼是Unicode(不選擇任何特定的編碼,直接使用字符在字符集中的編號,這是統一的惟一方法),一個char類型佔2個字節(16比特),因此放一箇中文是沒問題的。
使用Unicode意味着字符在JVM內部和外部有不一樣的表現形式,在JVM內部都是Unicode,當這個字符被從JVM內部轉移到外部時(例如存入文件系統中),須要進行編碼轉換。因此Java中有字節流和字符流,以及在字符流和字節流之間進行轉換的轉換流,如InputStreamReader和OutputStreamReader,這兩個類是字節流和字符流之間的適配器類,承擔了編碼轉換的任務;對於C程序員來講,要完成這樣****的編碼轉換恐怕要依賴於union(聯合體/共用體)共享內存的特徵來實現了。
24抽象類和接口
不可以實例化,但能夠定義抽象類和接口類型的引用。
一個類若是繼承了某個抽象類或者實現了某個接口都須要對其中的抽象方法所有進行實現,不然該類仍然須要被聲明爲抽象類。
接口比抽象類更加抽象,由於抽象類中能夠定義構造器,能夠有抽象方法和具體方法,而接口中不能定義構造器並且其中的方法所有都是抽象方法。
抽象類中的成員能夠是private、默認、protected、public的,而接口中的成員全都是public的。
抽象類中能夠定義成員變量,而接口中定義的成員變量實際上都是常量。
有抽象方法的類必須被聲明爲抽象類,而抽象類未必要有抽象方法
接口能夠繼承接口,並且支持多重繼承。抽象類能夠實現(implements)接口,抽象類可繼承具體類也能夠繼承抽象類。
25存在無用但可達的對象,這些對象不能被GC回收,也不會處理該對象引用的其餘對象,對性能形成重大影響,極端狀況下會引起Disk Paging(物理內存與硬盤的虛擬內存交換數據),甚至形成OutOfMemoryError。也會致使內存泄露的發生。
****如Hibernate的Session(一級緩存)中的對象屬於持久態,垃圾回收器是不會回收這些對象的,然而這些對象中可能存在無用的垃圾對象,若是不及時關閉(close)或清空(flush)一級緩存就可能致使內存泄露。
棧內部維護着對這些對象的過時引用(obsolete reference)。public T pop() { if(size == 0) throw new EmptyStackException(); return elements[--size]; }//內存泄漏
在支持垃圾回收的語言中,內存泄露是很隱蔽的,這種內存泄露其實就是無心識的對象保持。若是一個對象引用被無心識的保留起來了,那麼垃圾回收器不會處理這個對象,也不會處理該對象引用的其餘對象,即便這樣的對象只有少數幾個,也可能會致使不少的對象被排除在垃圾回收以外,從而對性能形成重大影響,極端狀況下會引起Disk Paging(物理內存與硬盤的虛擬內存交換數據),甚至形成OutOfMemoryError。
26內部類須要在外部類實例化後才能實例化.靜態方法中沒有this,也就是說沒有所謂的外部類對象,所以沒法建立內部類對象,若是要在靜態方法中建立內部類對象,能夠這樣作:new outer().new inner();
27本地方法是由本地代碼(如C代碼)實現的方法,而抽象方法是沒有實現的,也是矛盾的。synchronized和方法的實現細節有關,抽象方法不涉及實現細節,所以也是相互矛盾的。
28****(何時使用靜態變量)靜態變量在內存中有且僅有一個拷貝,實現讓多個對象共享內存 。上下文類和工具類中一般會有大量的靜態成員。
靜態方法只能訪問靜態成員,由於非靜態方法的調用要先建立對象,在調用靜態方法時可能對象並無被初始化。
291). 實現Cloneable接口並重寫Object類中的clone()方法;
2). 實現Serializable接口,經過對象的序列化和反序列化實現克隆,能夠實現真正的深度克隆。更重要的是經過泛型限定,能夠檢查出要克隆的對象是否支持序列化,這項檢查是編譯器完成的,不是在運行時拋出異常,這種是方案明顯優於使用Object類的clone方法克隆對象
@SuppressWarnings("unchecked") public static <T extends Serializable> T clone(T obj) throws Exception { ByteArrayOutputStream bout = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bout); oos.writeObject(obj); ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bin); return (T) ois.readObject(); }
}
30System.gc() 或Runtime.getRuntime().gc(),JVM能夠屏蔽掉顯示的垃圾回收調用。
外部資源(如文件流)的釋放則close
垃圾回收器一般是做爲一個單獨的低優先級的線程運行,不可預知的狀況下進行回收,程序員不能實時的調用垃圾回收器對某個對象或全部對象進行垃圾回收。
移動智能終端用戶一般以爲iOS的系統比Android系統有更好的用戶體驗,其中一個深層次的緣由就在於Android系統中垃圾回收的不可預知性。
31.java可有多個類但一個源文件中最多隻能有一個公開類(public class)並且文件名必須和公開類的類名徹底保持一致。
32建立對象時構造器的調用順序是:先初始化靜態成員,而後調用父類構造器,再初始化非靜態成員,最後調用自身構造器。第二次建立則調用父構造器,再初始化非靜態,在調用自身。
33****如何將字符串轉換爲基本數據類型?
- 如何將基本數據類型轉換爲字符串?
34遞歸反轉 return reverse(originStr.substring(1)) + originStr.charAt(0);
35****GB2312編碼的字符串轉換爲ISO-8859-1編碼
new String(s1.getBytes("GB2312"),"ISO-8859-1")
36利用java.text.DataFormat 的子類(如SimpleDateFormat類)中的format(Date)方法可將日期格式化。Java 8中能夠用java.time.format.DateTimeFormatter來格式化時間日期
****Java的時間日期API一直以來都是被詬病的東西,爲了解決這一問題,Java 8中引入了新的時間日期API,其中包括LocalDate、LocalTime、LocalDateTime、Clock、Instant等類,這些的類的設計都使用了不變模式,所以是線程安全的設計。
37 1Java 是原Sun Microsystems公司推出的面向對象的程序設計語言,特別適合於互聯網應用程序開發;而JavaScript是Netscape公司的產品,爲了擴展Netscape瀏覽器的功能而開發的一種能夠嵌入Web頁面中運行的基於對象和事件驅動的解釋性語言。
2JavaScript的前身是LiveScript;而Java的前身是Oak語言。
3Java是一種真正的面向對象的語言,必須設計對象;JavaScript是種腳本語言,它能夠用來製做與網絡無關的,與用戶交互做用的複雜軟件。它是一種基於對象(Object-Based)和事件驅動(Event-Driven)的編程語言,於是它自己提供了很是豐富的內部對象供設計人員使用。
4解釋和編譯:Java的源代碼在執行以前,必須通過編譯。JavaScript是一種解釋性編程語言,其源代碼不需通過編譯,由瀏覽器解釋執行。(目前的瀏覽器幾乎都使用了JIT(即時編譯)技術來提高JavaScript的運行效率) 一個是靜態語言,一個是動態語言.JavaScript支持函數式編程,可使用Lambda函數和閉包(closure)
5強類型變量和類型弱變量:Java採用強類型變量檢查,即全部變量在編譯以前必須做聲明;JavaScript中變量是弱類型的,甚至在使用變量前能夠不做聲明,JavaScript的解釋器在運行時檢查推斷其數據類型。
6代碼格式不同。
38斷言:調試,測試,發佈後關閉,包含bool表達式,false爲AssertionError,JVM時使用-enableassertions或者-ea標記,禁用則-da或者-disableassertions標記,不知足某些條件時阻止代碼的執行,就能夠考慮用斷言來阻止它。要在系統類中啓用或禁用斷言,可以使用-esa或-dsa標記。還能夠在包的基礎上啓用或者禁用斷言。
語法:assert Expression1; assert Expression1 : Expression2(調試信息的字符串消息) ;
39Error表示系統級的錯誤和程序沒必要處理的異常
遞歸編寫程序時必定要牢記兩點:1. 遞歸公式;2. 收斂條件
40try{}裏有一個return語句 finally在方法返回調用者前執行.
若是在finally中修改了返回值,就會返回修改後的值。Eclipse中能夠進行設置,強烈建議將此項設置爲編譯錯誤。
41六原則一法則- 單一職責原則(內聚,耦合)- 開閉原則:軟件實體應當對擴展開放,對修改關閉。①抽象是關鍵,一個系統中若是沒有抽象類或接口系統就沒有擴展點;②封裝可變性:《設計模式精解》一書中對****橋樑模式的講解的章節。) - 依賴倒轉原則:面向接口編程。(聲明方法的參數類型、方法的返回類型、變量的引用類型時,儘量使用抽象類型而不用具體類型) -里氏替換原則:任什麼時候候均可以用子類型替換掉父類型。- 接口隔離原則:接口要小而專。
- 合成聚合複用原則:優先使用聚合或合成關係複用代碼。Is-A關係、Has-A關係、Use-A關係,分別表明繼承、關聯和依賴。其中,關聯關係根據其關聯的強度又能夠進一步劃分爲關聯、聚合和合成
****例如Properties類繼承了Hashtable類,Stack類繼承了Vector類,這些繼承明顯就是錯誤的,更好的作法是在Properties類中放置一個Hashtable類型的成員而且將其鍵和值兩個泛型參數設置爲String類),而Stack類的設計也應該是在Stack類中放一個Vector對象來存儲數據。
記住:任什麼時候候都不要繼承工具類,工具是能夠擁有並可使用的,而不是拿來繼承的。
- 迪米特法則:對其餘知道少。門面模式和調停者模式就是對迪米特法則的踐行。
Java Web開發中做爲前端控制器的Servlet或Filter,前端控制器就可以根據你的請求獲得相應的服務。
主板做爲一個調停者的身份出現,它將各個設備鏈接在一塊兒而不須要每一個設備之間直接交換數據,這樣就減少了系統的耦合度和複雜度。(網->中心發散)
4二、****
建立型[對類的實例化過程的抽象化]、結構型[描述如何將類或對象結合在一塊兒造成更大的結構]、行爲型[對在不一樣的對象之間劃分責任和算法的抽象化]共23種設計模式,包括:
Abstract Factory(抽象工廠模式),Builder(建造者模式),Factory Method(工廠方法模式),Prototype(原始模型模式),Singleton(單例模式);Facade(門面模式),Adapter(適配器模式),Bridge(橋樑模式),Composite(合成模式),Decorator(裝飾模式),Flyweight(享元模式),Proxy(代理模式);Command(命令模式),Interpreter(解釋器模式),Visitor(訪問者模式),Iterator(迭代子模式),Mediator(調停者模式),Memento(備忘錄模式),Observer(觀察者模式),State(狀態模式),Strategy(策略模式),Template Method(模板方法模式), Chain Of Responsibility(責任鏈模式)。
- 工廠模式:工廠類能夠根據條件生成不一樣的子類實例,這些子類有一個公共的抽象父類而且實現了相同的方法,可是這些方法針對不一樣的數據進行了不一樣的操做(多態方法)。當獲得子類的實例後,開發人員能夠調用基類中的方法而沒必要考慮到底返回的是哪個子類的實例。
- 代理模式:給一個對象提供一個代理對象,並由代理對象控制原對象的引用。實際開發中,按照使用目的的不一樣,代理能夠分爲:遠程代理、虛擬代理、保護代理、Cache代理、防火牆代理、同步化代理、智能引用代理。
- 適配器模式:把一個類的接口變換成客戶端所期待的另外一種接口,從而使本來因接口不匹配而沒法在一塊兒使用的類可以一塊兒工做。
- 模板方法模式:提供一個抽象類,將部分邏輯以具體方法或構造器的形式實現,而後聲明一些抽象方法來迫使子類實現剩餘的邏輯。不一樣的子類能夠以不一樣的方式實現這些抽象方法(多態實現),從而實現不一樣的業務邏輯。
43反射 String str = "hello"; Method m = str.getClass().getMethod("toUpperCase"); System.out.println(m.invoke(str)); // HELLO
4四、面向對象處理異常,每一個異常都是一個對象,它是Throwable類或其子類的實例。try語句能夠嵌套,每當遇到一個try語句,異常的結構就會被放入異常棧中,直到全部的try語句都完成。
內層能捕獲,則外層catch不執行:內層catch處理了異常,因此沒有執行外層catch,內層finally結束再外層finally。如內層不處理,則內層先finally再外層catch。
出現異常,以後語句不執行,直接執行catch finally,但外層try仍是要繼續執行。除非內層異常沒捕獲則外層直接到catch
finally:只要JVM不關閉都能執行,能夠將釋放外部資源的代碼寫在finally塊中。
****運行異常虛擬機的一般操做中可能遇到的異常:- ArithmeticException(算術異常) - ClassCastException (類轉換異常) - IllegalArgumentException (非法參數異常) - IndexOutOfBoundsException (下標越界異常) - NullPointerException (空指針異常) ****- SecurityException (安全異常)
****(不明白) - 不要將異常處理用於正常的控制流(設計良好的API不該該強迫它的調用者爲了正常的控制流而使用異常) - 對能夠恢復的狀況使用受檢異常,對編程錯誤使用運行時異常
編譯器要求方法必須聲明拋出可能發生的受檢異常,可是並不要求必須聲明拋出未被捕獲的運行時異常
****異常的繼承問題
45****舉例?
- finalize:Object類中定義的方法,Java中容許使用finalize()方法在垃圾收集器將對象從內存中清除出去以前作必要的清理工做。這個方法是由垃圾收集器在銷燬對象時調用的,經過重寫finalize()方法能夠整理系統資源或者執行其餘清理工做。
46Map是鍵值對映射容器非collection,List是線性結構的容器,適用於按數值索引訪問元素的情形。
47ArrayList 和Vector都容許直接按序號索引元素,實現方式:元素數大於實際存儲的數組,插入慢,vector有synchronized性能差於Arraylist成爲遺留容器,
LinkedList使用雙向鏈表實現存儲(插入塊,索引慢)
Hashtable、Dictionary、BitSet、Stack、Properties(一個鍵和值都是字符串的特殊的鍵值對映射)都是遺留容器已經不推薦使用
因爲ArrayList和LinkedListed都是非線程安全的,經過工具類Collections中的synchronizedList方法將其轉換成線程安全的容器後再使用(這是對裝潢模式的應用,將已有對象傳入另外一個類的構造器中建立新的對象來加強實現)
Collection是一個接口,它是Set、List等容器的父接口;Collections是個一個工具類,提供了一系列的靜態方法來輔助容器操做,這些方法包括對容器的搜索、排序、線程安全化等等。
Set用對象的equals()方法來區分元素是否重複
****map一對一或多對一
****Set和Map容器都有基於哈希存儲和排序樹的兩種實現版本,基於哈希存儲的版本理論存取時間複雜度爲O(1),而基於排序樹版本的實如今插入或刪除元素時會按照元素或元素的鍵(key)構成排序樹從而達到排序和去重的效果。
48TreeSet要求存放的對象所屬的類必須實現Comparable接口,其中compareTo()當插入元素時會回調該方法比較元素的大小。
TreeMap要求存放的鍵值對映射的鍵必須實現Comparable接口從而根據鍵對元素進行排序。
Collections工具類的sort方法有兩種重載的形式,第一種要求傳入的待排序容器中存放的對象比較實現Comparable接口以實現元素的比較;第二種不強制性的要求容器中的元素必須可比較,可是要求傳入第二個參數,參數是Comparator接口的子類型(須要重寫compare方法實現元素的比較),至關於一個臨時定義的排序規則,其實就是經過接口注入比較元素大小的算法,也是對回調模式的應用(Java中對函數式編程的支持)。
***因爲Java中沒有函數指針、仿函數、委託這樣的概念 。 所以要將一個算法傳入一個方法中惟一的選擇就是經過接口回調
49sleep() Thread的靜態方法,將執行機會(CPU)讓給其餘線程且不考慮線程的優先級,所以會給低優先級的線程以運行的機會,對象的鎖依然保持,自動恢復到就緒狀態,聲明拋出InterruptedException。
wait()是Object類的方法,當前線程放棄對象的鎖進入對象的等待池(wait pool)即阻塞狀態,只有調用對象的notify(喚醒一個處於等待狀態的線程,固然在調用此方法的時候,並不能確切的喚醒某一個等待狀態的線程,而是由JVM肯定喚醒哪一個線程,並且與優先級無關)(或notifyAll(池中全部線程競爭,得鎖者進入就緒)方法)時才能喚醒等待池中的線程進入等鎖池(lock pool),若是線程從新得到對象的鎖就能夠進入就緒狀態。
****Node.js就採用了單線程異步I/O的工做模式。
yield()方法只會給相同優先級或更高優先級的線程以運行的機會,轉入就緒; 無異常聲明;
****sleep()方法比yield()方法(跟操做系統CPU調度相關)具備更好的可移植性。
其它線程只能訪問該對象的非同步方法,同步方法則不能進入。由於非靜態方法上的synchronized修飾符要求執行方法時要得到對象的鎖,若是已經進入A方法說明對象鎖已經被取走,那麼試圖進入B方法的線程就只能在等鎖池中等待對象的鎖。
****信號量, condition
****(寫代碼)同步的synchronized 鎖機制 信號量
實現多線程繼承Thread類;實現Runnable接口,5後實現Callable接口。Java中的繼承是單繼承,繼承了Thread類就沒法再繼承其餘類,使用Runnable接口更爲靈活call方法能夠在線程執行結束時產生一個返回值
****臨界資源(資源數量少於競爭資源的線程數量的資源)
例如正在寫的數據之後可能被另外一個線程讀到,或者正在讀的數據可能已經被另外一個線程寫過了,那麼這些數據就必須進行同步存取(數據庫操做中的排他鎖就是最好的例子)。同步就是指阻塞式操做,而異步就是非阻塞式操做。
****啓動一個線程是調用start()方法,使線程所表明的虛擬處理機處於可運行狀態,這意味着它能夠由JVM 調度並執行,這並不意味着線程就會當即運行。run()方法是線程啓動後要進行回調(callback)的方法。
建立和銷燬對象是很費時間的(要獲取內存資源),虛擬機將試圖跟蹤每個對象
****
- newSingleThreadExecutor:單線程串行執行全部任務。若是這個惟一的線程由於異常結束,那麼會有一個新的線程來替代它。任務的執行順序按照任務的提交順序執行。支持定時以及週期性執行任務的需求。
- newFixedThreadPool:提交一個任務就建立一個線程,直到線程池的最大大小。異常則新建。
- newCachedThreadPool:建立一個可緩存的線程池。回收部分空閒(60秒不執行任務)的線程,當任務數增長時,此線程池又能夠智能的添加新線程來處理任務。
- newScheduledThreadPool:建立一個大小無限的線程池。此線程池支持定時以及週期性執行任務的需求。
阻塞狀態又有多種狀況,多是由於調用wait()方法進入等待池,也多是執行同步方法或同步代碼塊進入等鎖池,或者是調用了sleep()方法或join()方法等待休眠或其餘線程結束,或是由於發生了I/O中斷。
50若是不進行序列化可能會存在數據亂序的問題.一個輸出流來構造一個對象輸出流並經過writeObject(Object)方法就能夠將實現對象寫出
;反序列化則能夠用一個輸入流創建對象輸入流,而後經過readObject方法從流中讀取。序列化除了可以實現對象的持久化以外,還可以用於對象的深度克隆
****字節流繼承於InputStream、OutputStream,字符流繼承於Reader、Writer。在java.io 包中還有許多其餘的流,主要是爲了提升性能和使用方便。關於Java的I/O須要注意的有兩點:一是兩種對稱性(輸入和輸出的對稱性,字節和字符的對稱性);二是兩種設計模式(適配器模式和裝潢模式)。另外Java中的流不一樣於C#的是它只有一個維度一個方向。
51
XML文檔定義分爲DTD和Schema兩種形式,Schema自己也是一個XML文件,能夠被XML解析器解析,並且能夠爲XML承載的數據定義類型,約束能力較之DTD更強大。
對XML的解析主要有DOM(文檔對象模型,Document Object Model)、SAX(Simple API for XML)和StAX(Java 6中引入的新的解析XML的方式,Streaming API for XML)
DOM樹結構佔用的內存較多,在解析文件以前把整個文檔裝入內存,適合對XML的隨機訪問(典型的用空間換取時間的策略)
SAX是事件驅動型的XML解析方式,它順序讀取XML文件,不須要一次所有裝載整個文件。當遇到像文件開頭,文檔結束,或者標籤開頭與標籤結束時,它會觸發一個事件,用戶經過事件回調代碼來處理XML文件,適合對XML的順序訪問
****StAX與其餘解析方式的本質區別就在於應用程序可以把XML做爲一個事件流來處理。不一樣之處在於StAX容許應用程序代碼把這些事件逐個拉出來,而不用提供在解析器方便時從解析器中接收事件的處理程序。
Sublime已經開始將配置文件書寫成JSON格式
XML:數據交換和信息配置. 異構系統間交換數據幾乎已經被JSON(JavaScript Object Notation取代XML來存儲配置信息dom4j做爲處理XML的工具
52 JDBC 驅動,鏈接,語句,執行,處理結果,關閉鏈接
先關閉ResultSet、再關閉Statement、在關閉Connection。上面的代碼只關閉了Connection(鏈接),雖然一般狀況下在關閉鏈接時,鏈接上建立的語句和打開的遊標也會關閉,但不能保證老是如此,所以應該按照剛纔說的順序分別關閉。
第一步加載驅動在JDBC 4.0中是能夠省略的(自動從類路徑中加載驅動),可是咱們建議保留。
Class.forName("oracle.jdbc.driver.OracleDriver"); Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "scott", "tiger"); PreparedStatement ps = con.prepareStatement("select * from emp where sal between ? and ?"); ps.setInt(1, 1000); ps.setInt(2, 3000); ResultSet rs = ps.executeQuery(); while(rs.next()) { System.out.println(rs.getInt("empno") + " - " + rs.getString("ename")); } finally { if(con != null) { try { con.close(); } catch (SQLException e) { e.printStackTrace(); } } }
53 ①PreparedStatement接口爲預編譯的語句,它主要的優點在於能夠減小SQL的編譯錯誤並增長SQL的安全性(****減小SQL注射攻擊的可能性);②PreparedStatement中的SQL語句是能夠帶參數的,避免了用字符串鏈接拼接SQL語句的麻煩和不安全;③當批量處理SQL或頻繁執行相同的查詢時,PreparedStatement有明顯的性能上的優點,因爲數據庫能夠將編譯優化後的SQL語句緩存起來,下次執行相同結構的語句時就會很快(不用再次編譯和生成執行計劃)。
對存儲過程調用的CallableStatement接口。調用存儲過程會在網絡開銷、安全性、性能上獲好處,底層數據庫發生遷移時語法不一樣。
讀取:ResultSet對象的setFetchSize()方法指定每次抓取的記錄數(典型的空間換時間策略)
更新:PreparedStatement語句構建批處理,將若干SQL語句置於一個批處理中執行。
因爲建立鏈接和釋放鏈接都有很大的開銷(尤爲是數據庫服務器不在本地時,每次創建鏈接都須要進行TCP的三次握手,釋放鏈接須要進行TCP四次握手,形成的開銷是不可忽視的)事先建立若干鏈接置於鏈接池中,空間換時間。Java的開源數據庫鏈接池主有:C3P0、Proxool、DBCP、BoneCP、Druid等。
****數據庫與數據倉庫
****etl
54緩存的置換策略
55****DAO(Data Access Object)顧名思義是一個爲數據庫或其餘持久化機制提供了抽象接口的對象,訪問數據等,編寫一個單獨的類來實現這個接口,在邏輯上該類對應一個特定的數據存儲。DAOData Accessor(數據訪問器)Data Object(數據對象),前者要解決如何訪問數據的問題,然後者要解決的是如何用對象封裝數據。
56事務的ACID 原子性(Atomic) 一致性(Consistent):事務結束後系統狀態是一致的 隔離性(Isolated):併發執行的事務彼此沒法看到對方的中間狀態;
- 持久性(Durable):事務完成後所作的改動都會被持久化,即便發生災難性的失敗。經過日誌和同步備份能夠在故障發生後重建數據。
存在併發數據訪問時才須要事務。
當多個事務訪問同一數據時3類數據讀取問題(髒讀、不可重複讀和幻讀)和2類數據更新問題(第1類丟失更新和第2類丟失更新)。
髒讀:B操做A讀,B未提交B回滾。A讀到髒。BABA(B的操做後的數據讀、回滾後的數據讀)
不可重複讀(Unrepeatable Read):A讀,B提交,A重讀到與以前不一樣。BABA(B操做前的數據讀、提交後的數據讀)
幻讀(Phantom Read):A統計,B提交,A中插入一條B提交相關的內容。 BABA (B操做前的數據讀、提交後的數據讀)
第1類丟失更新:A讀B讀B提交A寫&撤銷。ABBA (B操做前數據寫&回滾覆蓋B操做)
第2類丟失更新:B讀A讀B提交A提交。BABA (B操做前數據提交覆蓋B操做)
ABBA BABA (ABAB?即BABA; BAAB即ABBA,但A分有無操做是否是隻讀)
總結:分爲B操做有無提交。A在B操做前、B提交4種(分A操做有無提交:12類數據丟失更新;A讀:B存幻讀取則不可重複讀),A在B操做後、B回滾1種(髒讀)
鎖機制解決數據併發訪問
鎖定對象不一樣能夠分爲表級鎖和行級鎖;按併發事務鎖定關係能夠分爲共享鎖和獨佔鎖
自動鎖機制,分析sql爲資源加鎖,維護鎖提性能,對用戶來講透明
****ANSI/ISO SQL 92標準定義了4個等級的事務隔離級別,事務隔離級別越高併發性就越差。
Connection調用****setAutoCommit(false)手動,當事務完成後用commit()顯式提交事務;異常則rollback()回滾。保存點。
Blob是指二進制大對象(Binary Large Object),而Clob是指大字符對象(Character Large Objec),所以其中Blob是爲存儲大的二進制數據而設計的,而Clob是爲存儲大的文本數據而設計的。
57****正則
58得到類
- 方法1:類型.class,例如:String.class
- 方法2:對象.getClass(),例如:"hello".getClass()
- 方法3:Class.forName(),例如:Class.forName("java.lang.String")
反射建立實例:
- 方法1:經過類對象調用newInstance()方法,例如:String.class.newInstance()
- 方法2:經過類對象的getConstructor()或getDeclaredConstructor()方法得到構造器(Constructor)對象並調用其newInstance()方法建立對象,例如:String.class.getConstructor(String.class).newInstance("Hello");
getDeclaredField()方法字段(Field)對象,而後再經過字段對象的setAccessible(true)將其設置爲能夠訪問,接下來就能夠經過get/set方法來獲取/設置字段的值了
59****Spring的IoC容器能夠爲普通的類建立單例,它是怎麼作到的呢?
60UML
用例圖(use case diagram)、類圖(class diagram)、時序圖(sequence diagram)、協做圖(collaboration diagram)、狀態圖(statechart diagram)、活動圖(activity diagram)、構件圖(component diagram)、部署圖(deployment diagram)等。
61Servlet:服務器進程中,在Servlet容器中運行(JSP容器可以運行servlet的服務器,提供jsp頁面運行環境),多線程運行serviec(),一個實例服務多個請求關聯一個或多個JSP頁面、(容器將請求傳遞給servlet程序,響應傳給用戶)、不會銷燬。****不能生成動態網頁,全部的文本和HTML標籤都是硬編碼,即便作出微小的修改,都須要進行從新編譯。Servlet是一個特殊的Java程序,它運行於服務器的JVM中,可以依靠服務器的支持向瀏覽器提供顯示內容。
JSP本質上是Servlet的一種簡易形式,JSP會被服務器處理成一個相似於Servlet的Java程序,能夠簡化頁面內容的生成。
Servlet和JSP最主要的不一樣點在於,Servlet的應用邏輯是在Java文件中,而且徹底從表示層中的HTML分離開來。而JSP的狀況是Java和HTML能夠組合成一個擴展名爲.jsp的文件。
JSP側重於視圖,Servlet更側重於控制邏輯,在MVC架構模式中,JSP適合充當視圖(view)而Servlet適合充當控制器(controller)。
CGI:每一個請求產生新進程,銷燬,效率低於servelet
處於服務器進程中,它經過多線程方式運行其service()方法,一個實例能夠服務於多個請求,而且其實例通常不會銷燬,而CGI對每一個請求都產生新的進程,服務完成後就銷燬,因此效率上低於Servlet,Fast CGI
五個接口,三個生命週期相關: init(Web容器加載Servlet並將其實例化後) service(根據請求調用doGet或doPost等) destroy(服務器關閉或項目被卸載時); getinfo getconfig
forward 更高效是容器中控制權的轉向,是服務器請求資源,隱藏實際連接.ServletRequest對象的getRequestDispatcher()方法得到RequestDispatcher,再獲對象的forward()
redirect就是服務器端發送一個狀態碼告訴瀏覽器從新去請求那個地址,HttpServletResponse對象調用其sendRedirect()
62****JSP有9個內置對象: - request- response- session - pageContext:經過該對象能夠獲取其餘對象; - application - out - config - page-exception。爲用戶呈現視圖。
JSP4做用域:page、request、session和application
****Tomcat就是一個Servlet/JSP容器。第一次請求一個JSP頁面時,Servlet/JSP容器首先將JSP頁面轉換成一個JSP頁面的實現類,這是一個實現了JspPage接口或其子接口HttpJspPage的Java類。JspPage接口是Servlet的子接口,所以每一個JSP頁面都是一個Servlet。轉換成功後,容器會編譯Servlet類,以後容器加載和實例化Java字節碼,並執行它一般對Servlet所作的生命週期操做。對同一個JSP頁面的後續請求,容器會查看這個JSP頁面是否被修改過,若是修改過就會從新轉換並從新編譯並執行。若是沒有則執行內存中已經存在的Servlet實例。
63****get獲資源,表單數據name=value,添加action所指向的url後二者使用"?"鏈接,變量之間&鏈接,傳輸的數據要受到URL長度限制(1024字節),get時參數會顯示在地址欄上,若是這些數據不是敏感數據get,MIME類型application/x-www-form-urlencoded的URL編碼(也叫百分號編碼)文本的格式傳遞參數,保證被傳送的參數由遵循規範的文本組成,例如一個空格的編碼是"%20"。
post提交,表單中的數據放在HTTP協議的請求頭或消息體中,傳遞到action所指向URL;能夠傳輸大量的數據,如上傳文件 ,敏感數據,
64
****經常使用的Web服務器有哪些?
最普遍的免費HTTP服務器是Apache服務器,而Windows平臺的服務器一般使用IIS做爲Web服務器。
選擇Web服務器應考慮的因素有:性能、安全性、日誌和統計、虛擬主機、代理服務器、緩衝服務和集成應用程序等。
- IIS:Microsoft的Web服務器產品,全稱是Internet Information Services。IIS是容許在公共Intranet或Internet上發佈信息的Web服務器。IIS是目前最流行的Web服務器產品之一,不少著名的網站都是創建在IIS的平臺上。IIS提供了一個圖形界面的管理工具,稱爲Internet服務管理器,可用於監視配置和控制Internet服務。IIS是一種Web服務組件,其中包括Web服務器、FTP服務器、NNTP服務器和SMTP服務器,分別用於網頁瀏覽、文件傳輸、新聞服務和郵件發送等方面,它使得在網絡(包括互聯網和局域網)上發佈信息成了一件很容易的事。它提供ISAPI(Intranet Server API)做爲擴展Web服務器功能的編程接口;同時,它還提供一個Internet數據庫鏈接器,能夠實現對數據庫的查詢和更新。
- Kangle:Kangle Web服務器是一款跨平臺、功能強大、安全穩定、易操做的高性能Web服務器和反向代理服務器軟件。此外,Kangle也是一款專爲作虛擬主機研發的Web服務器。實現虛擬主機獨立進程、獨立身份運行。用戶之間安全隔離,一個用戶出問題不影響其餘用戶。支持PHP、ASP、ASP.NET、Java、Ruby等多種動態開發語言。
- WebSphere:WebSphere Application Server是功能完善、開放的Web應用程序服務器,是IBM電子商務計劃的核心部分,它是基於Java的應用環境,用於創建、部署和管理Internet和Intranet Web應用程序,適應各類Web應用程序服務器的須要。
- WebLogic:WebLogic Server是一款多功能、基於標準的Web應用服務器,爲企業構建企業應用提供了堅實的基礎。針對各類應用開發、關鍵性任務的部署,各類系統和數據庫的集成、跨Internet協做等Weblogic都提供了相應的支持。因爲它具備全面的功能、對開放標準的聽從性、多層架構、支持基於組件的開發等優點,不少公司的企業級應用都選擇它來做爲開發和部署的環境。WebLogic Server在使應用服務器成爲企業應用架構的基礎方面一直處於領先地位,爲構建集成化的企業級應用提供了穩固的基礎。
- Apache:目前Apache仍然是世界上用得最多的Web服務器,其市場佔有率很長時間都保持在60%以上(目前的市場份額約40%左右)。世界上不少著名的網站都是Apache的產物,它的成功之處主要在於它的源代碼開放、有一支強大的開發團隊、支持跨平臺的應用(能夠運行在幾乎全部的Unix、Windows、Linux系統平臺上)以及它的可移植性等方面。
- Tomcat:Tomcat是一個開放源代碼、運行Servlet和JSP的容器。Tomcat實現了Servlet和JSP規範。此外,Tomcat還實現了Apache-Jakarta規範並且比絕大多數商業應用軟件服務器要好,所以目前也有很多的Web服務器都選擇了Tomcat。
- Nginx:讀做"engine x",是一個高性能的HTTP和反向代理服務器,也是一個IMAP/POP3/SMTP代理服務器。 Nginx是由Igor Sysoev爲俄羅斯訪問量第二的Rambler站點開發的,第一個公開版本0.1.0發佈於2004年10月4日。其將源代碼以類BSD許可證的形式發佈,因它的穩定性、豐富的功能集、示例配置文件和低系統資源的消耗而聞名。在2014年下半年,Nginx的市場份額達到了14%。
65****講解JSP中的四種做用域。
答:JSP中的四種做用域包括page、request、session和application,具體來講:
- page表明與一個頁面相關的對象和屬性。
- request表明與Web客戶機發出的一個請求相關的對象和屬性。一個請求可能跨越多個頁面,涉及多個Web組件;須要在頁面顯示的臨時數據能夠置於此做用域。
- session表明與某個用戶與服務器創建的一次會話相關的對象和屬性。跟某個用戶相關的數據應該放在用戶本身的session中。
- application表明與整個Web應用程序相關的對象和屬性,它實質上是跨越整個Web應用程序,包括多個頁面、請求和會話的一個全局做用域。
66 單線程模式 每一個請求建立一個Servlet實例,這種實踐將致使嚴重的性能問題(服務器的內存壓力很大,還會致使頻繁的垃圾回收):<%@page isThreadSafe=」false」%>
自定義的Servlet實現SingleThreadModel標識接口
67
編程題:
文件拷貝
統計字符串字數
列出全部文件
套接字實現多線程回顯
冒泡排序
折半查找