一级日韩免费大片,亚洲一区二区三区高清,性欧美乱妇高清come,久久婷婷国产麻豆91天堂,亚洲av无码a片在线观看

Java中級開(kāi)發(fā)工程師知識點(diǎn)

時(shí)間:2024-06-20 02:03:16 JAVA認證 我要投稿

Java中級開(kāi)發(fā)工程師知識點(diǎn)

  根據IDC的統計數字,在所有軟件開(kāi)發(fā)類(lèi)人才的需求中,對Java程序員的需求達到全部需求量的60%~70%。同時(shí),Java程序員的薪水相對較高。yjbys小編收集了一些關(guān)于Java中級開(kāi)發(fā)工程師知識點(diǎn),希望大家認真閱讀!

Java中級開(kāi)發(fā)工程師知識點(diǎn)

  一、版本更新說(shuō)明:

  2015.03.09--------文章發(fā)布

  2015.03.11--------添加了Java IO機制中的種類(lèi)和應用場(chǎng)景的解釋?zhuān)砑恿薐ava內存模型的相關(guān)知識點(diǎn)

  2015.03.13--------文章按技術(shù)劃分,增加J2EE規范的解釋

  2015.04.25--------增加對LRU緩存設計的描述

  2015.04.26--------增加對比較流行的開(kāi)源技術(shù)和開(kāi)源框架的介紹,對于這些技術(shù)的理解或使用可以增加自己的競爭優(yōu)勢,同時(shí)擴展自己的眼界

  2015.04.27--------增加對數據庫事務(wù)的描述

  二、正文

  (一)Java

  1.接口和抽象類(lèi)的區別

 、俪橄箢(lèi)里可以有構造方法,而接口內不能有構造方法。

 、诔橄箢(lèi)中可以有普通成員變量,而接口中不能有普通成員變量。

 、鄢橄箢(lèi)中可以包含非抽象的普通方法,而接口中所有的方法必須是抽象的,不能有非抽象的普通方法。

 、艹橄箢(lèi)中的抽象方法的訪(fǎng)問(wèn)類(lèi)型可以是public ,protected和默認類(lèi)型,但接口中的抽象方法只有public和默認類(lèi)型。

 、 抽象類(lèi)中可以包含靜態(tài)方法,接口內不能包含靜態(tài)方法。

 、蕹橄箢(lèi)和接口中都可以包含靜態(tài)成員變量,抽象類(lèi)中的靜態(tài)成員變量的訪(fǎng)問(wèn)類(lèi)型可以任意,但接口中定義的變量只能是public static類(lèi)型,并且默認為public static類(lèi)型。

 、咭粋(gè)類(lèi)可以實(shí)現多個(gè)接口,但只能繼承一個(gè)抽象類(lèi)。

 、嘟涌诟嗟氖窃谙到y框架設計方法發(fā)揮作用,主要定義模塊之間的通信,而抽象類(lèi)在代碼實(shí)現方面發(fā)揮作用,可以實(shí)現代碼的重用。

  2.Java虛擬機的運行時(shí)數據區有幾塊?線(xiàn)程私有和線(xiàn)程共享區域有哪些?

 、俪绦蛴嫈灯鳎壕(xiàn)程私有,當前縣城執行的字節碼的行號指示器。

 、谔摂M機棧:線(xiàn)程私有,存放基本數據類(lèi)型、對象引用和returnAddress類(lèi)型。

 、郾镜胤椒#簽樘摂M機使用到的Native方法服務(wù)。

 、躂ava堆:線(xiàn)程共享,存放對象的實(shí)例,也是GC回收器管理的主要區域。

 、莘椒▍^:線(xiàn)程共享,存放已被虛擬機加載的類(lèi)信息、常量、靜態(tài)變量、即時(shí)編譯后的代碼等數據。

 、捱\行時(shí)常量池:方法區的一部分,存放編譯期生成的各種字面量和符號引用。

 、咧苯觾却妫翰皇翘摂M機運行時(shí)數據區的一部分,也不是Java虛擬機規范中定義的內存區域,容易引起OOM異常,NIO會(huì )調用,不受Java堆大小的限制。

  3.HashMap和HashTable區別?

 、貶ashtable是基于陳舊的Dictionary類(lèi)的,HashMap是Java 1.2引進(jìn)的Map接口的一個(gè)實(shí)現。

 、贖ashtable的方法是同步的,而HashMap的方法不是,因此HashTable是線(xiàn)程安全的,但是代碼的執行效率上要慢于HashMap。

 、跦ashMap允許空值和空鍵,但是HashTable不可以。

 、蹾ashMap非同步實(shí)現Map接口,是一個(gè)“鏈表數組”的數據結構,最大承載量是16,可以自動(dòng)變長(cháng),由Entry[]控制(key,value,next),hashCode()判斷key是否重復。

 、萁ㄗh需要做同步,使用ConcurrentHashMap,降低了鎖的粒度。在hashMap的基礎上,ConcurrentHashMap將數據分為多個(gè)segment,默認16個(gè)(concurrency level),然后每次操作對一個(gè)segment加鎖,避免多線(xiàn)程鎖得幾率,提高并發(fā)效率。這里在并發(fā)讀取時(shí),除了key對應的value為null之外,并沒(méi)有使用鎖。

  4.ArrayList和LinkedList區別?

  ArrayList基于數組實(shí)現,LinkedList基于鏈表實(shí)現,ArrayList增加和刪除比LinkedList慢,但是LinkedList在查找的時(shí)需要遞歸查找,效率比ArrayList慢。關(guān)于多線(xiàn)程方面,如果要求線(xiàn)程安全的,有一個(gè)Vector,不過(guò)比較多的使用的是CopyOnWriteArrayList替代ArrayList,CopyOnWriteArrayList適合使用在讀操作遠遠大于寫(xiě)操作的場(chǎng)景里,比如緩存。發(fā)生修改時(shí)候做copy,新老版本分離,保證讀的高性能,適用于以讀為主的情況。

  5.Set接口

 、貶ashSet是Set接口的典型實(shí)現,HashSet按hash算法來(lái)存儲元素,因此具有很好的存取和查找性能。特點(diǎn):不能保證元素的排列順序,順序有可能發(fā)生變化;HashSet是異步的;集合元素值可以是null;當向HashSet集合中存入一個(gè)元素時(shí),HashSet會(huì )調用該對象的hashCode()方法來(lái)得到該對象的hashCode值,然后根據該HashCode值來(lái)確定該對象在HashSet中存儲的位置。HashSet還有一個(gè)子類(lèi)LinkedHashSet,其集合也是根據元素hashCode值來(lái)決定元素的存儲位置,但它同時(shí)用鏈表來(lái)維護元素的次序,這樣使得元素看起來(lái)是以插入的順序保存的,也就是說(shuō),當遍歷LinkedHashSet集合元素時(shí),它將會(huì )按元素的添加順序來(lái)訪(fǎng)問(wèn)集合里的元素。所以L(fǎng)inkedHashSet的性能略低于HashSet,但在迭代訪(fǎng)問(wèn)全部元素時(shí)將有很好的性能,因為它以鏈表來(lái)維護內部順序。

 、赥reeSet是SortSet接口的唯一實(shí)現,TreeSet可以確保集合元素處于排序狀態(tài)。TreeSet不是根據元素插入順序進(jìn)行排序的,而是根據元素的值來(lái)排序的。TreeSet支持兩種排序方法:自然排序和定制排序。

 、跡numSet中所有值都必須是指定枚舉類(lèi)型的值,它的元素也是有序的,以枚舉值在枚舉類(lèi)的定義順序來(lái)決定集合元素的順序。EnumSet集合不允許加入null元素,否則會(huì )拋出NullPointerException異常。EnumSet類(lèi)沒(méi)有暴露任何構造器來(lái)創(chuàng )建該類(lèi)的實(shí)例,程序應該通過(guò)它提供的static方法來(lái)創(chuàng )建EnumSet對象。

 、芸偨Y:A、HashSet的性能比Treeset好,因為T(mén)reeSet需要額外的紅黑樹(shù)算法來(lái)維護集合元素的次序,只有當需要一個(gè)保持排序的Set時(shí),才會(huì )用TreeSet。B、EnumSet是性能最好的,但它只能保存枚舉值。

  C、它們都是線(xiàn)程不安全的。

  注:Set是一種不包含重復的元素的Collection,即任意的兩個(gè)元素e1和e2都有e1.equals(e2)=false,Set最多有一個(gè)null元素。

  關(guān)于HashSet,條目數和容量之和來(lái)講,迭代是線(xiàn)性的。因此,如果迭代性能很重要,那就應該慎重選擇一個(gè)適當的初始容量。容量選得太大,既浪費空間,也浪費時(shí)間。默認的初試容量是101,一般來(lái)講,它比你所需要的要多?梢允褂胕nt構造函數來(lái)指定初始容量。要分配HashSet的初始容量為17:

  Set s=new HashSet(17);

  HashSet另有一個(gè)稱(chēng)作裝載因數(load factor)的"調整參數(tuning parameter)"。

  區別:

  1. HashSet是通過(guò)HashMap實(shí)現的,TreeSet是通過(guò)TreeMap實(shí)現的,只不過(guò)Set用的只是Map的key。

  2. Map的key和Set都有一個(gè)共同的特性就是集合的唯一性.TreeMap更是多了一個(gè)排序的功能.

  3. hashCode和equal()是HashMap用的, 因為無(wú)需排序所以只需要關(guān)注定位和唯一性即可.

  a. hashCode是用來(lái)計算hash值的,hash值是用來(lái)確定hash表索引的.

  b. hash表中的一個(gè)索引處存放的是一張鏈表, 所以還要通過(guò)equal方法循環(huán)比較鏈上的每一個(gè)對象 才可以真正定位到鍵值對應的Entry.

  c. put時(shí),如果hash表中沒(méi)定位到,就在鏈表前加一個(gè)Entry,如果定位到了,則更換Entry中的value,并返回舊value

  4. 由于TreeMap需要排序,所以需要一個(gè)Comparator為鍵值進(jìn)行大小比較.當然也是用Comparator定位的.

  a. Comparator可以在創(chuàng )建TreeMap時(shí)指定

  b. 如果創(chuàng )建時(shí)沒(méi)有確定,那么就會(huì )使用key.compareTo()方法,這就要求key必須實(shí)現Comparable接口.

  TreeMap是使用Tree數據結構實(shí)現的,所以使用compare接口就可以完成定位了.

  6.Java中Collection和Collections的區別

 、賘ava.util.Collection 是一個(gè)集合接口,它提供了對集合對象進(jìn)行基本操作的通用接口方法。java.util.Collections 是一個(gè)包裝類(lèi)。

 、谒懈鞣N有關(guān)集合操作的靜態(tài)多態(tài)方法。此類(lèi)不能實(shí)例化,就像一個(gè)工具類(lèi),服務(wù)于Java的Collection框架。

  7.Java容器

  JAVA的容器---List,Map,Set

  Collection

  ├List

  │├LinkedList

  │├ArrayList

  │└Vector

  │ └Stack

  └Set

  Map

  ├Hashtable

  ├HashMap

  └WeakHashMap

  !其中的Vector和Stack類(lèi)現在已經(jīng)極少使用。

  8.Cookie Session區別

  具體來(lái)說(shuō)cookie機制采用的是在客戶(hù)端保持狀態(tài)的方案,而session機制采用的是在服務(wù)器端保持狀態(tài)的方案.同時(shí)我們也看到,由于采用服務(wù)器端保持狀態(tài)的方案在客戶(hù)端也需要保存一個(gè)標識,所以session機制可能需要借助于cookie機制來(lái)達到保存標識的目的,但實(shí)際上它還有其他選擇.

  cookie機制.正統的cookie分發(fā)是通過(guò)擴展HTTP協(xié)議來(lái)實(shí)現的,服務(wù)器通過(guò)在HTTP的響應頭中加上一行特殊的指示以提示瀏覽器按照指示生成相應的cookie.然而純粹的客戶(hù)端腳本如JavaScript或者VBScript也可以生成cookie.而cookie的使用是由瀏覽器按照一定的原則在后臺自動(dòng)發(fā)送給服務(wù)器的.瀏覽器檢查所有存儲的cookie,如果某個(gè)cookie所聲明的作用范圍大于等于將要請求的資源所在的位置,則把該cookie附在請求資源的HTTP請求頭上發(fā)送給服務(wù)器.

  cookie的內容主要包括:名字,值,過(guò)期時(shí)間,路徑和域.路徑與域一起構成cookie的作用范圍.若不設置過(guò)期時(shí)間,則表示這個(gè)cookie的生命期為瀏覽器會(huì )話(huà)期間,關(guān)閉瀏覽器窗口,cookie就消失.這種生命期為瀏覽器會(huì )話(huà)期的cookie被稱(chēng)為會(huì )話(huà)cookie.會(huì )話(huà)cookie一般不存儲在硬盤(pán)上而是保存在內存里,當然這種行為并不是規范規定的.若設置了過(guò)期時(shí)間,瀏覽器就會(huì )把cookie保存到硬盤(pán)上,關(guān)閉后再次打開(kāi)瀏覽器,這些cookie仍然有效直到超過(guò)設定的過(guò)期時(shí)間.存儲在硬盤(pán)上的cookie可以在不同的瀏覽器進(jìn)程間共享,比如兩個(gè)IE窗口.而對于保存在內存里的cookie,不同的瀏覽器有不同的處理方式

  session機制.session機制是一種服務(wù)器端的機制,服務(wù)器使用一種類(lèi)似于散列表的結構(也可能就是使用散列表)來(lái)保存信息.

  當程序需要為某個(gè)客戶(hù)端的請求創(chuàng )建一個(gè)session時(shí),服務(wù)器首先檢查這個(gè)客戶(hù)端的請求里是否已包含了一個(gè)session標識(稱(chēng)為session id),如果已包含則說(shuō)明以前已經(jīng)為此客戶(hù)端創(chuàng )建過(guò)session,服務(wù)器就按照session id把這個(gè)session檢索出來(lái)使用(檢索不到,會(huì )新建一個(gè)),如果客戶(hù)端請求不包含sessionid,則為此客戶(hù)端創(chuàng )建一個(gè)session并且生成一個(gè)與此session相關(guān)聯(lián)的session id,session id的值應該是一個(gè)既不會(huì )重復,又不容易被找到規律以仿造的字符串,這個(gè)session id將被在本次響應中返回給客戶(hù)端保存.

  保存這個(gè)sessionid的方式可以采用cookie,這樣在交互過(guò)程中瀏覽器可以自動(dòng)的按照規則把這個(gè)標識發(fā)揮給服務(wù)器.一般這個(gè)cookie的名字都是類(lèi)似于SEEESIONID.但cookie可以被人為的禁止,則必須有其他機制以便在cookie被禁止時(shí)仍然能夠把session id傳遞回服務(wù)器.

  經(jīng)常被使用的一種技術(shù)叫做URL重寫(xiě),就是把session id直接附加在URL路徑的后面.還有一種技術(shù)叫做表單隱藏字段.就是服務(wù)器會(huì )自動(dòng)修改表單,添加一個(gè)隱藏字段,以便在表單提交時(shí)能夠把session id傳遞回服務(wù)器.比如:實(shí)際上這種技術(shù)可以簡(jiǎn)單的用對action應用URL重寫(xiě)來(lái)代替.

  9、面向對象和面向過(guò)程的區別:

  面向過(guò)程就是分析出解決問(wèn)題所需要的步驟,然后用函數把這些步驟一步一步實(shí)現,使用的時(shí)候一個(gè)一個(gè)依次調用就可以了。

  面向對象是把構成問(wèn)題事務(wù)分解成各個(gè)對象,建立對象的目的不是為了完成一個(gè)步驟,而是為了描敘某個(gè)事物在整個(gè)解決問(wèn)題的步驟中的行為。

  10、Java內存模型

 、貸ava內存模型分為主內存和工作內存兩個(gè)部分,其中主內存存放變量,工作內存由每個(gè)線(xiàn)程創(chuàng )建和管理,保存被該線(xiàn)程使用到的變量的主內存的副本拷貝。變量從主內存復制到工作內存,順序執行read和load操作,變量從工作內存同步到主內存的時(shí)候,順序執行store和write操作。

  對于volatile變量在各個(gè)線(xiàn)程的一致性:在各個(gè)線(xiàn)程的工作內存中,volatile存在不一致的情況,但在每次使用前都會(huì )刷新,執行引擎看不到不一致的情況,因此可以認為不存在一致性問(wèn)題。

 、谠有、可見(jiàn)性和有序性

 、巯刃邪l(fā)生原則

  11、Java垃圾回收機制

  Java的垃圾回收機制是Java虛擬機提供的能力,用于在空閑時(shí)間以不定時(shí)的方式動(dòng)態(tài)回收無(wú)任何引用的對象占據的內存空間。

  System.gc();

  Runtime.getRuntime().gc();

  上面的方法調用時(shí)用于顯式通知JVM可以進(jìn)行一次垃圾回收,但真正垃圾回收機制具體在什么時(shí)間點(diǎn)開(kāi)始發(fā)生動(dòng)作這同樣是不可預料的,這和搶占式的線(xiàn)程在發(fā)生作用時(shí)的原理一樣。

  12、類(lèi)加載器,類(lèi)加載時(shí)機

  類(lèi)初始化的時(shí)機,有且僅有四個(gè):

  A、遇到new、getstatic、putstatic、invokestatic這四條字節碼指令的時(shí)候。

  B、使用java.lang.reflect進(jìn)行反射調用的時(shí)候。

  C、當初始化一個(gè)類(lèi)的時(shí)候,發(fā)現其父類(lèi)還沒(méi)有初始化,那么先去初始化它的父類(lèi)。

  D、當虛擬機啟動(dòng)的時(shí)候,需要初始化main函數所在的類(lèi)。

  13、 Java IO和NIO區別

 、貼IO操作直接緩存區,直接與OS交互,Selector IO復用機制。

  IO NIO

  面向流 面向緩沖

  阻塞IO 非阻塞IO

  無(wú) 選擇器

  Selector:Java NIO的選擇器允許一個(gè)單獨的線(xiàn)程來(lái)監視多個(gè)輸入通道,你可以注冊多個(gè)通道使用一個(gè)選擇器,然后使用一個(gè)單獨的線(xiàn)程來(lái)“選擇”通道:這些通道里已經(jīng)有可以處理的輸入,或者選擇已準備寫(xiě)入的通道。這種選擇機制,使得一個(gè)單獨的線(xiàn)程很容易來(lái)管理多個(gè)通道。

 、贜IO與Netty:A、NIO的類(lèi)庫和API復雜,使用麻煩,需要熟練使用Selector、ServerSocketChannel、SOcketChannel、ByteBuffer等。B、NIO涉及到Reactor模式,需要了解Java多線(xiàn)程和網(wǎng)絡(luò )編程。C、JDKNIO Bug-epoll bug容易導致Selector空輪詢(xún),最終導致CPU100%占用,雖然JDK1.6 update18修復了這個(gè)問(wèn)題,但是直到JDK1.7問(wèn)題依然存在,只是降低了發(fā)生的概率。

 、跱etty的優(yōu)點(diǎn):A、API簡(jiǎn)單,開(kāi)發(fā)門(mén)檻低;B、功能強大,預置了多種解碼功能,支持多種主流協(xié)議;C、可以通過(guò)ChannelHandler對通信框架進(jìn)行靈活的擴展;D、性能高,Netty的綜合性能是最好的;E、Netty修復了一經(jīng)發(fā)現了所有的JDKNIO BUG,成熟,穩定。

  同步和異步的概念描述的是用戶(hù)線(xiàn)程與內核的交互方式:同步是指用戶(hù)線(xiàn)程發(fā)起IO請求后需要等待或者輪詢(xún)內核IO操作完成后才能繼續執行;而異步是指用戶(hù)線(xiàn)程發(fā)起IO請求后仍繼續執行,當內核IO操作完成后會(huì )通知用戶(hù)線(xiàn)程,或者調用用戶(hù)線(xiàn)程注冊的回調函數。

  引申:

  Java中IO的種類(lèi)和應用場(chǎng)景:

  A、同步阻塞式:BIO。用于連接數目較小且固定的架構,對服務(wù)器資源占用高。

  B、偽異步IO變成:線(xiàn)程池和任務(wù)隊列。

  C、NIO編程:a、緩沖徐ByteBuffer;b、通道channel全雙工,同時(shí)用于讀寫(xiě);c、多路復用器selector。用于連接數目多且較短的架構,如聊天服務(wù)器等,但是編程復雜,存在epoll bug,導致Selector空輪詢(xún),直至CPU占用達到100%,雖然在JDK1.6 update18中有對這個(gè)bug的修復,但是在JDK1.7中依然可能會(huì )出現這個(gè)問(wèn)題,只是降低了bug出現的概率。

  D、AIO編程:用于連接數目多且較長(cháng)的架構,如相冊服務(wù)器等,充分調用OS參與并發(fā)操作,基于JDK1.7。

  阻塞和非阻塞的概念描述的是用戶(hù)線(xiàn)程調用內核IO操作的方式:阻塞是指IO操作需要徹底完成后才返回到用戶(hù)空間;而非阻塞是指IO操作被調用后立即返回給用戶(hù)一個(gè)狀態(tài)值,無(wú)需等到IO操作徹底完成。

  14、Java鎖機制

 、賡ynchronized:把代碼塊聲明為 synchronized,有兩個(gè)重要后果,通常是指該代碼具有 原子性和可見(jiàn)性。作用:A、當兩個(gè)并發(fā)線(xiàn)程訪(fǎng)問(wèn)同一個(gè)對象object中的這個(gè)synchronized(this)同步代碼塊時(shí),一個(gè)時(shí)間內只能有一個(gè)線(xiàn)程得到執行。另一個(gè)線(xiàn)程必須等待當前線(xiàn)程執行完這個(gè)代碼塊以后才能執行該代碼塊。B、當一個(gè)線(xiàn)程訪(fǎng)問(wèn)object的一個(gè)synchronized(this)同步代碼塊時(shí),另一個(gè)線(xiàn)程仍然可以訪(fǎng)問(wèn)該object中的非synchronized(this)同步代碼塊。C、尤其關(guān)鍵的是,當一個(gè)線(xiàn)程訪(fǎng)問(wèn)object的一個(gè)synchronized(this)同步代碼塊時(shí),其他線(xiàn)程對object中所有其它synchronized(this)同步代碼塊的訪(fǎng)問(wèn)將被阻塞。

  A、原子性:原子性意味著(zhù)個(gè)時(shí)刻,只有一個(gè)線(xiàn)程能夠執行一段代碼,這段代碼通過(guò)一個(gè)monitor object保護。從而防止多個(gè)線(xiàn)程在更新共享狀態(tài)時(shí)相互沖突。

  B、可見(jiàn)性:可見(jiàn)性則更為微妙,它要對付內存緩存和編譯器優(yōu)化的各種反常行為。它必須確保釋放鎖之前對共享數據做出的更改對于隨后獲得該鎖的另一個(gè)線(xiàn)程是可見(jiàn)的。

  C、volatile只保證可見(jiàn)性和禁止重排序,不保證原子性。

 、趕ynchronized限制:

  A.它無(wú)法中斷一個(gè)正在等候獲得鎖的線(xiàn)程;

  B.也無(wú)法通過(guò)投票得到鎖,如果不想等下去,也就沒(méi)法得到鎖;

  C.同步還要求鎖的釋放只能在與獲得鎖所在的堆棧幀相同的堆棧幀中進(jìn)行,多數情況下,這沒(méi)問(wèn)題(而且與異常處理交互得很好),但是,確實(shí)存在一些非塊結構的鎖定更合適的情況。

 、踛ava.util.concurrent.lock:

  ReentrantLock 類(lèi)實(shí)現了Lock,它擁有與synchronized 相同的并發(fā)性和內存語(yǔ)義,但是添加了類(lèi)似鎖投票、定時(shí)鎖等候和可中斷鎖等候的一些特性。此外,它還提供了在激烈爭用情況下更佳的性能。

  用sychronized修飾的方法或者語(yǔ)句塊在代碼執行完之后鎖自動(dòng)釋放,而是用Lock需要我們手動(dòng)釋放鎖,所以為了保證鎖最終被釋放(發(fā)生異常情況),要把互斥區放在try內,釋放鎖放在finally內。

 、躌eentrantWriteReadLock中的ReadLock和WWriteLock,在全為讀時(shí)實(shí)現并發(fā)讀,并發(fā)讀寫(xiě)或并發(fā)寫(xiě)時(shí)候加鎖。

  總結:synchronized是Java原語(yǔ),阻塞的,競爭鎖機制;新鎖更加面向對象,并且支持中斷和支持公平鎖。

  15、Java基本數據類(lèi)型

  boolean(1)、byte(8)、16)、short(16)、int(32)、float(32)、long(64)、double(64)

  16、Java內存模型

 、偬攸c(diǎn):原子性、可見(jiàn)性、有序性。

  A、原子性:read、load、use、store、write,synchronized關(guān)鍵字保證原子性

  B、可見(jiàn)性:synchronized、volatile、final保證可見(jiàn)性

  C、有序性:synchronized保證有序性

  17、設計模式

 、俜诸(lèi):

  創(chuàng )建型模式,共五種:工廠(chǎng)方法模式、抽象工廠(chǎng)模式、單例模式、建造者模式、原型模式。

  結構型模式,共七種:適配器模式、裝飾器模式、代理模式、外觀(guān)模式、橋接模式、組合模式、享元模式。

  行為型模式,共十一種:策略模式、模板方法模式、觀(guān)察者模式、迭代子模式、責任鏈模式、命令模式、備忘錄模式、狀態(tài)模式、訪(fǎng)問(wèn)者模式、中介者模式、解釋器模式。

  其實(shí)還有兩類(lèi):并發(fā)型模式和線(xiàn)程池模式。

 、谠O計模式6大原則:

  A、開(kāi)閉原則(Open Close Principle)

  開(kāi)閉原則就是說(shuō)對擴展開(kāi)放,對修改關(guān)閉。在程序需要進(jìn)行拓展的時(shí)候,不能去修改原有的代碼,實(shí)現一個(gè)熱插拔的效果。所以一句話(huà)概括就是:為了使程序的擴展性好,易于維護和升級。想要達到這樣的效果,我們需要使用接口和抽象類(lèi),后面的具體設計中我們會(huì )提到這點(diǎn)。

  B、里氏代換原則(Liskov Substitution Principle)

  里氏代換原則(Liskov Substitution Principle LSP)面向對象設計的基本原則之一。 里氏代換原則中說(shuō),任何基類(lèi)可以出現的地方,子類(lèi)一定可以出現。 LSP是繼承復用的基石,只有當衍生類(lèi)可以替換掉基類(lèi),軟件單位的功能不受到影響時(shí),基類(lèi)才能真正被復用,而衍生類(lèi)也能夠在基類(lèi)的基礎上增加新的行為。里氏代換原則是對“開(kāi)-閉”原則的補充。實(shí)現“開(kāi)-閉”原則的關(guān)鍵步驟就是抽象化。而基類(lèi)與子類(lèi)的繼承關(guān)系就是抽象化的具體實(shí)現,所以里氏代換原則是對實(shí)現抽象化的具體步驟的規范! From Baidu 百科

  C、依賴(lài)倒轉原則(Dependence Inversion Principle)

  這個(gè)是開(kāi)閉原則的基礎,具體內容:真對接口編程,依賴(lài)于抽象而不依賴(lài)于具體。

  D、接口隔離原則(Interface Segregation Principle)

  這個(gè)原則的意思是:使用多個(gè)隔離的接口,比使用單個(gè)接口要好。還是一個(gè)降低類(lèi)之間的耦合度的意思,從這兒我們看出,其實(shí)設計模式就是一個(gè)軟件的設計思想,從大型軟件架構出發(fā),為了升級和維護方便。所以上文中多次出現:降低依賴(lài),降低耦合。

  F、迪米特法則(最少知道原則)(Demeter Principle)

  為什么叫最少知道原則,就是說(shuō):一個(gè)實(shí)體應當盡量少的與其他實(shí)體之間發(fā)生相互作用,使得系統功能模塊相對獨立。

  F、合成復用原則(Composite Reuse Principle)

  原則是盡量使用合成/聚合的方式,而不是使用繼承。

  18、Java反射

  反射機制指的是程序在運行時(shí)能夠獲取自身的信息。

  為什么要用反射機制?直接創(chuàng )建對象不就可以了嗎,這就涉及到了動(dòng)態(tài)與靜態(tài)的概念,

  靜態(tài)編譯:在編譯時(shí)確定類(lèi)型,綁定對象,即通過(guò)。

  動(dòng)態(tài)編譯:運行時(shí)確定類(lèi)型,綁定對象。動(dòng)態(tài)編譯最大限度發(fā)揮了java的靈活性,體現了多態(tài)的應用,有以降低類(lèi)之間的藕合性。

  一句話(huà),反射機制的優(yōu)點(diǎn)就是可以實(shí)現動(dòng)態(tài)創(chuàng )建對象和編譯,體現出很大的靈活性,特別是在J2EE的開(kāi)發(fā)中

  它的靈活性就表現的十分明顯。

  作用:①首先得根據傳入的類(lèi)的全名來(lái)創(chuàng )建Class對象。 ②獲得類(lèi)方法的方法。③ 獲得類(lèi)中屬性的方法。

  缺點(diǎn):①性能第一:反射包括了一些動(dòng)態(tài)類(lèi)型,所以JVM無(wú)法對這些代碼進(jìn)行優(yōu)化。因此,反射操作的效率要比那些非反射操作低得多。我們應該避免在經(jīng)常被 執行的代碼或對性能要求很高的程序中使用反射。②安全限制:使用反射技術(shù)要求程序必須在一個(gè)沒(méi)有安全限制的環(huán)境中運行。如果一個(gè)程序必須在有安全限制的環(huán)境中運行,如Applet。③內部暴露:由于反射允許代碼執行一些在正常情況下不被允許的操作(比如訪(fǎng)問(wèn)私有的屬性和方法),所以使用反射可能會(huì )導致意料之外的副作用--代碼有功能上的錯誤,降低可移植性。反射代碼破壞了抽象性,因此當平臺發(fā)生改變的時(shí)候,代碼的行為就有可能也隨著(zhù)變化。

  19、Java引用

 、偌僭O我們在函數中寫(xiě)了如下這個(gè)簡(jiǎn)單的語(yǔ)句:

  StringBuffer str= new StringBuffer("Hello world");

  別看這個(gè)語(yǔ)句簡(jiǎn)單,其實(shí)包含了如下三個(gè)步驟:

  首先,new StringBuffer("Hello world")在堆里申請了一坨內存,把創(chuàng )建好的StringBuffer對象放進(jìn)去。其次,StringBuffer str聲明了一個(gè)指針。這個(gè)指針本身是存儲在棧上的(因為語(yǔ)句寫(xiě)在函數中),可以用來(lái)指向某個(gè)StringBuffer類(lèi)型的對象;蛘邠Q一種說(shuō)法,這個(gè)指針可以用來(lái)保存某個(gè)StringBuffer對象的地址。最后,當中這個(gè)等于號(賦值符號)把兩者關(guān)聯(lián)起來(lái),也就是把剛申請的那一坨內存的地址保存成str的值,完成引用。

 、趂inal常量的問(wèn)題

  針對引用類(lèi)型變量的final修飾符也是很多人搞混淆的地方。實(shí)際上final只是修飾指針的值(也就是限定指針保存的地址不能變)。至于該指針指向的對象,內容是否能變,那就管不著(zhù)了。所以,對于如下語(yǔ)句:

  final StringBuffer strConst = new StringBuffer();

  你可以修改它指向的對象的內容,比如:

  strConst.append(" ");

  但是不能修改它的值,比如:

  strConst = null;

 、蹅鲄⒌膯(wèn)題:

  例如:System.out.println(str);這個(gè)語(yǔ)句又是什么意思捏?這時(shí)候就兩說(shuō)了。

  第一種理解:可以認為傳進(jìn)函數的是str這個(gè)指針,指針說(shuō)白了就是一個(gè)地址的值,說(shuō)得再白一點(diǎn),就是個(gè)整數。按照這種理解,就是傳值的方式。也就是說(shuō),參數傳遞的是指針本身,所以是傳值的。

  第二種理解:可以認為傳進(jìn)去的是StringBuffer對象,按照這種理解,就是傳引用方式了。因為我們確實(shí)是把對象的地址(也就是引用)給傳了進(jìn)去。

  20、 線(xiàn)程、線(xiàn)程池:

 、賱(chuàng )建線(xiàn)程有兩種方式:繼承Thread或實(shí)現Runnable。Thread實(shí)現了Runnable接口,提供了一個(gè)空的run()方法,所以不論是繼承Thread還是實(shí)現Runnable,都要有自己的run()方法。一個(gè)線(xiàn)程創(chuàng )建后就存在,調用start()方法就開(kāi)始運行(執行run()方法),調用wait進(jìn)入等待或調用sleep進(jìn)入休眠期,順利運行完畢或休眠被中斷或運行過(guò)程中出現異常而退出。

 、趙ait和sleep比較:sleep方法有:sleep(long millis),sleep(long millis, long nanos),調用sleep方法后,當前線(xiàn)程進(jìn)入休眠期,暫停執行,但該線(xiàn)程繼續擁有監視資源的所有權。到達休眠時(shí)間后線(xiàn)程將繼續執行,直到完成。若在休眠期另一線(xiàn)程中斷該線(xiàn)程,則該線(xiàn)程退出。等待有其它的線(xiàn)程調用notify()或notifyAll()進(jìn)入調度狀態(tài),與其它線(xiàn)程共同爭奪監視。

 、劬(xiàn)程池:多線(xiàn)程技術(shù)主要解決處理器單元內多個(gè)線(xiàn)程執行的問(wèn)題,它可以顯著(zhù)減少處理器單元的閑置時(shí)間,增加處理器單元的吞吐能力。一個(gè)線(xiàn)程池包括以下四個(gè)基本組成部分:

  A、線(xiàn)程池管理器(ThreadPool):用于創(chuàng )建并管理線(xiàn)程池,包括創(chuàng )建線(xiàn)程池,銷(xiāo)毀線(xiàn)程池,添加新任務(wù);

  B、工作線(xiàn)程(PoolWorker):線(xiàn)程池中線(xiàn)程,在沒(méi)有任務(wù)時(shí)處于等待狀態(tài),可以循環(huán)的執行任務(wù);

  C、任務(wù)接口(Task):每個(gè)任務(wù)必須實(shí)現的接口,以供工作線(xiàn)程調度任務(wù)的執行,它主要規定了任務(wù)的入口,任務(wù)執行完后的收尾工作,任務(wù)的執行狀態(tài)等;

  D、任務(wù)隊列(taskQueue):用于存放沒(méi)有處理的任務(wù)。提供一種緩沖機制。

 、芫(xiàn)程池分類(lèi):

  A、newFixedThreadPool 創(chuàng )建一個(gè)指定工作線(xiàn)程數量的線(xiàn)程池。

  每當提交一個(gè)任務(wù)就創(chuàng )建一個(gè)工作線(xiàn)程,如果工作線(xiàn)程數量達到線(xiàn)程池初始的最大數,則將提交的任務(wù)存入到池隊列中。

  B、newCachedThreadPool創(chuàng )建一個(gè)可緩存的線(xiàn)程池。

  這種類(lèi)型的線(xiàn)程池特點(diǎn)是:

  1).工作線(xiàn)程的創(chuàng )建數量幾乎沒(méi)有限制(其實(shí)也有限制的,數目為Interger.MAX_VALUE), 這樣可靈活的往線(xiàn)程池中添加線(xiàn)程。

  2).如果長(cháng)時(shí)間沒(méi)有往線(xiàn)程池中提交任務(wù),即如果工作線(xiàn)程空閑了指定的時(shí)間(默認為1分鐘),則該工作線(xiàn)程將自動(dòng)終止。終止后,如果你又提交了新的任務(wù),則線(xiàn)程池重新創(chuàng )建一個(gè)工作線(xiàn)程。

  C、newSingleThreadExecutor創(chuàng )建一個(gè)單線(xiàn)程化的Executor,即只創(chuàng )建唯一的工作者線(xiàn)程來(lái)執行任務(wù),如果這個(gè)線(xiàn)程異常結束,會(huì )有另一個(gè)取代它,保證順序執行(我覺(jué)得這點(diǎn)是它的特色)。

  單工作線(xiàn)程最大的特點(diǎn)是可保證順序地執行各個(gè)任務(wù),并且在任意給定的時(shí)間不會(huì )有多個(gè)線(xiàn)程是活動(dòng)的。

  D、newScheduleThreadPool 創(chuàng )建一個(gè)定長(cháng)的線(xiàn)程池,而且支持定時(shí)的以及周期性的任務(wù)執行,類(lèi)似于Timer。

 、軪xecutors類(lèi),提供了一系列靜態(tài)工廠(chǎng)方法用于創(chuàng )先線(xiàn)程池,返回的線(xiàn)程池都實(shí)現了ExecutorService接口。

 、蘧(xiàn)程池參數:

  A、corePoolSize(線(xiàn)程池的基本大小)

  B、runnableTaskQueue(任務(wù)隊列):用于保存等待執行的任務(wù)的阻塞隊列。

  1)LinkedBlockingQueue:一個(gè)基于鏈表結構的阻塞隊列,此隊列按FIFO (先進(jìn)先出) 排序元素,吞吐量通常要高于A(yíng)rrayBlockingQueue。靜態(tài)工廠(chǎng)方法Executors.newFixedThreadPool()使用了這個(gè)隊列。

  2)SynchronousQueue:一個(gè)不存儲元素的阻塞隊列。每個(gè)插入操作必須等到另一個(gè)線(xiàn)程調用移除操作,否則插入操作一直處于阻塞狀態(tài),吞吐量通常要高于LinkedBlockingQueue,靜態(tài)工廠(chǎng)方法Executors.newCachedThreadPool使用了這個(gè)隊列。

  3)PriorityBlockingQueue:一個(gè)具有優(yōu)先級的無(wú)限阻塞隊列。

  C、maximumPoolSize(線(xiàn)程池最大大小):線(xiàn)程池允許創(chuàng )建的最大線(xiàn)程數。

  D、ThreadFactory:用于設置創(chuàng )建線(xiàn)程的工廠(chǎng),可以通過(guò)線(xiàn)程工廠(chǎng)給每個(gè)創(chuàng )建出來(lái)的線(xiàn)程設置更有意義的名字。

  E、RejectedExecutionHandler(飽和策略):當隊列和線(xiàn)程池都滿(mǎn)了,說(shuō)明線(xiàn)程池處于飽和狀態(tài),那么必須采取一種策略處理提交的新任務(wù)。這個(gè)策略默認情況下是AbortPolicy,表示無(wú)法處理新任務(wù)時(shí)拋出異常。以下是JDK1.5提供的四種策略:

  1)AbortPolicy:直接拋出異常。

  2)CallerRunsPolicy:只用調用者所在線(xiàn)程來(lái)運行任務(wù)。

  3)DiscardOldestPolicy:丟棄隊列里最近的一個(gè)任務(wù),并執行當前任務(wù)。

  4)DiscardPolicy:不處理,丟棄掉。

  5)當然也可以根據應用場(chǎng)景需要來(lái)實(shí)現RejectedExecutionHandler接口自定義策略。如記錄日志或持久化不能處理的任務(wù)。

  F、keepAliveTime(線(xiàn)程活動(dòng)保持時(shí)間):線(xiàn)程池的工作線(xiàn)程空閑后,保持存活的時(shí)間。所以如果任務(wù)很多,并且每個(gè)任務(wù)執行的時(shí)間比較短,可以調大這個(gè)時(shí)間,提高線(xiàn)程的利用率。

  G、TimeUnit(線(xiàn)程活動(dòng)保持時(shí)間的單位):可選的單位有天(DAYS),小時(shí)(HOURS),分鐘(MINUTES),毫秒(MILLISECONDS),微秒(MICROSECONDS, 千分之一毫秒)和毫微秒(NANOSECONDS, 千分之一微秒)。

  21、J2EE的13種規范

  (1)、JDBC(java Database Connectivity):

  JDBC API為訪(fǎng)問(wèn)不同的數據庫提供了一種統一的途徑,就像ODBC一樣,JDBC對開(kāi)發(fā)者屏蔽了一些細節問(wèn)題,同時(shí),JDBC對數據庫的訪(fǎng)問(wèn)也具有平臺無(wú)關(guān)性。

  (2)、JNDI(Java Name and Directory Interface):

  JNDI API 被用于執行名字和目錄服務(wù)。它提供了一致的模型用來(lái)存取和操作企業(yè)級的資源如DNS和LDAP,本地文件系統,或應用服務(wù)器中的對象。

  (3)、EJB(Enterprise JavaBean):

  J2ee技術(shù)之所以贏(yíng)得全體廣泛重視的原因之一就是EJB,他們提供了一個(gè)框架開(kāi)發(fā)和實(shí)施分布式商務(wù)邏輯,由此很顯著(zhù)簡(jiǎn)化了具有可伸縮性和高度復雜的企業(yè)級應用開(kāi)發(fā)。EJB規范定義了EJB組件何時(shí)如何與他們的容器繼續擰交互作用。容器負責提供公用的服務(wù),例如目錄服務(wù)、事務(wù)管理、安全性、資源緩沖池以及容錯性。但是注意的是,EJB并不是J2EE的唯一途徑。正是由于EJB的開(kāi)放性,使得有的廠(chǎng)商能夠以一種和EJB平行的方式來(lái)達到同樣的目的。

  (4)、RMI(RemoteMethod Invoke):remote(遙遠的) invoke(調用):

  正如其名字所表示的那樣,RMI協(xié)議調用遠程對象上方法。它使用了序列化方式在客戶(hù)端和服務(wù)器端傳遞數據。RMI是一種被EJB使用的更底層的協(xié)議。

  (5)、Java IDL(接口定義語(yǔ)言)/CORBA:公共對象請求代理結構(Common Object Request Breaker Architecture):

  在java IDL的支持下,開(kāi)發(fā)人員可以將Java和CORBA集成在一起。他們可以創(chuàng )建Java對象并使之可以在CORBA ORB中展開(kāi),或者他們還可以創(chuàng )建Java類(lèi)并做為和其他ORB一起展開(kāi)的CORBA對象客戶(hù)。后一種方法提供了另外一種途徑,通過(guò)它可以被用于你的新的應用和舊系統相集成。

  (6)、JSP(Java Server Pages):

  Jsp頁(yè)面由html代碼和嵌入其中的Java新代碼所組成。服務(wù)器在頁(yè)面被客戶(hù)端所請求以后對這些java代碼進(jìn)行處理,然后將生成的html頁(yè)面返回給客戶(hù)端的瀏覽器。

  (7)、Java Servlet:

  servlet是一種小型的java程序,它擴展了web服務(wù)器的功能。作為一種服務(wù)器端的應用,當被請求時(shí)開(kāi)始執行,這和CGI Perl腳本很相似。Servlet提供的功能大多和jsp類(lèi)似,不過(guò)實(shí)現方式不同。JSP通過(guò)大多數的html代碼中嵌入少量的java代碼,而servlet全部由java寫(xiě)成并生成相應的html。

  (8)、XML(Extensible Markup Language):

  XML是一種可以用來(lái)定義其他標記語(yǔ)言的語(yǔ)言。它被用來(lái)在不同的商務(wù)過(guò)程中共享數據。XML的發(fā)展和Java是互相獨立的,但是,它和java具有相同目標正是平臺立。通過(guò)java和xml的組合,我們可以得到一個(gè)完美的具有平臺立性的解決方案。

  (9)、JMS(Java Message Service):

  Ms是用于和面向消息的中間件相互通信的應用程序接口(API)。它既支持點(diǎn)對點(diǎn)的域,有支持發(fā)布/訂閱類(lèi)型的域,并且提供對下列類(lèi)型的支持:經(jīng)認可的消息傳遞,事務(wù)性消息傳遞,一致性消息和具有持久性的訂閱者的支持。JMS還提供了另一種方式對您的應用與舊的后臺系統相集成。

  (10)、JTA(Java Transaction Architecture):

  JTA定義了一種標準API,應用系統由此可以訪(fǎng)問(wèn)各種事務(wù)監控。

  (11)、JTS(Java Transaction Service):

  JTS是CORBA OTS事務(wù)監控的基本實(shí)現。JTS規定了事務(wù)管理器的實(shí)現方式。該事務(wù)管理器是在高層支持Java Transaction API(JTA)規范,并且在較底層實(shí)現OMG OTS specification 的java映像。JTS事務(wù)管理器為應用服務(wù)器、資源管理器、獨立的應用以及通信資源管理器提供了事務(wù)服務(wù)。

  (12)、JavaMail:

  JavaMail是用于存取郵件服務(wù)的API,它提供了一套郵件服務(wù)器的抽象類(lèi)。不僅支持SMTP服務(wù)器,也支持IMAP服務(wù)器。

  (13)、JAF(JavaBeans Activation Framework):

  JavaMail利用JAF來(lái)處理MIME編碼的郵件附件。MIME的字節流可以被轉換成java對象,或者轉換自Java對象。大多數應用都可以不需要直接使用JAF。

  22、try/catch/finally/return 作用順序

  不管有木有出現異常,finally塊中代碼都會(huì )執行;

  當try和catch中有return時(shí),finally仍然會(huì )執行;

  finally是在return后面的表達式運算后執行的(此時(shí)并沒(méi)有返回運算后的值,而是先把要返回的值保存起來(lái),管finally中的代碼怎么樣,返回的值都不會(huì )改變,任然是之前保存的值),所以函數返回值是在finally執行前確定的;

  finally中最好不要包含return,否則程序會(huì )提前退出,返回值不是try或catch中保存的返回值。

  (二)服務(wù)器

  1、web服務(wù)器nginx和apache的對比分析

 、賜ginx相對于apache的優(yōu)點(diǎn):

  輕量級,同樣起web 服務(wù),比apache 占用更少的內存及資源 ,抗并發(fā),nginx 處理請求是異步非阻塞的,而apache 則是阻塞型的,在高并發(fā)下nginx 能保持低資源低消耗高性能,高度模塊化的設計,編寫(xiě)模塊相對簡(jiǎn)單。

  apache相對于nginx 的優(yōu)點(diǎn):A.rewrite ,比nginx 的rewrite 強大;B.動(dòng)態(tài)頁(yè)面,模塊超多,基本想到的都可以找到;C.少bug ,nginx 的bug 相對較多;D.超穩定.

  一般來(lái)說(shuō),需要性能的web 服務(wù),用nginx 。如果不需要性能只求穩定,那就apache.

 、谧鳛 Web 服務(wù)器:相比 Apache,Nginx 使用更少的資源,支持更多的并發(fā)連接,體現更高的效率。Nginx采用C進(jìn)行編寫(xiě), 不論是系統資源開(kāi)銷(xiāo)還是CPU使用效率都比 Perlbal 要好很多.

 、跱ginx 配置簡(jiǎn)潔,Apache 復雜。Nginx 靜態(tài)處理性能比 Apache 高 3倍以上,Apache 對 PHP 支持比較簡(jiǎn)單,Nginx 需要配合其他后端用。Apache 的組件比 Nginx 多,現在 Nginx 才是Web 服務(wù)器的首選。

 、茏詈诵牡膮^別在于apache是同步多進(jìn)程模型,一個(gè)連接對應一個(gè)進(jìn)程;nginx是異步的,多個(gè)連接(萬(wàn)級別)可以對應一個(gè)進(jìn)程。

 、輓ginx處理靜態(tài)文件好,耗費內存少.但無(wú)疑apache仍然是目前的主流,有很多豐富的特性.所以還需要搭配著(zhù)來(lái).當然如果能確定nginx就適合需求,那么使用nginx會(huì )是更經(jīng)濟的方式。

 、辬ginx處理動(dòng)態(tài)請求是雞肋,一般動(dòng)態(tài)請求要apache去做,nginx只適合靜態(tài)和反向。

 、逳ginx優(yōu)于apache的主要兩點(diǎn):A.Nginx本身就是一個(gè)反向代理服務(wù)器 B.Nginx支持7層負載均衡;其他的當然,Nginx可能會(huì )比 apache支持更高的并發(fā)。

【Java中級開(kāi)發(fā)工程師知識點(diǎn)】相關(guān)文章:

Java中級開(kāi)發(fā)工程師知識點(diǎn)歸納09-30

Java中級開(kāi)發(fā)工程師筆試題及答案201610-04

java中級工程師面試題09-26

JAVA認證開(kāi)發(fā)工程師崗位介紹及課程大綱09-02

Java開(kāi)發(fā)web的幾種開(kāi)發(fā)模式12-13

Java知識點(diǎn)歸納08-16

Java程序開(kāi)發(fā)與運行環(huán)境06-21

java開(kāi)發(fā)必會(huì )的Linux命令10-07

Java開(kāi)發(fā)Tomcat部署項目方法10-13

JAVA認證經(jīng)驗分享:學(xué)好java開(kāi)發(fā)的關(guān)鍵七步10-18

一级日韩免费大片,亚洲一区二区三区高清,性欧美乱妇高清come,久久婷婷国产麻豆91天堂,亚洲av无码a片在线观看