Java中級(jí)開發(fā)工程師知識(shí)點(diǎn)_第1頁(yè)
Java中級(jí)開發(fā)工程師知識(shí)點(diǎn)_第2頁(yè)
Java中級(jí)開發(fā)工程師知識(shí)點(diǎn)_第3頁(yè)
Java中級(jí)開發(fā)工程師知識(shí)點(diǎn)_第4頁(yè)
Java中級(jí)開發(fā)工程師知識(shí)點(diǎn)_第5頁(yè)
已閱讀5頁(yè),還剩23頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

Word第第頁(yè)Java中級(jí)開發(fā)工程師知識(shí)點(diǎn)一、版本更新說(shuō)明:

2023.03.09文章發(fā)布

2023.03.11添加了JavaIO機(jī)制中的種類和應(yīng)用場(chǎng)景的解釋,添加了Java內(nèi)存模型的相關(guān)學(xué)問(wèn)點(diǎn)

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

2023.04.25增加對(duì)LRU緩存設(shè)計(jì)的描述

2023.04.26增加對(duì)比較流行的開源技術(shù)和開源框架的介紹,對(duì)于這些技術(shù)的理解或使用可以增加自己的競(jìng)爭(zhēng)優(yōu)勢(shì),同時(shí)擴(kuò)展自己的眼界

2023.04.27增加對(duì)數(shù)據(jù)庫(kù)事務(wù)的描述

二、正文

(一)Java

1.接口和抽象類的區(qū)分

①抽象類里可以有構(gòu)造方法,而接口內(nèi)不能有構(gòu)造方法。

②抽象類中可以有一般成員變量,而接口中不能有一般成員變量。

③抽象類中可以包含非抽象的一般方法,而接口中全部的方法必需是抽象的,不能有非抽象的一般方法。

④抽象類中的抽象方法的訪問(wèn)類型可以是public,protected和默認(rèn)類型,但接口中的抽象方法只有public和默認(rèn)類型。

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

⑥抽象類和接口中都可以包含靜態(tài)成員變量,抽象類中的靜態(tài)成員變量的訪問(wèn)類型可以任意,但接口中定義的變量只能是publicstatic類型,并且默認(rèn)為publicstatic類型。

⑦一個(gè)類可以實(shí)現(xiàn)多個(gè)接口,但只能繼承一個(gè)抽象類。

⑧接口更多的是在系統(tǒng)框架設(shè)計(jì)方法發(fā)揮作用,主要定義模塊之間的通信,而抽象類在代碼實(shí)現(xiàn)方面發(fā)揮作用,可以實(shí)現(xiàn)代碼的重用。

2.Java虛擬機(jī)的運(yùn)行時(shí)數(shù)據(jù)區(qū)有幾塊?線程私有和線程共享區(qū)域有哪些?

①程序計(jì)數(shù)器:線程私有,當(dāng)前縣城執(zhí)行的字節(jié)碼的行號(hào)指示器。

②虛擬機(jī)棧:線程私有,存放基本數(shù)據(jù)類型、對(duì)象引用和returnAddress類型。

③本地方法棧:為虛擬機(jī)使用到的Native方法服務(wù)。

④Java堆:線程共享,存放對(duì)象的實(shí)例,也是GC回收器管理的主要區(qū)域。

⑤方法區(qū):線程共享,存放已被虛擬機(jī)加載的類信息、常量、靜態(tài)變量、即時(shí)編譯后的代碼等數(shù)據(jù)。

⑥運(yùn)行時(shí)常量池:方法區(qū)的一部分,存放編譯期生成的各種字面量和符號(hào)引用。

⑦直接內(nèi)存:不是虛擬機(jī)運(yùn)行時(shí)數(shù)據(jù)區(qū)的一部分,也不是Java虛擬機(jī)規(guī)范中定義的內(nèi)存區(qū)域,簡(jiǎn)單引起OOM異樣,NIO會(huì)調(diào)用,不受Java堆大小的限制。

3.HashMap和HashTable區(qū)分?

①Hashtable是基于陳舊的Dictionary類的,HashMap是Java1.2引進(jìn)的Map接口的一個(gè)實(shí)現(xiàn)。

②Hashtable的方法是同步的,而HashMap的方法不是,因此HashTable是線程平安的,但是代碼的執(zhí)行效率上要慢于HashMap。

③HashMap允許空值和空鍵,但是HashTable不行以。

