java中級(jí)開(kāi)發(fā)必知

(一)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)類型可以任意精刷,但接口中定義的變量只能是public? static類型拗胜,并且默認(rèn)為public static類型。

⑦一個(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ū)域旺芽,容易引起OOM異常沪猴,NIO會(huì)調(diào)用,不受Java堆大小的限制采章。

3.HashMap和HashTable區(qū)別运嗜?

①Hashtable是基于陳舊的Dictionary類的莺治,HashMap是Java 1.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è)(concurrency

level),然后每次操作對(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í)將有很好的性能鉴吹,因?yàn)樗枣湵韥?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)該通過(guò)它提供的static方法來(lái)創(chuàng)建EnumSet對(duì)象丽旅。

④總結(jié):A、HashSet的性能比Treeset好纺棺,因?yàn)門reeSet需要額外的紅黑樹算法來(lái)維護(hù)集合元素的次序魔招,只有當(dāng)需要一個(gè)保持排序的Set時(shí),才會(huì)用TreeSet五辽。B办斑、EnumSet是性能最好的,但它只能保存枚舉值杆逗。

C乡翅、它們都是線程不安全的。

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

關(guān)于HashSet悔橄,條目數(shù)和容量之和來(lái)講靶累,迭代是線性的。因此癣疟,如果迭代性能很重要挣柬,那就應(yīng)該慎重選擇一個(gè)適當(dāng)?shù)某跏既萘俊H萘窟x得太大睛挚,既浪費(fèi)空間邪蛔,也浪費(fèi)時(shí)間。默認(rèn)的初試容量是101扎狱,一般來(lái)講侧到,它比你所需要的要多∮倩鳎可以使用int構(gòu)造函數(shù)來(lái)指定初始容量匠抗。要分配HashSet的初始容量為17:

Set s=new HashSet(17);

HashSet另有一個(gè)稱作裝載因數(shù)(load factor)的"調(diào)整參數(shù)(tuning parameter)"。

區(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用的, 因?yàn)闊o(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ì)使用key.compareTo()方法,這就要求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è)集合接口汞贸,它提供了對(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類現(xiàn)在已經(jīng)極少使用。

8.Cookie Session區(qū)別

具體來(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)頭中加上一行特殊的指示以提示瀏覽器按照指示生成相應(yīng)的cookie.然而純粹的客戶端腳本如JavaScript或者VBScript也可以生成cookie.而cookie的使用是由瀏覽器按照一定的原則在后臺(tái)自動(dòng)發(fā)送給服務(wù)器的.瀏覽器檢查所有存儲(chǔ)的cookie,如果某個(gè)cookie所聲明的作用范圍大于等于將要請(qǐng)求的資源所在的位置,則把該cookie附在請(qǐng)求資源的HTTP請(qǐng)求頭上發(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)閉后再次打開(kāi)瀏覽器,這些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è)客戶端的請(qǐng)求創(chuàng)建一個(gè)session時(shí),服務(wù)器首先檢查這個(gè)客戶端的請(qǐng)求里是否已包含了一個(gè)session標(biāo)識(shí)(稱為session

id),如果已包含則說(shuō)明以前已經(jīng)為此客戶端創(chuàng)建過(guò)session,服務(wù)器就按照session

id把這個(gè)session檢索出來(lái)使用(檢索不到,會(huì)新建一個(gè)),如果客戶端請(qǐng)求不包含sessionid,則為此客戶端創(chuàng)建一個(gè)session并且生成一個(gè)與此session相關(guān)聯(lián)的session

id,session id的值應(yīng)該是一個(gè)既不會(huì)重復(fù),又不容易被找到規(guī)律以仿造的字符串,這個(gè)session

id將被在本次響應(yīng)中返回給客戶端保存.

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

id傳遞回服務(wù)器.

經(jīng)常被使用的一種技術(shù)叫做URL重寫,就是把session

id直接附加在URL路徑的后面.還有一種技術(shù)叫做表單隱藏字段.就是服務(wù)器會(huì)自動(dòng)修改表單,添加一個(gè)隱藏字段,以便在表單提交時(shí)能夠把session

