




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、*:單值類(lèi)型集合的三個(gè)方法:addAll():將一個(gè)集合當(dāng)中所有的元素添加到調(diào)用方法的集合當(dāng)中,注意,它不是工具類(lèi)的addAll()retainAll():求兩個(gè)集合都有的元素(交集)removeAll():從一個(gè)集合當(dāng)中刪除另一個(gè)集合的所有元素HashSet 它是 Set 接口的實(shí)現(xiàn)類(lèi) Set 接口無(wú)序 唯一1:驗(yàn)證 HashSet 無(wú)序且唯一的特點(diǎn),并且強(qiáng)調(diào)它的基本用法*: Set 集合不再提供 get(),也就是無(wú)法直接得到第幾個(gè)元素2:HashSet 所謂的唯一并不是真正的唯一,而是唯一,即便是內(nèi)存當(dāng)中完全不同的兩個(gè)對(duì)象,也有可能被視作同一個(gè)對(duì)象3:HashSet 的唯一取決于程序員如
2、何定義 hashCode()和 equals()兩個(gè)方法,通過(guò)覆蓋這兩個(gè)方法,可以讓不同的對(duì)象視作相同,同樣可以讓相同的對(duì)象視作不同4:HashSet 添加元素的完整流程其實(shí)不止兩個(gè)步驟 而是三個(gè)步驟這三個(gè)步驟分別是: hashCode()=equals()1st & (2nd | 3rd)參見(jiàn)一張圖!5:HashSet 添加元素的時(shí)候 如果認(rèn)定了新元素重復(fù),則新來(lái)的直接舍棄,不會(huì)替換原有的內(nèi)容,HashSet 先入為主,先到先得,后來(lái)的重復(fù)元素直接舍棄!6:HashSet 刪除元素只提供了 remove(Object),而且這個(gè)方法同樣也尊重 hashCode = equals的三步比較規(guī)則
3、7:使用迭代器遍歷集合的過(guò)程當(dāng)中,不能直接對(duì)集合進(jìn)行添加刪除操作,如果需求決定一定要去刪除,使用迭代器自身的 car.remove();8:使用 HashSet 千萬(wàn)不要在添加元后直接修改其參與生成哈希碼的屬性如果一定要去修改三個(gè)步驟完成a 刪除元素b 修改屬性 c重新添加回集合就用新的屬性重新鎖定位置了!9:HashSet 構(gòu)造方法的兩個(gè)參數(shù):分組組數(shù) 默認(rèn) 16float 加載因子 默認(rèn) 0.75F*: 閾值 : 達(dá)到擴(kuò)容條件的最小臨界值(元素總量哦)閾值 = ()(分組組數(shù)*加載因子);構(gòu)造方法第一個(gè)參數(shù)類(lèi)型 分組組數(shù) 默認(rèn)情況 16這個(gè)參數(shù)可以指定 但是最終結(jié)果必須是 2 的 n 次方
4、數(shù)構(gòu)造方法第二個(gè)參數(shù) float 類(lèi)型 加載因子 默認(rèn) 0.75F閾值: 達(dá)到某個(gè)條件的最小臨界值它指的是哈希表擴(kuò)容的最小元素總數(shù)閾值= 分組組數(shù)*加載因子 = 16*0.75F = 12每次擴(kuò)容的時(shí)候 元素個(gè)數(shù)*2但是請(qǐng)注意,分16 組的時(shí)候在第一小組的元素,在分32 的時(shí)候未必還應(yīng)該在第一小組,所以一旦擴(kuò)容,哈希表當(dāng)中已經(jīng)存在的所有元素需要重新散列,來(lái)確定自己應(yīng)該在的位置!作為程序員應(yīng)該盡量避免擴(kuò)容帶來(lái)的重新散列影響效率所以應(yīng)該讓 分組組數(shù)*加載因子 元素總量!如果分組組數(shù)變大 加載因子不變消耗空間 但是能夠提高效率=如果分組組數(shù)不變 加載因子變大效率變低 但是更加節(jié)省空間=*:HashS
5、et 如何調(diào)整性能和空間的取舍?=TreeSet 是 SortedSet 的實(shí)現(xiàn)類(lèi) 它要求元素有序且唯一*: 只要是 Set 不論是什么 Set 都要求唯一!1:驗(yàn)證其特點(diǎn)有序 唯一的同時(shí) 強(qiáng)調(diào)基本用法*: 雖然是有序的 Set 集合了 但是依然沒(méi)有提供 get()*: 提供了四個(gè)專(zhuān)屬的方法:() last() poll() pollLast()2:TreeSet 所謂的唯一也不是真正的唯一 也是唯一即便是內(nèi)存當(dāng)中完全不同的兩個(gè)對(duì)象 也有可能被視作相同3:想要放進(jìn) TreeSet 的類(lèi)型 必須要實(shí)現(xiàn) Comparable 接口 并且覆蓋 compareTo()這個(gè)方法返回的數(shù)有三種情況返回正數(shù)
6、: 新元素認(rèn)定更大 放在右子樹(shù)后面返回零:新元素認(rèn)定重復(fù) 直接舍棄返回負(fù)數(shù): 新元素認(rèn)定更小 放在樹(shù)前面4:如何借助多個(gè)屬性綜合形成排序規(guī)則優(yōu)先尊重哪個(gè)屬性就先描述假如哪個(gè)屬性不同5:TreeSet 的 add()和 remove()都尊重 compareTo()返回的結(jié)果應(yīng)該盡量保證 compareTo()能夠返回 0但是萬(wàn)惡的需求經(jīng)常讓 compareTo()沒(méi)法返回 0此時(shí)必須借助迭代器刪除元素 否則 set.remove()找不到要?jiǎng)h除的元素6:使用迭代器遍歷集合的過(guò)程當(dāng)中 不允許對(duì)集合整體進(jìn)行添加或者刪除操作否則會(huì)觸發(fā) ConcurrentModificationException如
7、果一定要去刪除 請(qǐng)使用迭代器提供的 car.remove();7:使用 TreeSet 千萬(wàn)不要在添加元后直接修改參與排序的屬性否則會(huì)破壞整個(gè)樹(shù)的結(jié)構(gòu) 如果一定要去修改a 刪除 b 修改 c 重新添加重新排序了8:一朝為根不代表永世為根自平衡的二叉樹(shù) 是可能進(jìn)行旋轉(zhuǎn)修復(fù)操作的.根節(jié)點(diǎn)是會(huì)變的9:TreeSet 構(gòu)造方法也可以傳參 參數(shù)是比較器對(duì)象抽象方法:publicComparatorcompare(o1,o2)*: 在無(wú)法直接修改當(dāng)前類(lèi)型的比較規(guī)則的情況下就需要脫離開(kāi)這個(gè)類(lèi)的類(lèi)體還能制定這個(gè)類(lèi)比較規(guī)則的方式- 比較器parator 的區(qū)別?首先它們都是涉及到比較的兩個(gè)接口首先它們的包結(jié)構(gòu)不
8、同parable 語(yǔ)言基礎(chǔ)包 lang 包parator 工具包 util 包其次它們的抽象方法不同Comparable=compareTo(1)Comparator=compare(1,2)最重要的它們的語(yǔ)言語(yǔ)境完全不同adj.形容詞 有能力比較的Comparablen.名詞用來(lái)比較的工具Comparator如果一個(gè)類(lèi)實(shí)現(xiàn) Comparable 接口 代表這個(gè)類(lèi)的對(duì)象自身就可以比較排序 所以能夠直接放入 TreeSet 當(dāng)中如果一個(gè)類(lèi)實(shí)現(xiàn) Comparator 接口 代表這個(gè)類(lèi)的對(duì)象是用來(lái)比較另一個(gè)類(lèi)型的對(duì)象的工具而已應(yīng)當(dāng)在創(chuàng)建TreeSet 的時(shí)候構(gòu)造方法傳參class Student i
9、mplements Comparable.;代表 Student 對(duì)象是有能力比較的 所以 Student 對(duì)象可以直接放進(jìn) TreeSet那么添加的過(guò)程中會(huì)使用它的 compareTo()方法完成排序class Student implements Comparator.;代表 Student 對(duì)象是用來(lái)比較 Teacher 對(duì)象的工具而已那么集合當(dāng)中是用來(lái)存放 Teacher 對(duì)象的!這個(gè) Student 只是為了給Teacher 完成排序它應(yīng)當(dāng)在構(gòu)造方法當(dāng)中傳給TreeSet=*: 請(qǐng)注意 Comparator 并不是 TreeSet 的專(zhuān)利哦也就是說(shuō) 即便不使用 TreeSet 也有可
10、能會(huì)使用比較器鍵值對(duì)集合 MapCollectionMapListSetSortedMapSortedSet所有 Map 通用的操作如何添加元素:map.put(k,v);一次添加另一個(gè)集合map.putAll(另一個(gè) Map);*:注意沒(méi)有 Collections.putAll();如何得到元素個(gè)數(shù)map.size();如何通過(guò)指定的主鍵得到對(duì)應(yīng)的值:V value = map.get(k);如何判斷是否包含指定的鍵:map.containsKey(k);如何判斷是否包含指定的值:map.containsValue(v);如何刪除一個(gè)鍵值對(duì)map.remove(k);分解 Map 的三個(gè)重要
11、方法:keySet() : 得到所有的主鍵對(duì)象組成的 Set 集合values() : 得到所有的值對(duì)象組成的 Collection 集合entrySet() : 得到所有鍵值對(duì)組成的 Set 集合注意鍵值對(duì)提供三個(gè)方法:getKey()getValue()setValue()#: Map 集合添加元素的時(shí)候如果認(rèn)定重復(fù)的主鍵則新來(lái)的主鍵對(duì)象直接舍棄 但是新來(lái)的值對(duì)象替換原有值對(duì)象#: 無(wú)論keySet() values() entrySet() 都不會(huì)創(chuàng)建新的集合只是將原本的 Map 換個(gè)視角展現(xiàn)給而已所以如果對(duì)得到的單值集合進(jìn)行了刪除 原本 Map 里也沒(méi)啦=Java 當(dāng)中的類(lèi)為什么要使用
12、類(lèi):類(lèi)是共享數(shù)據(jù)最最簡(jiǎn)單的方式之一Java 當(dāng)中類(lèi)的分類(lèi):類(lèi)的名字:能夠共享外部類(lèi)的哪些內(nèi)容?1.成員類(lèi)外部類(lèi)的所有靜態(tài)+非靜態(tài)成員屬性+方法如何理解成員類(lèi)與其所在的外部類(lèi)的關(guān)系:蛔蟲(chóng)和牛的關(guān)系如何創(chuàng)建對(duì)象: Outer.Inner in = new Outer().new Inner();2.靜態(tài)類(lèi)外部類(lèi)的靜態(tài)成員屬性+方法如何理解靜態(tài)類(lèi)與其所在的外部類(lèi)的關(guān)系:房客和房東的關(guān)系寄居蟹和 蜊殼如何創(chuàng)建對(duì)象: Outer.Inner in = new Outer.Inner();3.局部類(lèi)如果所在的是非靜態(tài)方法就能外部類(lèi)所有成員如果所在的是一個(gè)靜態(tài)方法就只能外部類(lèi)靜態(tài)成員還有 final 修飾的
13、局部變量 8.0 之前 8.0 開(kāi)始可以不加 final 但也不能修改如何理解局部類(lèi)和所在的外部類(lèi)的關(guān)系:學(xué)生和老師的關(guān)系如何創(chuàng)建對(duì)象: Inner in = new Inner();*:注意位置限定!必須在類(lèi)定義之后 所在方法結(jié)束之前類(lèi)4.想要學(xué)好類(lèi) 首先需要理解如下的兩個(gè)場(chǎng)景:a 如果生個(gè)孩子就是為了拿來(lái)賣(mài)錢(qián)的 那么就沒(méi)有必要起名字b 有些情況的名字根本不重要 父母的名字或者叔叔阿姨的名字才好使new 父類(lèi)/接口()完成方法覆蓋;優(yōu)勢(shì) 2 點(diǎn):第一 省掉了一個(gè)沒(méi)有意義的類(lèi)名第二 能夠讓開(kāi)發(fā)的流程自上而下 一氣=異常 = Exception = 例外程序運(yùn)行過(guò)程當(dāng)中出現(xiàn)的例外情況Java 當(dāng)
14、中所有問(wèn)題的分支(體系結(jié)構(gòu))Throwable可以?huà)伋龅腅rrorException錯(cuò)誤異常RuntimeException運(yùn)行時(shí)異常#: Error 和 Exception 的區(qū)別?Error 通常是指由于底層硬件環(huán)境或者系統(tǒng)原因?qū)е碌某绦騿T通過(guò)代碼無(wú)法解決Exception 僅僅是指運(yùn)行過(guò)程當(dāng)中出現(xiàn)了例外情況而已#: 運(yùn)行時(shí)異常和非運(yùn)行時(shí)異常的區(qū)別?運(yùn)行時(shí)異常 在編譯的時(shí)候不要求程序員給出處理方案只是運(yùn)行的時(shí)候直接將問(wèn)題體現(xiàn)出來(lái)非運(yùn)行時(shí)異常 編譯的時(shí)候如果不給處理方案編譯直接報(bào)錯(cuò) 無(wú)法通過(guò)編譯見(jiàn)過(guò)的非運(yùn)行時(shí)異常:#:IOExceptionAWTExceptionCloneNotSuppor
15、tedException見(jiàn)過(guò)的運(yùn)行時(shí)異常:#:ArithmeticException:在數(shù)學(xué)當(dāng)中 0 不能做除數(shù),在 Java 語(yǔ)言當(dāng)中 0 也不能做除數(shù),否則觸發(fā)算術(shù)異常ArithmeticException 只有類(lèi)型 0 作為除數(shù)才會(huì)觸發(fā)異常NegativeArraySizeException:當(dāng)初始化一個(gè)數(shù)組的時(shí)候,需要在當(dāng)中填寫(xiě)需要的元素個(gè)數(shù),但是語(yǔ)法檢查只會(huì)檢查當(dāng)中是否是個(gè),但是當(dāng)提供一個(gè)負(fù)數(shù)的時(shí)候,就會(huì)觸發(fā)負(fù)數(shù)數(shù)組大小異常ArrayIndexOutOfBoundsException:其實(shí)數(shù)組當(dāng)中有三個(gè)元素的時(shí)候,合法的下標(biāo)只有: 0 1 2,如果范圍的下標(biāo)值,就會(huì)觸發(fā)數(shù)組索引值超出
16、邊界異常提供負(fù)數(shù)或者超出NullPoerException:Java 當(dāng)中的類(lèi)型的變量(對(duì)象),默認(rèn)值就是 null,拿著 null 的對(duì)象調(diào)用任何方法或者任何屬性,都會(huì)觸發(fā)空指針異常StringIndexOutOfBoundsException:String 類(lèi)提供了眾多的方法,其中 substring()和 charAt()都是需要提供下標(biāo)索引值,但是如果提供的索引值根本就不在合法的范圍內(nèi),則會(huì)觸發(fā)字符串索引值超出邊界異常NumberFormatException:arse()能夠?qū)⒆址D(zhuǎn)換為對(duì)應(yīng)的數(shù),Double.parseDouble()能夠?qū)⒆址甧g轉(zhuǎn)換成對(duì)應(yīng)的 double 數(shù)
17、,但是如果提供的字符串當(dāng)中有不合法的內(nèi)容,則會(huì)出現(xiàn)數(shù)字格式異常ClassCastException:其實(shí)類(lèi)造型異常主要是因?yàn)槌绦騿T的強(qiáng)制類(lèi)型轉(zhuǎn)換,當(dāng)強(qiáng)轉(zhuǎn)的時(shí)候就會(huì)出現(xiàn) ClassCastException 類(lèi)造型異常毫無(wú)關(guān)系的兩個(gè)類(lèi)型進(jìn)行IllegalArgumentException:ArrayList 以及很多很多類(lèi)庫(kù)當(dāng)中提供的類(lèi)型,都允許傳參,但是參數(shù)如果根本就不是,一個(gè)可以作為數(shù)組大小的值,則 ArrayList 會(huì)直接拋出參數(shù)異常*:編譯器是不會(huì)報(bào)錯(cuò)的 因?yàn)?55 也是IndexOutOfBoundsException:List 集合提供 get(),允許傳入下標(biāo)索引值得到一個(gè)對(duì)象,
18、但是必須保證下標(biāo)在合法范圍內(nèi)啊!否則將會(huì)出現(xiàn) IndexOutOfBoundsExceptionIllegalSeException:當(dāng)使用迭代器的 car.remove()方法的時(shí)候,必須保證迭代器的光標(biāo)正指向一個(gè)元素,否則刪除的操作會(huì)觸發(fā)(迭代器光標(biāo))狀態(tài)異常ConcurrentModificationException:并發(fā)修改異常,多出現(xiàn)在集合邊遍歷邊刪除元素時(shí)#: 為什么要處理異常?1 如果是非運(yùn)行時(shí)異常不做處理就連編譯都無(wú)法通過(guò).2 程序運(yùn)行過(guò)程當(dāng)中一旦出現(xiàn)異常 就直接中斷執(zhí)行了#: 如何處理異常:a 拋還throws*: 它根本沒(méi)有從實(shí)質(zhì)上解決問(wèn)題就是將解決問(wèn)題的時(shí)機(jī)進(jìn)一步的延后
19、了*: 它足以解決 1 但以解決 2b 自行處理 try catch finallytry可能出現(xiàn)異常的語(yǔ)句;通常只有一句 除非需求需要跳過(guò)后面的操作;catch(要捕獲的異常的類(lèi)型 異常代號(hào))1: 隱瞞不報(bào) 啥都不寫(xiě)2: 簡(jiǎn)要的審S(chǎng)ystem.out.prln(異常代號(hào).getMessage();3: 詳細(xì)的審異常代號(hào).prStackTrace();*: 一個(gè)try 后面可以跟上多個(gè) catch但是多個(gè) catch 不能有包含的關(guān)系 必須前小后大或者并列*: JDK7.0 開(kāi)始 如果多種異常采用相同的方式處理一根棍棍!catch(NullPoerException | ArithmeticE
20、xception e).;#: throw 和 throws 的區(qū)別throws 用在方法簽名的最后 用來(lái)表達(dá)本方法當(dāng)中出現(xiàn)指定種類(lèi)的異常本方法當(dāng)中不做處理 拋還給調(diào)用者處理throw 用在方法體當(dāng)中 在沒(méi)有異常出現(xiàn)的情況下主動(dòng)制造異常出現(xiàn)的場(chǎng)景#: finally 當(dāng)中的語(yǔ)句一定會(huì)執(zhí)行嗎? 如何不讓它執(zhí)行呢?至少有兩種情況下 finally 語(yǔ)句是不會(huì)被執(zhí)行的:(1)try 語(yǔ)句沒(méi)有被執(zhí)行到,如在try 語(yǔ)句之前 return 就返回了,這樣 finally 語(yǔ)句就不會(huì)執(zhí)行。這也說(shuō)明了 finally 語(yǔ)句被執(zhí)行的必要而非充分條件是:相應(yīng)的 try 語(yǔ)句一定被執(zhí)行到。(2)在 try 塊|c
21、atch 塊中有 System.exit(0);這樣的語(yǔ)句。System.exit(0)是終止 Java 虛擬機(jī) JVM 的,連 JVM 都停止了,所有都結(jié)束了,當(dāng)然 finally 語(yǔ)句也不會(huì)被執(zhí)行到。=1st.一個(gè)必須要使用靜態(tài)初始化塊的場(chǎng)景!類(lèi)體當(dāng)中的靜態(tài)變量,如果是調(diào)用有異常的方法來(lái)完成賦值的,那么類(lèi)體當(dāng)中沒(méi)法直接 try catch,也不可能在類(lèi)上加 throws,必須使用靜態(tài)初始化塊,因?yàn)槌跏蓟瘔K當(dāng)中可以寫(xiě)語(yǔ)句,自然可以 try catch2nd.父類(lèi)當(dāng)中的方法如果沒(méi)有拋任何異常子類(lèi)的方法去覆蓋這個(gè)方法的時(shí)候可以?huà)伄惓?可以?huà)仧o(wú)數(shù)種運(yùn)行時(shí)異常,但是這沒(méi)有任何意義,其實(shí) Java
22、當(dāng)中每個(gè)方法都默認(rèn)拋出所有 RuntimeException3rd.連環(huán) try為了保證連續(xù)的多行語(yǔ)句無(wú)論是否出現(xiàn)異常,之后語(yǔ)句都能正常執(zhí)行,須學(xué)會(huì),在 finally 當(dāng)中嵌套使用 try catch,這樣會(huì)讓代碼格式非常語(yǔ)句,但是卻能保證一定執(zhí)行所有*: IO 流 JDBC 都需要使用這種方式 (如果不使用 TWR)4th.如果某個(gè)變量是使用有異常的方法完成賦值的,為了保證在 try 之后變量還能正常使用,必須將這個(gè)變量的定義拿到 try 之前,并且給它默認(rèn)值賦值(所有類(lèi)型默認(rèn)值 null)*: IO 流 JDBC 都需要使用這種方式5th.學(xué)會(huì)使用 try catch 代替標(biāo)準(zhǔn)的分支判斷
23、有些情況下 使用異常處理機(jī)制來(lái)完成分支 更加簡(jiǎn)便=線(xiàn)程程序:保存在物理介質(zhì)中的代碼片段進(jìn)程:一旦程序運(yùn)行起來(lái),就變成操作系統(tǒng)當(dāng)中的一個(gè)進(jìn)程,而 windows 是多任務(wù)多用戶(hù)的操作系統(tǒng),所以同時(shí)能運(yùn)行多個(gè)進(jìn)程時(shí)間片!宏觀(guān)并行 而 微觀(guān)串行線(xiàn)程: 一個(gè)程序當(dāng)中一條獨(dú)立的執(zhí)行線(xiàn)索稱(chēng)作一個(gè)線(xiàn)程,一個(gè)程序也可以兵分多路線(xiàn)程的五大狀態(tài)= 線(xiàn)程的生命周期新生就緒運(yùn)行消亡BornRunnable RunningDead阻塞Blocking如何創(chuàng)建線(xiàn)程:1.extends ThreadOverridepublic void run()部署線(xiàn)程計(jì)劃;2.implements RunnableOverridepu
24、blic void run()部署線(xiàn)程計(jì)劃;3.金針菇(see you tomorrow)#: 請(qǐng)使用兩種不同的方式創(chuàng)建兩個(gè)線(xiàn)程 并且啟動(dòng)它們線(xiàn)程 1 打印 1-26extends Thread線(xiàn)程 2 打印 a-zimplements Runnable如何控制線(xiàn)程!0. setPriority() : 設(shè)置線(xiàn)程優(yōu)先級(jí)別 可選范圍 1-10 默認(rèn) 5*: 優(yōu)先級(jí)越高代表?yè)尩綍r(shí)間片的概率越高不使用.什么都保證不了*:1. sic sleep(long) : 讓當(dāng)前線(xiàn)程休眠指定的毫秒數(shù)2. sic yield() : 讓當(dāng)前線(xiàn)程放棄已經(jīng)持有的時(shí)間片 直接返回就緒*: 中文版的文檔當(dāng)中這個(gè)方法的描述
25、是錯(cuò)的3. join() : 讓當(dāng)前線(xiàn)程邀請(qǐng)另一個(gè)線(xiàn)程優(yōu)先執(zhí)行在被邀請(qǐng)的線(xiàn)程執(zhí)行結(jié)束之前邀請(qǐng)別人的線(xiàn)程一直處于阻塞不再執(zhí)行*: 請(qǐng)注意線(xiàn)程章節(jié)所有的靜態(tài)方法 不要關(guān)注誰(shuí)調(diào)用方法誰(shuí)調(diào)用方法都等價(jià)于類(lèi)名.方法要關(guān)注調(diào)用的語(yǔ)句出現(xiàn)在誰(shuí)的線(xiàn)程體別看誰(shuí)點(diǎn)的 看寫(xiě)在誰(shuí)里面*: 線(xiàn)程章節(jié)所有涉及到主動(dòng)進(jìn)入阻塞狀態(tài)的方法都必須進(jìn)行異常處理線(xiàn)程類(lèi)其他常用的方法:setName() + getName() : 用于設(shè)置和得到線(xiàn)程的名字*: 在 Thread 類(lèi)當(dāng)中有一個(gè) String name 屬性可以給線(xiàn)程起名字 但是屬性是私有的只能用公共的 getter 和 setteric activeCount() :
26、得到程序當(dāng)中所有活躍線(xiàn)程的總數(shù)s活躍線(xiàn)程 = 就緒 + 運(yùn)行 + 阻塞*:一個(gè)靜態(tài)方法是不能得到調(diào)用方法的那個(gè)對(duì)象的* :ic currentThread() : 得到正在運(yùn)行的線(xiàn)程對(duì)象 = 當(dāng)前線(xiàn)程s1.在主方法當(dāng)中用于得到主線(xiàn)程的線(xiàn)程對(duì)象!2.在 run()調(diào)用的其它方法中 用這個(gè)方法得到線(xiàn)程對(duì)象X.這個(gè)方法不會(huì)出現(xiàn)在 run()當(dāng)中 得到的結(jié)果等價(jià)于 this在主方法當(dāng)中很輕松的能夠得到任何一個(gè)線(xiàn)程對(duì)象 例如 et因?yàn)榫驮谥骶€(xiàn)程當(dāng)中創(chuàng)建的它們啊但是一旦需要得到主線(xiàn)程對(duì)象呢?-_-|主線(xiàn)程根本就不是自己創(chuàng)建的.只好借助currentThread()setDaemon(true) : 設(shè)置線(xiàn)
27、程成為守護(hù)線(xiàn)程*: 首先線(xiàn)程的存在是給其它線(xiàn)程提供服務(wù)的,當(dāng)程序當(dāng)中只有守護(hù)線(xiàn)程的時(shí)候,守護(hù)線(xiàn)程自行結(jié)束*: gc 是個(gè)系統(tǒng)級(jí)別的守護(hù)線(xiàn)程errupt() : 中斷打斷線(xiàn)程的阻塞狀態(tài)*: sleep() join() 都能讓線(xiàn)程阻塞大家使用傳參完成數(shù)據(jù)共享的時(shí)候務(wù)必注意,誰(shuí)告訴你傳參只能通過(guò)構(gòu)造方法了?!給屬性賦值的王道不是構(gòu)造方法 而是 setter多線(xiàn)程共享數(shù)據(jù)導(dǎo)致的并發(fā)錯(cuò)誤*為什么會(huì)出現(xiàn)并發(fā)錯(cuò)誤?根本原因:多個(gè)線(xiàn)程共享同一個(gè)對(duì)象直接原因:線(xiàn)程體當(dāng)中相鄰的兩行 未必能夠連續(xù)執(zhí)行導(dǎo)火線(xiàn):時(shí)間片突然耗盡如何解決并發(fā)錯(cuò)誤?臨界資源: 多個(gè)線(xiàn)程共享的數(shù)據(jù) 被稱(chēng)作臨界資源鎖標(biāo)記: 互斥鎖 互斥鎖標(biāo)記
28、 鎖旗標(biāo) 監(jiān)視器 Monitor1st.synchronized 修飾符修飾代碼塊:synchronized(臨界資源)需要連續(xù)執(zhí)行的操作 1;需要連續(xù)執(zhí)行的操作 2;修飾方法:public synchronized void add(Object obj).;等價(jià)于從方法第一行到最后一行全部加鎖而且是對(duì)調(diào)用方法的對(duì)象(this)加鎖public void add(Object obj)synchronized(this).;*: StringBuffer StringBuilderVector ArrayListHashtable HashMap在提到他們的區(qū)別的時(shí)候線(xiàn)程同步特性不同 因?yàn)?
29、StringBuffer Vector Hashtable底層大量的使用了 synchronized 修飾方法*: synchronized 是一個(gè)很奇特的修飾符synchronized 特性不能被子類(lèi)繼承*: 單例模式的懶漢式需要使用 synchronized 修飾確保不會(huì)得到多個(gè)不同的實(shí)例2nd.java.util.concurrent.locks.ReentrantLockJDK5.0- Doug LeaJava 包的工具包的并發(fā)包的鎖包的可重入鎖ReentrantLock -lock();unlock();上鎖鎖互斥鎖標(biāo)記使用過(guò)多或者使用不當(dāng)就會(huì)導(dǎo)致一個(gè)線(xiàn)程持有另一個(gè)線(xiàn)程想要得到的資源
30、不釋放的情況下,又去申請(qǐng)另一個(gè)線(xiàn)程已經(jīng)持有的資源,從而雙雙進(jìn)入對(duì)方資源的鎖池當(dāng)中,產(chǎn)生的阻塞- 死鎖 DeadLock1st.科學(xué)家事件2nd.泉城路奔寶事件3rd.AABB 事件如何解決死鎖:涉及到一塊空間和三個(gè)方法等待池+wait()notify()notifyAll()等待放那些為了成全其它線(xiàn)程而主動(dòng)掉自己已經(jīng)持有的鎖標(biāo)記的那些線(xiàn)程的wait():讓當(dāng)前線(xiàn)程放棄已經(jīng)持有的鎖標(biāo)記并且進(jìn)入調(diào)用方法的那個(gè)對(duì)象的等待池當(dāng)中*:Benz 線(xiàn)程體當(dāng)中出現(xiàn) east.wait();代表奔馳放棄 east 鎖標(biāo)記并且進(jìn)入 east 的等待池當(dāng)中notify():從調(diào)用方法的那個(gè)對(duì)象的等待池當(dāng)中隨機(jī)的喚醒
31、一個(gè)線(xiàn)程notifyAll():從調(diào)用方法的那個(gè)對(duì)象的等待池當(dāng)中喚醒所有線(xiàn)程*: 注意這三個(gè)方法都必須在已經(jīng)持有鎖標(biāo)記的情況下才能使用,也就是說(shuō)如果abc.wait()或者 abc.notify(),就必須先拿到 abc 對(duì)象的鎖標(biāo)記,否則無(wú)法操作成功,也就是說(shuō)abc.wait()或者 abc.notify()必然出現(xiàn)在 synchronized(abc).鎖池 & 等待池 的區(qū)別?鎖池和等待池都是 Java 當(dāng)中每個(gè)對(duì)象都有一份的空間,用于存放線(xiàn)程的鎖的是:想要拿到對(duì)象鎖標(biāo)記而沒(méi)有成功的線(xiàn)程等待的是:已經(jīng)拿到鎖標(biāo)記然而為了成全其它線(xiàn)程又主動(dòng)放棄的線(xiàn)程1.進(jìn)入的時(shí)候是否會(huì)資源鎖池不會(huì)資源 所以
32、才會(huì)形成死鎖等待池需要資源才能進(jìn)入2.離開(kāi)的時(shí)候是否需要調(diào)用方法鎖池不需要 一旦鎖標(biāo)記再度可用 線(xiàn)程自動(dòng)離開(kāi)等待池必須有其它線(xiàn)程 notify()或者 notifyAll()3.離開(kāi)之后去往哪了離開(kāi)鎖池之后線(xiàn)程直接返回就緒離開(kāi)等待池之后線(xiàn)程將直接前往鎖池線(xiàn)程池 = 提前預(yù)留活躍資源的資源池假如一個(gè)線(xiàn)程的完整執(zhí)行時(shí)間為 T總共執(zhí)行時(shí)間由三部分組成T = t1 + t2 + t3t1 : 創(chuàng)建一個(gè)線(xiàn)程所消耗的時(shí)間t2 : 線(xiàn)程的邏輯的執(zhí)行時(shí)間run()t3 : 銷(xiāo)毀一個(gè)線(xiàn)程所消耗的時(shí)間那么如果 run()當(dāng)中的代碼非常簡(jiǎn)練 則 t2 所占 T 比例就會(huì)很小那么 t1 和 t3 就顯得喧賓奪主 主次
33、不分已知 Vector 類(lèi)的 add()和 remove()都是 synchronized 修飾的現(xiàn)在有兩個(gè)線(xiàn)程 t1 和t2 以及一個(gè) Vector 對(duì)象 名叫 v在 t1 線(xiàn)程調(diào)用 v 對(duì)象的 add() 方法開(kāi)始執(zhí)行了 但是還沒(méi)執(zhí)行結(jié)束呢時(shí)間片就耗盡了 此時(shí) t2 線(xiàn)程搶到了時(shí)間片問(wèn):t2 線(xiàn)程能不能調(diào)用 v 對(duì)象的 add()?falset2 線(xiàn)程能不能調(diào)用 v 對(duì)象的remove()?false已知 Vector 類(lèi)的 add()和 remove()都是 synchronized 修飾的現(xiàn)在有兩個(gè)線(xiàn)程 t1 和t2 以及兩個(gè) Vector 對(duì)象 名叫 v1 和 v2在 t1 線(xiàn)程調(diào)用
34、 v1 對(duì)象的 add() 方法開(kāi)始執(zhí)行了 但是還沒(méi)執(zhí)行結(jié)束呢時(shí)間片就耗盡了 此時(shí) t2 線(xiàn)程搶到了時(shí)間片問(wèn):t2 線(xiàn)程能不能調(diào)用 v1 對(duì)象的 add()?falset2 線(xiàn)程能不能調(diào)用 v1 對(duì)象的 remove()?falset2 線(xiàn)程能不能調(diào)用 v2 對(duì)象的 add()?truet2 線(xiàn)程能不能調(diào)用 v2 對(duì)象的 remove()?true三種線(xiàn)程池:可重用的Executors.newFixedThreool();緩存機(jī)制的Executors.newCachedThreool();Executors.newSingleThreadExecutor();單一實(shí)例的class Moonpr
35、ivate Moon()private sic Moon only;/懶漢式public sic synchronized Moon getOnly()if(only = null)only = new Moon();return only;clasnprivate Sun()private sic Sun only = new Sun();/醉漢式public sic Sun getOnly()return only;第三種創(chuàng)建線(xiàn)程的方法class ThreadThree implements Callable它修正了 run 方法的兩個(gè)之處:1st.run 被定義為 void 方法所以執(zhí)行
36、后不能返回?cái)?shù)據(jù)2nd.run 根本沒(méi)有 throws迫try catchOverridepublic String call()throws Exceptionfor(i = 0;i 路徑分界符的使用/ 兼容 windows 和 unix windows 的專(zhuān)屬Sun 在 File 類(lèi)當(dāng)中還提供了專(zhuān)門(mén)的解決途徑File 類(lèi)特等優(yōu)先級(jí)方法:sic listRoots():列出當(dāng)前計(jì)算機(jī)的所有根目錄String list():列出一個(gè)目錄下所有的文件名字File listFiles():列出一個(gè)目錄下所有的文件對(duì)象*: 請(qǐng)注意 list()和 listFiles()都必須是目錄才能調(diào)用必須保證調(diào)用
37、它們的 File 對(duì)象 isDirectory();File 類(lèi)一等優(yōu)先級(jí)方法:exists():判斷 File 對(duì)象指代的文件或者目錄是否已經(jīng)存在*: File 對(duì)象可以指代一個(gè)已經(jīng)存在的文件,也可以指代一個(gè)當(dāng)前根本不存在的文件,就需要有一個(gè)方法能夠檢測(cè)文件是否存在isFile():判斷 File 對(duì)象指代的是不是一個(gè)文件isDirectory():判斷 File 對(duì)象指代的是不是一個(gè)目錄*: 你要明白 Java 當(dāng)中的 File,既可以代表一個(gè)文件,也可以代表一個(gè)目錄,那么就需要有方法能夠判斷究竟是文件還是目錄*: 如果文件不存在 則這兩個(gè)方法通通返回falselength():得到 Fi
38、le 對(duì)象指代的文件的字節(jié)個(gè)數(shù) 注意 long 類(lèi)型!lengthlength()size()length()數(shù)組字符串集合文件long*:這個(gè)方法只能用于文件 不能用于目錄 否則結(jié)果不可預(yù)知delete():刪除 File 對(duì)象指代的文件或者目錄*: 這個(gè)刪除根本不知道回收站是何物*: 如果要?jiǎng)h除的是一個(gè)目錄 則必須保證目錄為空 否則刪除失敗renameTo():重命名文件或者目錄*: 這個(gè)方法需要兩個(gè) File 對(duì)象 a.renameTo(c);而且要求 a 必須 exists()& c 必須!exists()*: 這個(gè)方法可以傳入不同的目錄結(jié)構(gòu)從而實(shí)現(xiàn)移動(dòng)mkdirs():創(chuàng)建多層不存在
39、的目錄結(jié)構(gòu)getName():得到文件或者目錄的名字getParent():得到文件或者目錄的父目錄getAbsolutePath():得到文件或者目錄的絕對(duì)路徑setLastModified():設(shè)置文件的最后一次修改時(shí)間lastModified():得到文件的最后一次修改時(shí)間*: 課題轉(zhuǎn)變 如何時(shí)間戳1 java.util.DategetYear() + 1900getMonth() + 1getDate()getHours()getMinutes()getSeconds()2 java.util.Calendarget(1) get(2)+1 get(5) get(11) get(12)
40、 get(13)3 java.text.SimpleDateFormatnew SimpleDateFormat(yyyy-MM-dd HH:mm:ss);format(time);=IO 流 = Input 輸入 Output 輸出流是一個(gè)很形象的概念流是數(shù)據(jù)從源點(diǎn)傳輸?shù)絽R點(diǎn)的管道IO 流的分類(lèi):按照方向分: 輸入流輸出流*:參照物=Java 程序按照分: 字節(jié)流字符流按照功能分: 節(jié)點(diǎn)流過(guò)濾流(包裝流 處理流)InputStream 所有字節(jié)輸入流的父類(lèi) 抽象類(lèi)read()read(byte data)*read(byte data,off,len)OutputStream 所有字節(jié)輸出流
41、的父類(lèi) 抽象類(lèi)write(data)write(byte data)write(byte data,off,len)*輸入流 字節(jié)流 節(jié)點(diǎn)流FileInputStreamFileOutputStream 輸出流 字節(jié)流 節(jié)點(diǎn)流*:它們的構(gòu)造方法都允許提供 String 文件路徑或者 File 文件對(duì)象*:雖然它們貴為節(jié)點(diǎn)流,能夠連接文件,但是絕對(duì)不能連接目錄!否則直接出現(xiàn)異常*:節(jié)點(diǎn)輸出流有極強(qiáng)的性,它創(chuàng)建對(duì)象的時(shí)候,如果連接的文件不存在,能夠自動(dòng)創(chuàng)建#:File 類(lèi)其實(shí)有個(gè)方法叫 createNewFile()能夠創(chuàng)建新的空白文件 - 咱沒(méi)講 一輩子不用但是如果連接的目錄結(jié)構(gòu)都不存在 則直接
42、異常#:File 類(lèi)有個(gè)方法叫 mkdirs() 咱們講過(guò) 你要用!節(jié)點(diǎn)輸出流創(chuàng)建對(duì)象的時(shí)候如果連接的文件已經(jīng)存在,也會(huì)被新的空白文件直換,而且沒(méi)有提示,如果需求是追加操作也就是在原有內(nèi)容之后繼續(xù)寫(xiě)內(nèi)容,那么可以構(gòu)造方法傳參指定追加模式開(kāi)啟new FileOutputStream(3.mp3,true); /追加模式new FileOutputStream(3.mp3); /替換模式*: FileInputStream 以-1 作為結(jié)束的標(biāo)識(shí)*: FileInputStream 最常用的是read(byte data) 因?yàn)闊o(wú)參的太慢*: FileOutputStream 最常用的卻是 wri
43、te(byte,)*: 無(wú)論何時(shí)何地 千萬(wàn)不要讓節(jié)點(diǎn)輸入流和輸出流同時(shí)連接同一個(gè)文件 否則怎樣都是錯(cuò)字節(jié)流 輸入流 過(guò)濾流(包裝流 處理流)BufferedInputStreamBufferedOutputStream 字節(jié)流 輸出流 過(guò)濾流(包裝流 處理流)*:作為過(guò)濾流的它們,是為了給原本的節(jié)點(diǎn)流添加巨大的緩沖空間,從而提高每次讀寫(xiě)的吞吐量,進(jìn)而提高效率的*:作為過(guò)濾流的它們,不能直接連接文件,只能連接其它的流*:它們的構(gòu)造方法都允許傳入第二個(gè)參數(shù),指定緩沖空間大小*:BufferedInputStream 同樣以-1 作為結(jié)束*:BufferedInputStream 最常用的是 rea
44、d()*:BufferedOutputStream 最常用的就是 write(data)DataInputStream字節(jié)流 輸入流 過(guò)濾流(包裝流處理流)DataOutputStream 字節(jié)流 輸出流 過(guò)濾流(包裝流處理流)*:作為過(guò)濾流的它們 是為了給原本的節(jié)點(diǎn)流添加讀寫(xiě)基本數(shù)據(jù)類(lèi)型的功能的*:char byte shortlong float double*:DataInputStream 提供的方法叫 readx()*:DataOutputStream 提供的方法叫 writex()*:DataInputStream 不再以-1作為結(jié)束的標(biāo)識(shí),而是如果已經(jīng)到達(dá)文件結(jié)尾還繼續(xù)嘗試,將直
45、接出現(xiàn) EOFException = End Of File*:在文件當(dāng)中沒(méi)有任何標(biāo)識(shí)哪一個(gè)是個(gè)數(shù)據(jù),意思就是如果寫(xiě)出一個(gè),可以讀取回來(lái)一個(gè)或者兩個(gè) short 或者四個(gè) byteObjectInputStream 輸入流 字節(jié)流 過(guò)濾流(包裝流 處理流)ObjectOutputStream輸出流 字節(jié)流 過(guò)濾流(包裝流 處理流)*:它們都是過(guò)濾流 它們存在是為了讓原本節(jié)點(diǎn)流添加讀寫(xiě)對(duì)象的功能*:它們都是過(guò)濾流 所以不能直接連接文件 只能連接其它的流*:ObjectInputStream - readObject();*:ObjectOutputStream - writeObject();*:一個(gè)對(duì)象想要被持久化到磁盤(pán)上,就必須要先序列化(Serializable)如果這個(gè)對(duì)象有其它類(lèi)型的屬性,就連這個(gè)屬性的類(lèi)型,也必須要實(shí)現(xiàn)序列化接口,如果某些屬性無(wú)關(guān)緊要,不需要參與持久化可以使用:transient 修飾 短暫的 轉(zhuǎn)瞬即逝的 不參與持久化的如果要持久化的是一個(gè)集合對(duì)象,則要求集合當(dāng)中的元素類(lèi)型,必須都實(shí)現(xiàn)序列化接口,如果要持久化的是一個(gè)使用了比較器的 TreeSet 或者 TreeMap,就連比較器對(duì)象也必須要序列化*:ObjectInputStream 同樣不以-1 作為結(jié)束的標(biāo)識(shí)也是 EOFException 異常的機(jī)制io
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年養(yǎng)老保險(xiǎn)考試試題及答案
- 2025年電網(wǎng)會(huì)計(jì)面試題及答案
- 2025年你的理解測(cè)試題及答案
- 修身語(yǔ)100則:原文+譯文
- 2025年建材銷(xiāo)售面試試題及答案
- 2025年空間站面試題及答案
- 2025年股權(quán)銷(xiāo)售面試試題及答案
- 2025年測(cè)繪副總理論試題及答案
- 2025年高中資料測(cè)試題及答案
- 2025年骨生物力學(xué)試題及答案
- 2024年1月時(shí)政熱點(diǎn)題庫(kù)及答案
- 2023年山東省夏季普通高中學(xué)業(yè)水平合格考試會(huì)考生物試題及參考答案
- 項(xiàng)目四任務(wù)1:認(rèn)識(shí)毫米波雷達(dá)(課件)
- 非正常接發(fā)列車(chē)作業(yè)標(biāo)準(zhǔn)
- 體育室內(nèi)課-體育大富翁
- 180萬(wàn)噸柴油加氫裝置可行性研究報(bào)告
- DLT 5285-2018 輸變電工程架空導(dǎo)線(xiàn)(800mm以下)及地線(xiàn)液壓壓接工藝規(guī)程
- 2024年國(guó)家保安員資格考試題庫(kù)及參考答案(完整版)
- DL-T692-2018電力行業(yè)緊急救護(hù)技術(shù)規(guī)范
- 消防員訓(xùn)練傷的預(yù)防及恢復(fù)課件
- GB/T 43860.1220-2024觸摸和交互顯示第12-20部分:觸摸顯示測(cè)試方法多點(diǎn)觸摸性能
評(píng)論
0/150
提交評(píng)論