④HashMap非同步實(shí)現(xiàn)Map接口,是一個(gè)“鏈表數(shù)組”的數(shù)據(jù)結(jié)構(gòu),最大承載量是16,可以自動(dòng)變長(zhǎng),由Entry[]掌握(key,value,next),hashCode()推斷key是否重復(fù)。

⑤建議需要做同步,使用ConcurrentHashMap,降低了鎖的粒度。在hashMap的基礎(chǔ)上,ConcurrentHashMap將數(shù)據(jù)分為多個(gè)segment,默認(rèn)16個(gè)(concurrencylevel),然后每次操作對(duì)一個(gè)segment加鎖,避開多線程鎖得幾率,提高并發(fā)效率。這里在并發(fā)讀取時(shí),除了key對(duì)應(yīng)的value為null之外,并沒(méi)有使用鎖。

4.ArrayList和LinkedList區(qū)分?

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

5.Set接口

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

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

③EnumSet中全部值都必需是指定枚舉類型的值,它的元素也是有序的,以枚舉值在枚舉類的定義挨次來(lái)確定集合元素的挨次。EnumSet集合不允許加入null元素,否則會(huì)拋出NullPointerException異樣。EnumSet類沒(méi)有暴露任何構(gòu)造器來(lái)創(chuàng)建該類的實(shí)例,程序應(yīng)當(dāng)通過(guò)它供應(yīng)的static方法來(lái)創(chuàng)建EnumSet對(duì)象。

④總結(jié):A、HashSet的性能比Treeset好,由于TreeSet需要額外的紅黑樹算法來(lái)維護(hù)集合元素的次序,只有當(dāng)需要一個(gè)保持排序的Set時(shí),才會(huì)用TreeSet。B、EnumSet是性能最好的,但它只能保存枚舉值。

C、它們都是線程擔(dān)心全的。

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

關(guān)于HashSet,條目數(shù)和容量之和來(lái)講,迭代是線性的。因此,假如迭代性能很重要,那就應(yīng)當(dāng)慎重選擇一個(gè)適當(dāng)?shù)某跏既萘?。容量選得太大,既鋪張空間,也鋪張時(shí)間。默認(rèn)的初試容量是101,一般來(lái)講,它比你所需要的要多。可以使用int構(gòu)造函數(shù)來(lái)指定初始容量。要安排HashSet的初始容量為17:

Sets=newHashSet(17);

HashSet另有一個(gè)稱作裝載因數(shù)(loadfactor)的調(diào)整參數(shù)(tuningparameter)。

區(qū)分:

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

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

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

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

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

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

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

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

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

TreeMap是使用Tree數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)的,所以使用compare接口就可以完成定位了.

6.Java中Collection和Collections的區(qū)分

①java.util.Collection是一個(gè)集合接口,它供應(yīng)了對(duì)集合對(duì)象進(jìn)行基本操作的通用接口方法。java.util.Collections是一個(gè)包裝類。

②它包含有各種有關(guān)集合操作的靜態(tài)多態(tài)方法。此類不能實(shí)例化,就像一個(gè)工具類,服務(wù)于Java的Collection框架。

7.Java容器

JAVA的容器List,Map,Set

Collection

├List

│├LinkedList

│├ArrayList

│└Vector

│└Stack

└Set

Map

├Hashtable

├HashMap

└WeakHashMap

!其中的Vector和Stack類如今已經(jīng)極少使用。

8.CookieSession區(qū)分

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

cookie機(jī)制.正統(tǒng)的cookie分發(fā)是通過(guò)擴(kuò)展HTTP協(xié)議來(lái)實(shí)現(xiàn)的,服務(wù)器通過(guò)在HTTP的響應(yīng)頭中加上一行特別的指示以提示掃瞄器根據(jù)指示生成相應(yīng)的cookie.然而純粹的客戶端腳本如JavaScript或者VBScript也可以生成cookie.而cookie的使用是由掃瞄器根據(jù)肯定的原則在后臺(tái)自動(dòng)發(fā)送給服務(wù)器的.掃瞄器檢查全部存儲(chǔ)的cookie,假如某個(gè)cookie所聲明的作用范圍大于等于將要懇求的資源所在的位置,則把該cookie附在懇求資源的HTTP懇求頭上發(fā)送給服務(wù)器.

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

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

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

保存這個(gè)sessionid的方式可以采納cookie,這樣在交互過(guò)程中掃瞄器可以自動(dòng)的根據(jù)規(guī)章把這個(gè)標(biāo)識(shí)發(fā)揮給服務(wù)器.一般這個(gè)cookie的名字都是類似于SEEESIONID.但cookie可以被人為的禁止,則必需有其他機(jī)制以便在cookie被禁止時(shí)仍舊能夠把sessionid傳遞回服務(wù)器.

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