id傳遞回服務(wù)器.比如:實(shí)際上這種技術(shù)可以簡(jiǎn)單的用對(duì)action應(yīng)用URL重寫來(lái)代替.

9顷蟆、面向?qū)ο蠛兔嫦蜻^(guò)程的區(qū)別:

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

面向?qū)ο笫前褬?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)題。

②原子性成榜、可見(jiàn)性和有序性

③先行發(fā)生原則

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

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

System.gc();

Runtime.getRuntime().gc()樱溉;

上面的方法調(diào)用時(shí)用于顯式通知JVM可以進(jìn)行一次垃圾回收挣输,但真正垃圾回收機(jī)制具體在什么時(shí)間點(diǎn)開(kāi)始發(fā)生動(dòng)作這同樣是不可預(yù)料的,這和搶占式的線程在發(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)初始化一個(gè)類的時(shí)候,發(fā)現(xiàn)其父類還沒(méi)有初始化抠璃,那么先去初始化它的父類站楚。

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

13、 Java IO和NIO區(qū)別

①NIO操作直接緩存區(qū)采盒,直接與OS交互谁尸,Selector IO復(fù)用機(jī)制。

IO??????????????? NIO

面向流??????????? 面向緩沖

阻塞IO??????????? 非阻塞IO

無(wú)??????????????? 選擇器

Selector:Java

NIO的選擇器允許一個(gè)單獨(dú)的線程來(lái)監(jiān)視多個(gè)輸入通道纽甘,你可以注冊(cè)多個(gè)通道使用一個(gè)選擇器良蛮,然后使用一個(gè)單獨(dú)的線程來(lái)“選擇”通道:這些通道里已經(jīng)有可以處理的輸入,或者選擇已準(zhǔn)備寫入的通道悍赢。這種選擇機(jī)制决瞳,使得一個(gè)單獨(dú)的線程很容易來(lái)管理多個(gè)通道。

②NIO與Netty:A左权、NIO的類庫(kù)和API復(fù)雜皮胡,使用麻煩,需要熟練使用Selector赏迟、ServerSocketChannel屡贺、SOcketChannel、ByteBuffer等锌杀。B甩栈、NIO涉及到Reactor模式,需要了解Java多線程和網(wǎng)絡(luò)編程糕再。C量没、JDKNIO

Bug-epoll bug容易導(dǎo)致Selector空輪詢,最終導(dǎo)致CPU100%占用突想,雖然JDK1.6

update18修復(fù)了這個(gè)問(wèn)題殴蹄,但是直到JDK1.7問(wèn)題依然存在究抓,只是降低了發(fā)生的概率。

③Netty的優(yōu)點(diǎn):A袭灯、API簡(jiǎn)單刺下,開(kāi)發(fā)門檻低;B稽荧、功能強(qiáng)大橘茉,預(yù)置了多種解碼功能,支持多種主流協(xié)議蛤克;C捺癞、可以通過(guò)ChannelHandler對(duì)通信框架進(jìn)行靈活的擴(kuò)展;D构挤、性能高髓介,Netty的綜合性能是最好的;E筋现、Netty修復(fù)了一經(jīng)發(fā)現(xiàn)了所有的JDKNIO

BUG唐础,成熟,穩(wěn)定矾飞。

同步和異步的概念描述的是用戶線程與內(nèi)核的交互方式:同步是指用戶線程發(fā)起IO請(qǐng)求后需要等待或者輪詢內(nèi)核IO操作完成后才能繼續(xù)執(zhí)行一膨;而異步是指用戶線程發(fā)起IO請(qǐng)求后仍繼續(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ù)器等,但是編程復(fù)雜届宠,存在epoll

bug烁落,導(dǎo)致Selector空輪詢,直至CPU占用達(dá)到100%豌注,雖然在JDK1.6

update18中有對(duì)這個(gè)bug的修復(fù)伤塌,但是在JDK1.7中依然可能會(huì)出現(xiàn)這個(gè)問(wèn)題,只是降低了bug出現(xiàn)的概率轧铁。

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è)重要后果,通常是指該代碼具有

原子性和可見(jiàn)性运沦。作用: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è)monitor object保護(hù)奇唤。從而防止多個(gè)線程在更新共享狀態(tài)時(shí)相互沖突幸斥。

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

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

