Hibernate的特色:強大、方便、高效、複雜、繞彎子、全自動 1. 對象/關係數據庫映射,徹底的向對象思想。開發速度快。 2. Sql移植性好。具備本身的日誌統計。 3. 緩存機制,提供一級緩存和二級緩存。 4. 功能和特性很是多,不適合多表關聯查詢。 5. 事物transaction ,沒有侵入性,即所謂的輕量級框架。 6. 透明持久化,具備業務功能的單線程對象。 7. 簡潔的 HQL編程。 Mybatis的特色:小巧、方便、高效、簡單、直接、半自動 1.Sql更加細緻,手寫sql語句,減小查詢字段,有利於sql優化。 2.Mybatis簡單,更容易掌握。 hibernate調優方案: 1、制定合理的緩存策略 2、儘可能使用延遲加載特性 3、採用合理的session管理機制 4、使用批量抓取設定合理的批處理參數 五、進行合理的O/R映射設計 mybatis中resultMap和resultType的區別: resultType是表示直接返回類型。resultType和resultMap不能同時存在。查詢出來的每個屬性都至關於一個map。 Mybatis動態sql語句: if 語句、if+where 語句、if+set 語句、choose(when,otherwise) 語句、trim 語句、foreach 語句 如何解決高併發的問題: 1. html頁面靜態化 2. 圖片服務器分離 3. 數據庫集羣和庫表散列 4. 緩存 5. 負載均衡 6. 鏡像 svn和git的區別? Git是分佈式的,把內容按元數據方式存儲,沒有一個全局版本號,Git的內容的完整性要優於SVN:,GIT的內容存儲使用的是SHA-1哈希算法,(分佈式版本控制) Svn不是分佈的,按文件方式進行存儲,有全局的版本號。(集中式版本控制) 集羣軟件的分類: 高性能集羣:彌補了單機性的不足,運用在天氣監測上 負載均衡集羣:選擇最小的服務器處理 高可用性集羣:當一臺機器壞了,另外一臺服務器會馬上代替上一臺服務器。通常用在銀行、電信。 處理高併發的的方法? 1、HTML靜態化 2、圖片服務器分離 3、數據庫集羣和庫表散列 4、緩存 5、鏡像 6、負載均衡 類加載器有哪些? 咱們進一步瞭解類加載器間的關係(並不是指繼承關係),主要能夠分爲如下4點 啓動類加載器,由C++實現,沒有父類。 拓展類加載器(ExtClassLoader),由Java語言實現,父類加載器爲null。 系統類加載器(AppClassLoader),由Java語言實現,父類加載器爲ExtClassLoader。 自定義類加載器,父類加載器確定爲AppClassLoader。 雙親委派模式? 雙親委派模式要求除了頂層的啓動類加載器外,其他的類加載器都應當有本身的父類加載器,請注意雙親委派模式中的父子關係並不是一般所說的類繼承關係,而是採用組合關係來複用父類加載器的相關代碼,類加載器間的關係以下: 雙親委派模式是在Java 1.2後引入的,其工做原理的是,若是一個類加載器收到了類加載請求,它並不會本身先去加載,而是把這個請求委託給父類的加載器去執行,若是父類加載器還存在其父類加載器,則進一步向上委託,依次遞歸,請求最終將到達頂層的啓動類加載器,若是父類加載器能夠完成類加載任務,就成功返回,假若父類加載器沒法完成此加載任務,子加載器纔會嘗試本身去加載,這就是雙親委派模式。 雙親委派模式優點: 採用雙親委派模式的是好處是Java類隨着它的類加載器一塊兒具有了一種帶有優先級的層次關係,經過這種層級關能夠避免類的重複加載,當父親已經加載了該類時,就沒有必要子ClassLoader再加載一次。其次是考慮到安全因素,java核心api中定義類型不會被隨意替換,假設經過網絡傳遞一個名爲java.lang.Integer的類,經過雙親委託模式傳遞到啓動類加載器,而啓動類加載器在覈心Java API發現這個名字的類,發現該類已被加載,並不會從新加載網絡傳遞的過來的java.lang.Integer,而直接返回已加載過的Integer.class,這樣即可以防止核心API庫被隨意篡改。可能你會想,若是咱們在classpath路徑下自定義一個名爲java.lang.SingleInterge類(該類是胡編的)呢?該類並不存在java.lang中,通過雙親委託模式,傳遞到啓動類加載器中,因爲父類加載器路徑下並無該類,因此不會加載,將反向委託給子類加載器加載,最終會經過系統類加載器加載該類。可是這樣作是不容許,由於java.lang是核心API包,須要訪問權限,強制加載將會報出以下異常 java.lang.SecurityException: Prohibited package name: java.lang 因此不管如何都沒法加載成功的。 jvm的優化? a) 設置參數,設置jvm的最大內存數 b) 垃圾回收器的選擇 什麼是Java虛擬機?爲何Java被稱做是「平臺無關的編程語言」? Java虛擬機是一個能夠執行Java字節碼的虛擬機進程。Java源文件被編譯成能被Java虛擬機執行的字節碼文件。 Java被設計成容許應用程序能夠運行在任意的平臺,而不須要程序員爲每個平臺單獨重寫或者是從新編譯。Java虛擬機讓這個變爲可能,由於它知道底層硬件平臺的指令長度和其餘特性。 JDK和JRE的區別是什麼? Java運行時環境(JRE)是將要執行Java程序的Java虛擬機。它同時也包含了執行applet須要的瀏覽器插件。Java開發工具包(JDK)是完整的Java軟件開發包,包含了JRE,編譯器和其餘的工具(好比:JavaDoc,Java調試器),可讓開發者開發、編譯、執行Java應用程序。 JDK(Java Development Kit)即爲Java開發工具包,包含編寫Java程序所必須的編譯、運行等開發工具以及JRE。開發工具如:用於編譯java程序的javac命令、用於啓動JVM運行java程序的java命令、用於生成文檔的javadoc命令以及用於打包的jar命令等等。 JRE(Java Runtime Environment)即爲Java運行環境,提供了運行Java應用程序所必須的軟件環境,包含有Java虛擬機(JVM)和豐富的系統類庫。系統類庫即爲java提早封裝好的功能類,只需拿來直接使用便可,能夠大大的提升開發效率。 JVM(Java Virtual Machines)即爲Java虛擬機,提供了字節碼文件(.class)的運行環境支持。 簡單說,就是JDK包含JRE包含JVM。 」static」關鍵字是什麼意思?Java中是否能夠覆蓋(override)一個private或者是static的方法? 「static」關鍵字代表一個成員變量或者是成員方法能夠在沒有所屬的類的實例變量的狀況下被訪問。 Java中static方法不能被覆蓋,由於方法覆蓋是基於運行時動態綁定的,而static方法是編譯時靜態綁定的。static方法跟類的任何實例都不相關,因此概念上不適用。 是否能夠在static環境中訪問非static變量? static變量在Java中是屬於類的,它在全部的實例中的值是同樣的。當類被Java虛擬機載入的時候,會對static變量進行初始化。若是你的代碼嘗試不用實例來訪問非static的變量,編譯器會報錯,由於這些變量尚未被建立出來,尚未跟任何實例關聯上。 [第12題] Java支持的數據類型有哪些?什麼是自動拆裝箱? Java語言支持的8中基本數據類型是: Byte、short、int、long、float、double、boolean、char 自動裝箱是Java編譯器在基本數據類型和對應的對象包裝類型之間作的一個轉化。好比:把int轉化成Integer,double轉化成double,等等。反之就是自動拆箱。 Java中的方法覆蓋(Overriding)和方法重載(Overloading)是什麼意思? Java中的方法重載發生在同一個類裏面兩個或者是多個方法的方法名相同可是參數不一樣的狀況。與此相對,方法覆蓋是說子類從新定義了父類的方法。方法覆蓋必須有相同的方法名,參數列表和返回類型。覆蓋者可能不會限制它所覆蓋的方法的訪問。 Java中,什麼是構造函數?什麼是構造函數重載?什麼是複製構造函數? 當新對象被建立的時候,構造函數會被調用。每個類都有構造函數。在程序員沒有給類提供構造函數的狀況下,Java編譯器會爲這個類建立一個默認的構造函數。 Java中構造函數重載和方法重載很類似。能夠爲一個類建立多個構造函數。每個構造函數必須有它本身惟一的參數列表。 Java不支持像C++中那樣的複製構造函數,這個不一樣點是由於若是你不本身寫構造函數的狀況下,Java不會建立默認的複製構造函數。 Java支持多繼承麼? Java不支持多繼承。每一個類都只能繼承一個類,可是能夠實現多個接口。 接口和抽象類的區別是什麼? Java提供和支持建立抽象類和接口。它們的實現有共同點,不一樣點在於: 接口中全部的方法隱含的都是抽象的。而抽象類則能夠同時包含抽象和非抽象的方法。 類能夠實現不少個接口,可是隻能繼承一個抽象類 類若是要實現一個接口,它必需要實現接口聲明的全部方法。可是,類能夠不實現抽象類聲明的全部方法,固然,在這種狀況下,類也必須得聲明成是抽象的。 抽象類能夠在不提供接口方法實現的狀況下實現接口。 Java接口中聲明的變量默認都是final的。抽象類能夠包含非final的變量。 Java接口中的成員函數默認是public的。抽象類的成員函數能夠是private,protected或者是public。 接口是絕對抽象的,不能夠被實例化。抽象類也不能夠被實例化,可是,若是它包含main方法的話是能夠被調用的。 也能夠參考JDK8中抽象類和接口的區別 什麼是值傳遞和引用傳遞? 對象被值傳遞,意味着傳遞了對象的一個副本。所以,就算是改變了對象副本,也不會影響源對象的值。 對象被引用傳遞,意味着傳遞的並非實際的對象,而是對象的引用。所以,外部對引用對象所作的改變會反映到全部的對象上。 咱們能在 Switch 中使用 String 嗎? 從 Java 7 開始,咱們能夠在 switch case 中使用字符串,但這僅僅是一個語法糖。內部實如今 switch 中使用字符串的 hash code。 Java 中的構造器鏈是什麼? 當你從一個構造器中調用另外一個構造器,就是Java 中的構造器鏈。這種狀況只在重載了類的構造器的時候纔會出現。 64 位 JVM 中,int 的長度是多數? Java 中,int 類型變量的長度是一個固定值,與平臺無關,都是 32 位。意思就是說,在 32 位 和 64 位 的Java 虛擬機中,int 類型的長度是相同的。 a==b」和」a.equals(b)」有什麼區別? 若是 a 和 b 都是對象,則 a==b 是比較兩個對象的引用,只有當 a 和 b 指向的是堆中的同一個對象纔會返回 true a.equals(b) 是進行邏輯比較,因此一般須要重寫該方法來提供邏輯一致性的比較。例如,String 類重寫 equals() 方法,因此能夠用於兩個不一樣對象,可是包含的字母相同的比較。 a.hashCode() 有什麼用?與 a.equals(b) 有什麼關係? hashCode() 方法是相應對象整型的 hash 值。它經常使用於基於 hash 的集合類,如 Hashtable、HashMap、LinkedHashMap等等。它與 equals() 方法關係特別緊密。根據 Java 規範,兩個使用 equal() 方法來判斷相等的對象,必須具備相同的 hash code。 final、finalize 和 finally 的不一樣之處? final 是一個修飾符,能夠修飾變量、方法和類。若是 final 修飾變量,意味着該變量的值在初始化後不能被改變。 finalize 方法是在對象被回收以前調用的方法,給對象本身最後一個復活的機會,可是何時調用 finalize 沒有保證。 finally 是一個關鍵字,與 try 和 catch 一塊兒用於異常的處理。finally 塊必定會被執行,不管在 try 塊中是否有發生異常。 [第26題] 用最有效率的方法計算2乘以8? 2 << 3(左移3位至關於乘以2的3次方,右移3位至關於除以2的3次方) JVM的內存結構? 答:主要分爲三大塊 堆內存、方法區、棧;棧又分爲JVM棧、本地方法棧 堆(heap space),堆內存是JVM中最大的一塊,有年輕代和老年代組成,而年輕代又分爲三分部分,Eden區,From Survivor,To Survivor,默認狀況下按照8:1:1來分配 方法區(Method area),存儲類信息、常量、靜態變量等數據,是線程共享的區域 程序計數器(Program counter Register),是一塊較小的內存空間,是當前線程所執行的字節碼的行號指示器 JVM棧(JVM stacks),也是線程私有的,生命週期與線程相同,每一個方法被執行時都會建立一個棧幀,用於存儲局部變量表、操做棧、動態連接、方法出口等信息 本地方法棧(Native Mthod Stacks),爲虛擬機使用的native方法服務 System.gc()和Runtime.gc()會作什麼事情? 這兩個方法用來提示JVM要進行垃圾回收。可是,當即開始仍是延遲進行垃圾回收是取決於JVM的。 怎樣經過 Java 程序來判斷 JVM 是 32 位 仍是 64 位? 你能夠檢查某些系統屬性如 sun.arch.data.model 或 os.arch 來獲取該信息。 JRE、JDK、JVM 及 JIT 之間有什麼不一樣? JRE 表明 Java 運行時(Java run-time),是運行 Java 引用所必須的。 JDK 表明 Java 開發工具(Java development kit),是 Java 程序的開發工具,如 Java 編譯器,它也包含 JRE。 JVM 表明 Java 虛擬機(Java virtual machine),它的責任是運行 Java 應用。 JIT 表明即時編譯(Just In Time compilation),當代碼執行的次數超過必定的閾值時,會將 Java 字節碼轉換爲本地代碼,如,主要的熱點代碼會被準換爲本地代碼,這樣有利大幅度提升 Java 應用的性能。 你能保證 GC 執行嗎? 不能,雖然你能夠調用 System.gc() 或者 Runtime.gc(),可是沒有辦法保證 GC 的執行。 動態代理的兩種方式,以及區別? 答:jdk動態代理和cglib動態代理; JDK動態代理只能對實現了接口的類生成代理,而不能針對類;cglib是針對類實現代理,主要是對指定的類生成一個子類,覆蓋其中的方法,由於是繼承,因此該類或方法最好不要聲明稱final,final能夠阻止繼承和多態; Java中Exception和Error有什麼區別? Exception和Error都是Throwable的子類。Exception用於用戶程序能夠捕獲的異常狀況。Error定義了不指望被用戶程序捕獲的異常。 hrow和throws有什麼區別? throw關鍵字用來在程序中明確的拋出異常,相反,throws語句用來代表方法不能處理的異常。每個方法都必需要指定哪些異常不能處理,因此方法的調用者纔可以確保處理可能發生的異常,多個異常是用逗號分隔的。 異常處理完成之後,Exception對象會發生什麼變化? Exception對象會在下一個垃圾回收過程當中被回收掉。 什麼是不可變對象(immutable object)?Java 中怎麼建立一個不可變對象? 不可變對象指對象一旦被建立,狀態就不能再改變。任何修改都會建立一個新的對象,如 String、Integer及其它包裝類。 &和&&的區別? &運算符有兩種用法:(1)按位與;(2)邏輯與。&&運算符是短路與運算。邏輯與跟短路與的差異是很是巨大的,雖然兩者都要求運算符左右兩端的布爾值都是true整個表達式的值纔是true。&&之因此稱爲短路運算是由於,若是&&左邊的表達式的值是false,右邊的表達式會被直接短路掉,不會進行運算。不少時候咱們可能都須要用&&而不是&,例如在驗證用戶登陸時斷定用戶名不是null並且不是空字符串,應當寫爲:username != null &&!username.equals(「」),兩者的順序不能交換,更不能用&運算符,由於第一個條件若是不成立,根本不能進行字符串的equals比較,不然會產生NullPointerException異常。注意:邏輯或運算符(|)和短路或運算符(||)的差異也是如此。 咱們能將 int 強制轉換爲 byte 類型的變量嗎?若是該值大於 byte 類型的範圍,將會出現什麼現象? 是的,咱們能夠作強制轉換,可是 Java 中 int 是 32 位的,而 byte 是 8 位的,因此,若是強制轉化是,int 類型的高 24 位將會被丟棄,byte 類型的範圍是從 -128 到 128。 String和StringBuilder、StringBuffer的區別? String是隻讀字符串,也就意味着String引用的字符串內容是不能被改變的。StringBuffer/StringBuilder類表示的字符串對象能夠直接進行修改。StringBuilder是Java 5中引入的,它和StringBuffer的方法徹底相同,區別在於它是在單線程環境下使用的,由於它的全部方面都沒有被synchronized修飾,所以它的效率也比StringBuffer要高。 集合類 Collection集合接口,List、set實現Collection接口,arraylist、linkedlist,vector實現list接口,stack繼承vector,Map接口,hashtable、hashmap實現map接口 Java集合類框架的基本接口有哪些? Collection:表明一組對象,每個對象都是它的子元素。 Set:不包含重複元素的Collection。 List:有順序的collection,而且能夠包含重複元素。 Map:能夠把鍵(key)映射到值(value)的對象,鍵不能重複。 什麼是迭代器(Iterator)? Iterator接口提供了不少對集合元素進行迭代的方法。每個集合類都包含了能夠返回迭代器實例的迭代方法。迭代器能夠在迭代的過程當中刪除底層集合的元素,可是不能夠直接調用集合的remove(Object Obj)刪除,能夠經過迭代器的remove()方法刪除。 Iterator和ListIterator的區別是什麼? Iterator可用來遍歷Set和List集合,可是ListIterator只能用來遍歷List。 Iterator對集合只能是前向遍歷,ListIterator既能夠前向也能夠後向。 ListIterator實現了Iterator接口,幷包含其餘的功能,好比:增長元素,替換元素,獲取前一個和後一個元素的索引,等等。 Java中的HashMap的工做原理是什麼? Java中的HashMap是以鍵值對(key-value)的形式存儲元素的。HashMap須要一個hash函數,它使用hashCode()和equals()方法來向集合/從集合添加和檢索元素。當調用put()方法的時候,HashMap會計算key的hash值,而後把鍵值對存儲在集合中合適的索引上。若是key已經存在了,value會被更新成新值。HashMap的一些重要的特性是它的容量(capacity),負載因子(load factor)和擴容極限(threshold resizing)。 如何決定選用HashMap仍是TreeMap? 對於在Map中插入、刪除和定位元素這類操做,HashMap是最好的選擇。然而,假如你須要對一個有序的key集合進行遍歷,TreeMap是更好的選擇。基於你的collection的大小,也許向HashMap中添加元素會更快,將map換爲TreeMap進行有序key的遍歷。 HashMap,HashTable,ConcurrentHashMap的區別? a、HashMap是非線程安全的,HashTable是線程安全的。 b、HashMap的鍵和值都容許有null值存在,而HashTable則不行。 c、由於線程安全的問題,HashMap效率比HashTable的要高。 HashMap:它根據鍵的hashCode值存儲數據,大多數狀況下能夠直接定位到它的值,於是具備很快的訪問速度,但遍歷順序倒是不肯定的。 HashMap最多隻容許一條記錄的鍵爲null,容許多條記錄的值爲null。HashMap非線程安全,即任一時刻能夠有多個線程同時寫HashMap,可能會致使數據的不一致。若是須要知足線程安全,能夠用 Collections的synchronizedMap方法使HashMap具備線程安全的能力,或者使用ConcurrentHashMap。 Hashtable:Hashtable是遺留類,不少映射的經常使用功能與HashMap相似,不一樣的是它承自Dictionary類,而且是線程安全的,任一時間只有一個線程能寫Hashtable,併發性不如ConcurrentHashMap,由於ConcurrentHashMap引入了分段鎖。 極高併發下HashTable和ConcurrentHashMap哪一個性能更好,爲何,如何實現的? 答:固然是ConcurrentHashMap,由於ConcurrentHashMap引入了分段鎖,而HashTable則使用的是方法級別的鎖;所以在新版本中通常不建議使用HashTable,不須要線程安全的場合可使用HashMap,而須要線程安全的場合可使用ConcurrentHashMap; ArrayList和數組(Array)和有什麼區別?何時應該使用Array而不是ArrayList? Array能夠容納基本類型和對象,而ArrayList只能容納對象。 Array是指定大小的,而ArrayList大小是固定的。 Array沒有提供ArrayList那麼多功能,好比addAll、removeAll和iterator等。儘管ArrayList明顯是更好的選擇,但也有些時候Array比較好用。 ArrayList和LinkedList有什麼區別? 相同點:ArrayList和LinkedList都實現了List接口 不一樣點:ArrayList是基於索引的數據接口,它的底層是數組。它能夠以O(1)時間複雜度對元素進行隨機訪問。與此對應,LinkedList是以元素列表的形式存儲它的數據,每個元素都和它的前一個和後一個元素連接在一塊兒,在這種狀況下,查找某個元素的時間複雜度是O(n)。 LinkedList的插入,添加,刪除操做速度比ArrayList更快,由於當元素被添加到集合任意位置的時候,不須要像數組那樣從新計算大小或者是更新索引。 LinkedList比ArrayList更佔內存,由於LinkedList爲每個節點存儲了兩個引用,一個指向前一個元素,一個指向下一個元素。 ArrayList和Vector有何異同點? 相同點: (1)二者都是基於索引的,內部由一個數組支持。 (2)二者維護插入的順序,咱們能夠根據插入順序來獲取元素。 (3)ArrayList和Vector的迭代器實現都是fail-fast的。 (4)ArrayList和Vector二者容許null值,也可使用索引值對元素進行隨機訪問。 不一樣點: (1)Vector是同步的,而ArrayList不是。然而,若是你尋求在迭代的時候對列表進行改變,你應該使用CopyOnWriteArrayList。 (2)ArrayList比Vector快,它由於有同步,不會過載。 (3)ArrayList更加通用,由於咱們可使用Collections工具類輕易地獲取同步列表和只讀列表。 Comparable和Comparator接口是幹什麼的?列出它們的區別。 Java提供了只包含一個compareTo()方法的Comparable接口。這個方法能夠個給兩個對象排序。具體來講,它返回負數,0,正數來代表輸入對象小於,等於,大於已經存在的對象。 Java提供了包含compare()和equals()兩個方法的Comparator接口。compare()方法用來給兩個輸入參數排序,返回負數,0,正數代表第一個參數是小於,等於,大於第二個參數。equals()方法須要一個對象做爲參數,它用來決定輸入參數是否和comparator相等。只有當輸入參數也是一個comparator而且輸入參數和當前comparator的排序結果是相同的時候,這個方法才返回true。 HashSet和TreeSet有什麼區別? HashSet是由一個hash表來實現的,它的元素是無序的。TreeSet是由一個樹形的結構來實現的,它裏面的元素是有序的。 poll() 方法和 remove() 方法的區別? poll() 和 remove() 都是從隊列中取出一個元素,可是 poll() 在獲取元素失敗的時候會返回空,可是 remove() 失敗的時候會拋出異常。 Java 中的 TreeMap 是採用什麼樹實現的? Java 中的 TreeMap 是使用紅黑樹實現的。 集合框架中的泛型有什麼優勢? Java1.5引入了泛型,全部的集合接口和實現都大量地使用它。泛型容許咱們爲集合提供一個能夠容納的對象類型,所以,若是你添加其它類型的任何元素,它會在編譯時報錯。這避免了在運行時出現ClassCastException,由於你將會在編譯時獲得報錯信息。泛型也使得代碼整潔,咱們不須要使用顯式轉換和instanceOf操做符。它也給運行時帶來好處,由於不會產生類型檢查的字節碼指令。 爲什麼Map接口不繼承Collection接口? 儘管Map接口和它的實現也是集合框架的一部分,但Map不是集合,集合也不是Map。所以,Map繼承Collection毫無心義,反之亦然。 若是Map繼承Collection接口,那麼元素去哪兒?Map包含key-value對,它提供抽取key或value列表集合的方法,可是它不適合「一組對象」規範。 什麼叫對象序列化,什麼是反序列化,如何實現對象序列化? 對象序列化,將對象以二進制的形式保存在硬盤上 反序列化;將二進制的文件轉化爲對象讀取 實現serializable接口 對於 IO 流涉及的裝飾者設計模式例子以下: //把InputStreamReader裝飾成BufferedReader來成爲具有緩衝能力的Reader。 BufferedReader bufferedReader = new BufferedReader(inputStreamReader); 裝飾者模式就是給一個對象增長一些新的功能,並且是動態的,要求裝飾對象和被裝飾對象實現同一個接口,裝飾對象持有被裝飾對象的實例(各類字符流間裝飾,各類字節流間裝飾)。 對於 IO 流涉及的適配器設計模式例子以下: //把FileInputStream文件字節流適配成InputStreamReader字符流來操做文件字符串。 FileInputStream fileInput = new FileInputStream(file); InputStreamReader inputStreamReader = new InputStreamReader(fileInput); 適配器模式就是將某個類的接口轉換成咱們指望的另外一個接口表示,目的是消除因爲接口不匹配所形成的類的兼容性問題(字符流與字節流間互相適配)。 (1)單例餓漢模式://餓漢式單例類.在類初始化時,已經自行實例化 2 public class Singleton1 { 3 //私有的默認構造子 4 private Singleton1() {} 5 //已經自行實例化 6 private static final Singleton1 single = new Singleton1(); 7 //靜態工廠方法 8 public static Singleton1 getInstance() { 9 return single; 10 } 11 } (2)懶漢模式://懶漢式單例類.在第一次調用的時候實例化 2 public class Singleton2 { 3 //私有的默認構造子 4 private Singleton2() {} 5 //注意,這裏沒有final 6 private static Singleton2 single=null; 7 //靜態工廠方法 8 public synchronized static Singleton2 getInstance() { 9 if (single == null) { 10 single = new Singleton2(); 11 } 12 return single; 13 } 14 } (3)工廠模式: interface IFactory{ public IProduct createProduct();} Class Factory implements IFactory{ public IProduct createProduct(){return new Product();}} Public class client{ Public Static void main (String [] args){IFactory factory=new Factory(); IProduct product=factory.createProduct(); product.ProductMethod();}} 懶漢模式 public class Singleton { private static Singleton instance = null; private Singleton(){} public static synchronized Singleton getInstance(){ //若是尚未被實例化過,就實例化一個,而後返回 if(instance == null){ instance = new Singleton(); } return instance; } } 餓漢模式: public class Singleton { //類加載的時候instance就已經指向了一個實例 private static Singleton instance = new Singleton(); private Singleton(){} public static Singleton getInstance(){ return instance; } } 雙重檢驗鎖 public class Singleton { private static Singleton instance = null; private Singleton(){} public static Singleton getInstance(){ if(instance == null){ synchronized (Singleton.class){ if(instance == null){ instance = new Singleton(); } } } return instance; } } AOP與IOC的概念(即spring的核心)? a) IOC:Spring是開源框架,使用框架可使咱們減小工做量,提升工做效率而且它是分層結構,即相對應的層處理對應的業務邏輯,減小代碼的耦合度。而spring的核心是IOC控制反轉和AOP面向切面編程。IOC控制反轉主要強調的是程序之間的關係是由容器控制的,容器控制對象,控制了對外部資源的獲取。而反轉即爲,在傳統的編程中都是由咱們建立對象獲取依賴對象,而在IOC中是容器幫咱們建立對象並注入依賴對象,正是容器幫咱們查找和注入對象,對象是被獲取,因此叫反轉。 b) AOP:面向切面編程,主要是管理系統層的業務,好比日誌,權限,事物等。 進程和線程的區別是什麼? 進程是執行着的應用程序,而線程是進程內部的一個執行序列。一個進程能夠有多個線程。線程又叫作輕量級進程。 synchronized關鍵字的用法,優缺點: 答:java關鍵字,當它用來修飾一個方法或者代碼塊的時候,可以保證在同一時刻最多隻有一個線程執行該代碼段的代碼; synchronized修飾的方法或者對象,只能以同步的方式執行,會引發性能問題;沒法中斷一個正在等候得到鎖的線程,也沒法經過投票得到鎖;一個優先級高的線程等待一個優先級低的線程釋放鎖會致使優先級倒置,引發性能風險; Lock接口有哪些實現類,使用場景是什麼? Lock接口有三個實現類,一個是ReentrantLock,另兩個是ReentrantReadWriteLock類中的兩個靜態內部類ReadLock和WriteLock。 [第18題] 悲觀鎖、樂觀鎖的優缺點,CAS有什麼缺陷,該如何解決 悲觀鎖:老是假設最壞的狀況,每次去拿數據的時候都認爲別人會修改,因此每次拿數據的時候都會上鎖,這樣別人拿數據的時候就會阻塞知道它拿到鎖; synchronized關鍵字的實現也是悲觀鎖; 樂觀鎖:每次去拿數據的時候都認爲別人不會修改,因此不會上鎖,可是在更新的時候會判斷一下再次期間別人有沒有更新這個數據。樂觀鎖適用於多讀的應用類型,能夠提升吞吐量。 CAS:CAS是樂觀鎖技術,當多個線程嘗試使用CAS同時更新同一個變量時,只有其中一個線程能更新變量的值,而其餘線程都失敗,失敗的線程不會被掛起,而是被告知此次競爭失敗,並能夠再次嘗試; CAS的缺陷:ABA問題、循環時間長開銷大,只能保證一個共享變量的原子操做; 簡述你所知道的Linux: Linux起源於1991年,1995年流行起來的免費操做系統,目前, Linux是主流的服務器操做系統, 普遍應用於互聯網、雲計算、智能手機(Android)等領域。因爲Java主要用於服務器端的開發,所以Java應用的部署環境有不少爲Linux。 Windows操做系統的目錄結構,是以盤符爲單位,C盤、D盤、E盤等等,數據存儲在各個盤符之下,而Linux操做系統最頂層只有一個根目錄root,全部文件都存儲在這一個根目錄之下。 Linux不像Windows的圖形操做界面,是經過命令的方式進行操做,經常使用命令有: a . pwd:用於顯示當前工做目錄; b . ls:用於查看當前工做目錄內容; c . cd:用於改變當前工做目錄。 Tomcat服務器優化? a) 內存優化:主要是對Tomcat啓動參數進行優化,咱們能夠在Tomcat啓動腳本中修改它的最大內存數等等。 b) 線程數優化:Tomcat的併發鏈接參數,主要在Tomcat配置文件中server.xml中配置,好比修改最小空閒鏈接線程數,用於提升系統處理性能等等。 c) 優化緩存:打開壓縮功能,修改參數,好比壓縮的輸出內容大小默認爲2KB,能夠適當的修改。 tomcat的壓縮優化就是將返回的html頁面等內容通過壓縮,壓縮成gzip格式以後,發送給瀏覽器,瀏覽器在本地解壓縮的過程。 Spring使用了哪些設計模式? (1)工廠模式,在各類BeanFactory以及ApplicationContext建立中都用到了; (2)模板模式,也是在各類BeanFactory以及ApplicationContext建立中都用到了; (3)代理模式,在AOP實現中用到了JDK的動態代理; (4)單例模式,好比建立bean的時候; (5)策略模式,第一個地方,加載資源文件的地方,使用了不一樣的方法,好比:classPathResource,FileSystemResource,ServletContextResource,UrlResource但他們都有共同的接口Resource;第二個地方就是AOP的實現中,採用了不一樣的方式,JDK動態代理和CGLIB代理; 常見的數據庫優化手段? 庫表優化,表設計合理化,符合三大範式;添加適當的索引(普通索引、主鍵索引、惟一索引、全文索引);分庫分表;讀寫分離等;sql語句優化,定位執行效率低,慢sql的語句,經過explain分析低效率的緣由; 索引的優缺點,什麼字段上創建索引? 優勢: 第一,經過建立惟一索引能夠保證數據的惟一性; 第二,能夠大大加快數據的檢索速度,是主要目的; 第三;在使用分組和排序子句進行數據檢索時,能夠顯著減小查詢中分組和排序的時間; 第四,能夠在查詢中使用優化隱藏器,提升系統的性能; 缺點方面: 第一, 建立索引和維護索引要耗費時間,而且隨着數據量的增長而增長; 第二,每個索引須要佔用額外的物理空間,須要的磁盤開銷更大;第三,當對錶中的數據進行增長、刪除、修改操做時,索引也要動態維護,下降了數據的維護速度; 通常來講,在常常須要搜索的列上,強制該列的惟一性和組織表中數據的排列結構的列,在常常用在連接的列上,在常常須要排序的列上,在常用在where字句的列上能夠添加索引,以提高查詢速度;