9、面對(duì)對(duì)象和面對(duì)過(guò)程的區(qū)分:

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

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

10、Java內(nèi)存模型

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

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

②原子性、可見性和有序性

③先行發(fā)生原則

11、Java垃圾回收機(jī)制

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

System.gc();

Runtime.getRuntime().gc();

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

12、類加載器,類加載時(shí)機(jī)

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

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

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

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

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

13、JavaIO和NIO區(qū)分

①NIO操作直接緩存區(qū),直接與OS交互,SelectorIO復(fù)用機(jī)制。

IONIO

面對(duì)流面對(duì)緩沖

堵塞IO非堵塞IO

無(wú)選擇器

Selector:JavaNIO的選擇器允許一個(gè)單獨(dú)的線程來(lái)監(jiān)視多個(gè)輸入通道,你可以注冊(cè)多個(gè)通道使用一個(gè)選擇器,然后使用一個(gè)單獨(dú)的線程來(lái)“選擇”通道:這些通道里已經(jīng)有可以處理的輸入,或者選擇已預(yù)備寫入的通道。這種選擇機(jī)制,使得一個(gè)單獨(dú)的線程很簡(jiǎn)單來(lái)管理多個(gè)通道。

②NIO與Netty:A、NIO的類庫(kù)和API冗雜,使用麻煩,需要嫻熟使用Selector、ServerSocketChannel、SOcketChannel、ByteBuffer等。B、NIO涉及到Reactor模式,需要了解Java多線程和網(wǎng)絡(luò)編程。C、JDKNIOBug-epollbug簡(jiǎn)單導(dǎo)致Selector空輪詢,最終導(dǎo)致CPU100%占用,雖然JDK1.6update18修復(fù)了這個(gè)問(wèn)題,但是直到JDK1.7問(wèn)題依舊存在,只是降低了發(fā)生的概率。

③Netty的優(yōu)點(diǎn):A、API簡(jiǎn)潔,開發(fā)門檻低;B、功能強(qiáng)大,預(yù)置了多種解碼功能,支持多種主流協(xié)議;C、可以通過(guò)ChannelHandler對(duì)通信框架進(jìn)行敏捷的擴(kuò)展;D、性能高,Netty的綜合性能是最好的;E、Netty修復(fù)了一經(jīng)發(fā)覺(jué)了全部的JDKNIOBUG,成熟,穩(wěn)定。

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

引申:

Java中IO的種類和應(yīng)用場(chǎng)景:

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

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

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

D、AIO編程:用于連接數(shù)目多且較長(zhǎng)的架構(gòu),如相冊(cè)服務(wù)器等,充分調(diào)用OS參加并發(fā)操作,基于JDK1.7。

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

14、Java鎖機(jī)制

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

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

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

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

②synchronized限制:

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

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

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

③java.util.concurrent.lock:

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

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

④ReentrantWriteReadLock中的ReadLock和WWriteLock,在全為讀時(shí)實(shí)現(xiàn)并發(fā)讀,并發(fā)讀寫或并發(fā)寫時(shí)候加鎖。

總結(jié):synchronized是Java原語(yǔ),堵塞的,競(jìng)爭(zhēng)鎖機(jī)制;新鎖更加面對(duì)對(duì)象,并且支持中斷和支持公正鎖。

15、Java基本數(shù)據(jù)類型

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

16、Java內(nèi)存模型

①特點(diǎn):原子性、可見性、有序性。

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

B、可見性:synchronized、volatile、final保證可見性

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

17、設(shè)計(jì)模式

①分類:

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

結(jié)構(gòu)型模式,共七種:適配器模式、裝飾器模式、代理模式、外觀模式、橋接模式、組合模式、享元模式。

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

其實(shí)還有兩類:并發(fā)型模式和線程池模式。

②設(shè)計(jì)模式6大原則:

A、開閉原則(OpenClosePrinciple)

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

B、里氏代換原則(LiskovSubstitutionPrinciple)

里氏代換原則(LiskovSubstitutionPrincipleLSP)面對(duì)對(duì)象設(shè)計(jì)的基本原則之一。里氏代換原則中說(shuō),任何基類可以消失的地方,子類肯定可以消失。LSP是繼承復(fù)用的基石,只有當(dāng)衍生類可以替換掉基類,軟件單位的功能不受到影響時(shí),基類才能真正被復(fù)用,而衍生類也能夠在基類的基礎(chǔ)上增加新的行為。里氏代換原則是對(duì)“開-閉”原則的補(bǔ)充。實(shí)現(xiàn)“開-閉”原則的關(guān)鍵步驟就是抽象化。而基類與子類的繼承關(guān)系就是抽象化的詳細(xì)實(shí)現(xiàn),所以里氏代換原則是對(duì)實(shí)現(xiàn)抽象化的詳細(xì)步驟的規(guī)范?!狥romBaidu百科