②synchronized限制:

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

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

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

③java.util.concurrent.lock:

ReentrantLock 類實(shí)現(xiàn)了Lock,它擁有與synchronized 相同的并發(fā)性和內(nèi)存語(yǔ)義忿檩,但是添加了類似鎖投票尉尾、定時(shí)鎖等候和可中斷鎖等候的一些特性。此外休溶,它還提供了在激烈爭(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ī)制熏挎;新鎖更加面向?qū)ο笏儆拢⑶抑С种袛嗪椭С止芥i。

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

boolean(1)烦磁、byte(8)、char(16)哼勇、short(16)都伪、int(32)、float(32)积担、long(64)陨晶、double(64)

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

①特點(diǎn):原子性帝璧、可見(jiàn)性先誉、有序性湿刽。

A、原子性:read谆膳、load叭爱、use撮躁、store漱病、write,synchronized關(guān)鍵字保證原子性

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

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

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

①分類:

創(chuàng)建型模式,共五種:工廠方法模式叙赚、抽象工廠模式老客、單例模式、建造者模式震叮、原型模式胧砰。

結(jié)構(gòu)型模式,共七種:適配器模式苇瓣、裝飾器模式尉间、代理模式、外觀模式击罪、橋接模式哲嘲、組合模式、享元模式媳禁。

行為型模式眠副,共十一種:策略模式、模板方法模式竣稽、觀察者模式囱怕、迭代子模式、責(zé)任鏈模式丧枪、命令模式光涂、備忘錄模式、狀態(tài)模式拧烦、訪問(wèn)者模式忘闻、中介者模式、解釋器模式恋博。

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

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

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

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

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

里氏代換原則(Liskov

Substitution Principle LSP)面向?qū)ο笤O(shè)計(jì)的基本原則之一署咽。

里氏代換原則中說(shuō),任何基類可以出現(xiàn)的地方生音,子類一定可以出現(xiàn)宁否。

LSP是繼承復(fù)用的基石,只有當(dāng)衍生類可以替換掉基類缀遍,軟件單位的功能不受到影響時(shí)慕匠,基類才能真正被復(fù)用,而衍生類也能夠在基類的基礎(chǔ)上增加新的行為瑟由。里氏代換原則是對(duì)“開(kāi)-閉”原則的補(bǔ)充絮重。實(shí)現(xiàn)“開(kāi)-閉”原則的關(guān)鍵步驟就是抽象化。而基類與子類的繼承關(guān)系就是抽象化的具體實(shí)現(xiàn)歹苦,所以里氏代換原則是對(duì)實(shí)現(xiàn)抽象化的具體步驟的規(guī)范青伤。——

From Baidu 百科

C殴瘦、依賴倒轉(zhuǎn)原則(Dependence Inversion Principle)

這個(gè)是開(kāi)閉原則的基礎(chǔ)狠角,具體內(nèi)容:真對(duì)接口編程,依賴于抽象而不依賴于具體蚪腋。

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

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

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

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

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

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

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的靈活性坑雅,體現(xiàn)了多態(tài)的應(yīng)用辈挂,有以降低類之間的藕合性。

一句話裹粤,反射機(jī)制的優(yōu)點(diǎn)就是可以實(shí)現(xiàn)動(dòng)態(tài)創(chuàng)建對(duì)象和編譯终蒂,體現(xiàn)出很大的靈活性,特別是在J2EE的開(kāi)發(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)該避免在經(jīng)常被

執(zhí)行的代碼或?qū)π阅芤蠛芨叩某绦蛑惺褂梅瓷洹"诎踩拗疲菏褂梅瓷浼夹g(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ā)生改變的時(shí)候藏杖,代碼的行為就有可能也隨著變化将塑。

19、Java引用

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

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

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

首先,new