C、依靠倒轉(zhuǎn)原則(DependenceInversionPrinciple)

這個(gè)是開閉原則的基礎(chǔ),詳細(xì)內(nèi)容:真對(duì)接口編程,依靠于抽象而不依靠于詳細(xì)。

D、接口隔離原則(InterfaceSegregationPrinciple)

這個(gè)原則的意思是:使用多個(gè)隔離的接口,比使用單個(gè)接口要好。還是一個(gè)降低類之間的耦合度的意思,從這兒我們看出,其實(shí)設(shè)計(jì)模式就是一個(gè)軟件的設(shè)計(jì)思想,從大型軟件架構(gòu)動(dòng)身,為了升級(jí)和維護(hù)便利。所以上文中多次消失:降低依靠,降低耦合。

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

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

F、合成復(fù)用原則(CompositeReusePrinciple)

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

18、Java反射

反射機(jī)制指的是程序在運(yùn)行時(shí)能夠獵取自身的信息。

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

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

動(dòng)態(tài)編譯:運(yùn)行時(shí)確定類型,綁定對(duì)象。動(dòng)態(tài)編譯最大限度發(fā)揮了java的敏捷性,表達(dá)了多態(tài)的應(yīng)用,有以降低類之間的藕合性。

一句話,反射機(jī)制的優(yōu)點(diǎn)就是可以實(shí)現(xiàn)動(dòng)態(tài)創(chuàng)建對(duì)象和編譯,表達(dá)出很大的敏捷性,特殊是在J2EE的開發(fā)中

它的敏捷性就表現(xiàn)的非常明顯。

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

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

19、Java引用

①假設(shè)我們?cè)诤瘮?shù)中寫了如下這個(gè)簡(jiǎn)潔的語(yǔ)句:

StringBufferstr=newStringBuffer(Helloworld);

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

首先,newStringBuffer(Helloworld)在堆里申請(qǐng)了一坨內(nèi)存,把創(chuàng)建好的StringBuffer對(duì)象放進(jìn)去。其次,StringBufferstr聲明白一個(gè)指針。這個(gè)指針本身是存儲(chǔ)在棧上的(由于語(yǔ)句寫在函數(shù)中),可以用來(lái)指向某個(gè)StringBuffer類型的對(duì)象。或者換一種說(shuō)法,這個(gè)指針可以用來(lái)保存某個(gè)StringBuffer對(duì)象的地址。最終,當(dāng)中這個(gè)等于號(hào)(賦值符號(hào))把兩者關(guān)聯(lián)起來(lái),也就是把剛申請(qǐng)的那一坨內(nèi)存的地址保存成str的值,完成引用。

②final常量的問(wèn)題

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

finalStringBufferstrConst=newStringBuffer();

你可以修改它指向的對(duì)象的內(nèi)容,比方:

strConst.append();

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

strConst=null;

③傳參的問(wèn)題:

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

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

其次種理解:可以認(rèn)為傳進(jìn)去的是StringBuffer對(duì)象,根據(jù)這種理解,就是傳引用方式了。由于我們的確是把對(duì)象的地址(也就是引用)給傳了進(jìn)去。

20、線程、線程池:

①創(chuàng)建線程有兩種方式:繼承Thread或?qū)崿F(xiàn)Runnable。Thread實(shí)現(xiàn)了Runnable接口,供應(yīng)了一個(gè)空的run()方法,所以不管是繼承Thread還是實(shí)現(xiàn)Runnable,都要有自己的run()方法。一個(gè)線程創(chuàng)建后就存在,調(diào)用start()方法就開頭運(yùn)行(執(zhí)行run()方法),調(diào)用wait進(jìn)入等待或調(diào)用sleep進(jìn)入休眠期,順當(dāng)運(yùn)行完畢或休眠被中斷或運(yùn)行過(guò)程中消失異樣而退出。