StringBuffer("Hello

world")在堆里申請(qǐng)了一坨內(nèi)存来吩,把創(chuàng)建好的StringBuffer對(duì)象放進(jìn)去敢辩。其次,StringBuffer

str聲明了一個(gè)指針弟疆。這個(gè)指針本身是存儲(chǔ)在棧上的(因?yàn)檎Z(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ǔ)句:

final StringBuffer strConst = new StringBuffer()伦仍;

你可以修改它指向的對(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ù)斤讥。按照這種理解纱皆,就是傳值的方式湾趾。也就是說(shuō),參數(shù)傳遞的是指針本身派草,所以是傳值的搀缠。

第二種理解:可以認(rèn)為傳進(jìn)去的是StringBuffer對(duì)象,按照這種理解近迁,就是傳引用方式了艺普。因?yàn)槲覀兇_實(shí)是把對(duì)象的地址(也就是引用)給傳了進(jìn)去。

20鉴竭、 線程歧譬、線程池:

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

②wait和sleep比較:sleep方法有:sleep(long

millis),sleep(long millis, long

nanos)泰演,調(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ù)窒悔。提供一種緩沖機(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類格粪,提供了一系列靜態(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)挪凑,那么必須采取一種策略處理提交的新任務(wù)役衡。這個(gè)策略默認(rèn)情況下是AbortPolicy,表示無(wú)法處理新任務(wù)時(shí)拋出異常嘁捷。以下是JDK1.5提供的四種策略:

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接口自定義策略。如記錄日志或持久化不能處理的任務(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(java Database Connectivity):

JDBC API為訪問(wèn)不同的數(shù)據(jù)庫(kù)提供了一種統(tǒng)一的途徑煞抬,就像ODBC一樣霜大,JDBC對(duì)開(kāi)發(fā)者屏蔽了一些細(xì)節(jié)問(wèn)題,同時(shí)此疹,JDBC對(duì)數(shù)據(jù)庫(kù)的訪問(wèn)也具有平臺(tái)無(wú)關(guān)性僧诚。

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

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

(3)慈省、EJB(Enterprise JavaBean):

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

(4)智政、RMI(RemoteMethod Invoke):remote(遙遠(yuǎn)的) invoke(調(diào)用):

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

(5)宦搬、Java IDL(接口定義語(yǔ)言)/CORBA:公共對(duì)象請(qǐng)求代理結(jié)構(gòu)(Common Object Request Breaker Architecture):

在java

IDL的支持下,開(kāi)發(fā)人員可以將Java和CORBA集成在一起乔外。他們可以創(chuàng)建Java對(duì)象并使之可以在CORBA

ORB中展開(kāi)床三,或者他們還可以創(chuàng)建Java類并做為和其他ORB一起展開(kāi)的CORBA對(duì)象客戶。后一種方法提供了另外一種途徑杨幼,通過(guò)它可以被用于你的新的應(yīng)用和舊系統(tǒng)相集成撇簿。

(6)、JSP(Java Server Pages):

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

(7)欲逃、Java Servlet:

servlet是一種小型的java程序找蜜,它擴(kuò)展了web服務(wù)器的功能。作為一種服務(wù)器端的應(yīng)用稳析,當(dāng)被請(qǐng)求時(shí)開(kāi)始執(zhí)行洗做,這和CGI

Perl腳本很相似。Servlet提供的功能大多和jsp類似彰居,不過(guò)實(shí)現(xiàn)方式不同诚纸。JSP通過(guò)大多數(shù)的html代碼中嵌入少量的java代碼,而servlet全部由java寫成并生成相應(yīng)的html陈惰。

(8)畦徘、XML(Extensible Markup Language):

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

(9)睡榆、JMS(Java Message Service):

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

(10)馏艾、JTA(Java Transaction Architecture):

JTA定義了一種標(biāo)準(zhǔn)API劳曹,應(yīng)用系統(tǒng)由此可以訪問(wèn)各種事務(wù)監(jiān)控奴愉。

(11)、JTS(Java ?Transaction Service):

JTS是CORBA

OTS事務(wù)監(jiān)控的基本實(shí)現(xiàn)铁孵。JTS規(guī)定了事務(wù)管理器的實(shí)現(xiàn)方式锭硼。該事務(wù)管理器是在高層支持Java Transaction

API(JTA)規(guī)范,并且在較底層實(shí)現(xiàn)OMG OTS specification

的java映像蜕劝。JTS事務(wù)管理器為應(yīng)用服務(wù)器檀头、資源管理器、獨(dú)立的應(yīng)用以及通信資源管理器提供了事務(wù)服務(wù)岖沛。

(12)暑始、JavaMail:

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

(13)唉俗、JAF(JavaBeans Activation Framework):

JavaMail利用JAF來(lái)處理MIME編碼的郵件附件嗤朴。MIME的字節(jié)流可以被轉(zhuǎn)換成java對(duì)象,或者轉(zhuǎn)換自Java對(duì)象虫溜。大多數(shù)應(yīng)用都可以不需要直接使用JAF雹姊。

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

不管有木有出現(xiàn)異常吼渡,finally塊中代碼都會(huì)執(zhí)行容为;

當(dāng)try和catch中有return時(shí),finally仍然會(huì)執(zhí)行寺酪;

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

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末沮协,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子卓嫂,更是在濱河造成了極大的恐慌慷暂,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件晨雳,死亡現(xiàn)場(chǎng)離奇詭異行瑞,居然都是意外死亡奸腺,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門血久,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)突照,“玉大人,你說(shuō)我怎么就攤上這事氧吐《锬ⅲ” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵副砍,是天一觀的道長(zhǎng)衔肢。 經(jīng)常有香客問(wèn)我,道長(zhǎng)豁翎,這世上最難降的妖魔是什么角骤? 我笑而不...
    開(kāi)封第一講書人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮心剥,結(jié)果婚禮上邦尊,老公的妹妹穿的比我還像新娘。我一直安慰自己优烧,他們只是感情好蝉揍,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著畦娄,像睡著了一般又沾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上熙卡,一...
    開(kāi)封第一講書人閱讀 49,071評(píng)論 1 285
  • 那天杖刷,我揣著相機(jī)與錄音,去河邊找鬼驳癌。 笑死滑燃,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的颓鲜。 我是一名探鬼主播表窘,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼甜滨!你這毒婦竟也來(lái)了乐严?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤衣摩,失蹤者是張志新(化名)和其女友劉穎麦备,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡凛篙,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了栏渺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片呛梆。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖磕诊,靈堂內(nèi)的尸體忽然破棺而出填物,到底是詐尸還是另有隱情,我是刑警寧澤霎终,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布滞磺,位于F島的核電站,受9級(jí)特大地震影響莱褒,放射性物質(zhì)發(fā)生泄漏击困。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一广凸、第九天 我趴在偏房一處隱蔽的房頂上張望阅茶。 院中可真熱鬧,春花似錦谅海、人聲如沸脸哀。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)撞蜂。三九已至,卻和暖如春侥袜,著一層夾襖步出監(jiān)牢的瞬間蝌诡,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工系馆, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留送漠,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓由蘑,卻偏偏與公主長(zhǎng)得像闽寡,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子尼酿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 從三月份找實(shí)習(xí)到現(xiàn)在爷狈,面了一些公司,掛了不少裳擎,但最終還是拿到小米涎永、百度、阿里、京東羡微、新浪谷饿、CVTE、樂(lè)視家的研發(fā)崗...
    時(shí)芥藍(lán)閱讀 42,186評(píng)論 11 349
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法妈倔,類相關(guān)的語(yǔ)法博投,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法盯蝴,異常的語(yǔ)法毅哗,線程的語(yǔ)...
    子非魚_t_閱讀 31,582評(píng)論 18 399
  • (二)服務(wù)器 1、web服務(wù)器nginx和apache的對(duì)比分析 ①nginx相對(duì)于apache的優(yōu)點(diǎn): 輕量級(jí)捧挺,...
    SuZhen_Deng閱讀 829評(píng)論 0 7
  • 自媒體平臺(tái)大全虑绵。 1,微信公眾平臺(tái) 海量用戶闽烙,營(yíng)銷效果超好翅睛,它的公眾平臺(tái)是目前最熱的。 地址:https://mp...
    天蝎Man閱讀 9,080評(píng)論 0 13
  • 偶然看到這部電影鸣峭,看著影片名字《圓夢(mèng)巨人》宏所,覺(jué)得應(yīng)該是充滿童趣的動(dòng)畫電影,就點(diǎn)開(kāi)看了摊溶。 小女孩蘇菲從小生活在孤兒院...
    咖喱糖閱讀 441評(píng)論 2 1