②wait和sleep比較:sleep方法有:sleep(longmillis),sleep(longmillis,longnanos),調(diào)用sleep方法后,當(dāng)前線程進(jìn)入休眠期,暫停執(zhí)行,但該線程連續(xù)擁有監(jiān)視資源的全部權(quán)。到達(dá)休眠時(shí)間后線程將連續(xù)執(zhí)行,直到完成。若在休眠期另一線程中斷該線程,則該線程退出。等待有其它的線程調(diào)用notify()或notifyAll()進(jìn)入調(diào)度狀態(tài),與其它線程共同爭(zhēng)奪監(jiān)視。

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

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

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

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

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

④線程池分類:

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

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

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

這種類型的線程池特點(diǎn)是:

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

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

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

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

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

⑤Executors類,供應(yīng)了一系列靜態(tài)工廠方法用于創(chuàng)先線程池,返回的線程池都實(shí)現(xiàn)了ExecutorService接口。

⑥線程池參數(shù):

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

B、runnableTaskQueue(任務(wù)隊(duì)列):用于保存等待執(zhí)行的任務(wù)的堵塞隊(duì)列。

1)LinkedBlockingQueue:一個(gè)基于鏈表結(jié)構(gòu)的堵塞隊(duì)列,此隊(duì)列按FIFO(先進(jìn)先出)排序元素,吞吐量通常要高于ArrayBlockingQueue。靜態(tài)工廠方法Executors.newFixedThreadPool()使用了這個(gè)隊(duì)列。

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

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

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

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

E、RejectedExecutionHandler(飽和策略):當(dāng)隊(duì)列和線程池都滿了,說(shuō)明線程池處于飽和狀態(tài),那么必需實(shí)行一種策略處理提交的新任務(wù)。這個(gè)策略默認(rèn)狀況下是AbortPolicy,表示無(wú)法處理新任務(wù)時(shí)拋出異樣。以下是JDK1.5供應(yīng)的四種策略:

1)AbortPolicy:直接拋出異樣。

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

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

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

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

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

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

21、J2EE的13種規(guī)范

(1)、JDBC(javaDatabaseConnectivity):

JDBCAPI為訪問(wèn)不同的數(shù)據(jù)庫(kù)供應(yīng)了一種統(tǒng)一的途徑,就像ODBC一樣,JDBC對(duì)開發(fā)者屏蔽了一些詳情問(wèn)題,同時(shí),JDBC對(duì)數(shù)據(jù)庫(kù)的訪問(wèn)也具有平臺(tái)無(wú)關(guān)性。

(2)、JNDI(JavaNameandDirectoryInterface):

JNDIAPI被用于執(zhí)行名字和名目服務(wù)。它供應(yīng)了全都的模型用來(lái)存取和操作企業(yè)級(jí)的資源如DNS和LDAP,本地文件系統(tǒng),或應(yīng)用服務(wù)器中的對(duì)象。

(3)、EJB(EnterpriseJavaBean):

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

(4)、RMI(RemoteMethodInvoke):remote(遙遠(yuǎn)的)invoke(調(diào)用):

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

(5)、JavaIDL(接口定義語(yǔ)言)/CORBA:公共對(duì)象懇求代理結(jié)構(gòu)(CommonObjectRequestBreakerArchitecture):

在javaIDL的支持下,開發(fā)人員可以將Java和CORBA集成在一起。他們可以創(chuàng)建Java對(duì)象并使之可以在CORBAORB中綻開,或者他們還可以創(chuàng)建Java類并做為和其他ORB一起綻開的CORBA對(duì)象客戶。后一種方法供應(yīng)了另外一種途徑,通過(guò)它可以被用于你的新的應(yīng)用和舊系統(tǒng)相集成。

(6)、JSP(JavaServerPages):

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

(7)、JavaServlet:

servlet是一種小型的java程序,它擴(kuò)展了web服務(wù)器的功能。作為一種服務(wù)器端的應(yīng)用,當(dāng)被懇求時(shí)開頭執(zhí)行,這和CGIPerl腳本很相像。Servlet供應(yīng)的功能大多和jsp類似,不過(guò)實(shí)現(xiàn)方式不同。JSP通過(guò)大多數(shù)的html代碼中嵌入少量的java代碼,而servlet全部由java寫成并生成相應(yīng)的html。

(8)、XML(ExtensibleMarkupLanguage):

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

(9)、JMS(JavaMessageService):

Ms是用于和面對(duì)消息的中間件互相通信的應(yīng)用程序接口(API)。它既支持點(diǎn)對(duì)點(diǎn)的域,有支持發(fā)布/訂閱類型的域,并且供應(yīng)對(duì)以下類型的支持:經(jīng)認(rèn)可的消息傳遞,事務(wù)性消息傳遞,全都性消息和具有長(zhǎng)久性的訂閱者的支

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論