小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

《Thinking in Java》讀書筆記——對(duì)象、集合

 諤諤熱 2017-08-16

一、前言:

本來(lái)想看完書再整理下自己的筆記的,可是書才看了一半發(fā)現(xiàn)筆記有點(diǎn)多,有點(diǎn)亂,就先整理一份吧,順便復(fù)習(xí)下前面的知識(shí),之后的再補(bǔ)上。

真的感覺,看書是個(gè)好習(xí)慣啊,難怪人家說(shuō)“書籍是人類進(jìn)步的階梯”。之前學(xué)知識(shí),喜歡網(wǎng)上找份教程,看點(diǎn)視頻,照著做唄,秉著”我做過的東西反正別人肯定玩過“的觀念,一通亂學(xué),學(xué)的又多又雜,現(xiàn)在細(xì)細(xì)想來(lái),很多東西我只是學(xué)到了它的形,卻沒有學(xué)到它的神,只是在抄別人的代碼。為什么這么做?這么寫是出于什么考慮?我都一臉懵懂!而現(xiàn)在我喜歡看書,花時(shí)間來(lái)沉淀自己的知識(shí),與大家共勉!另外,真的不推薦零基礎(chǔ)的看這本書,講的太拗口了。或者說(shuō)翻譯的太拗口了。

二、面向?qū)ο?/strong>

1、對(duì)象存儲(chǔ)到什么地方?

  • 寄存器。這是最快的存儲(chǔ)區(qū),寄存器的數(shù)量及其有限,由編譯器根據(jù)需求進(jìn)行分配。你不能直接控制,也不能在程序中感覺到寄存器存在的任何現(xiàn)象。

  • 棧。棧指針向下移動(dòng)則分配新的內(nèi)存,向上移動(dòng),則釋放那些內(nèi)存。這是一種快速有效的分配存儲(chǔ)方法,僅次于寄存器?;緮?shù)據(jù)類型和對(duì)象引用存儲(chǔ)在其中。

  • 堆。一種通用性的內(nèi)存池,用于存放所有的java對(duì)象,堆不同于棧的好處在于:編譯器不需要知道從堆里分配多少存儲(chǔ)區(qū)域,也不必知道存儲(chǔ)的數(shù)據(jù)在堆里存活多少時(shí)間。

  • 靜態(tài)存儲(chǔ)。靜態(tài)存儲(chǔ)里存放 程序運(yùn)行時(shí)一直存放的數(shù)據(jù)。Static 關(guān)鍵字的對(duì)象存放在其中。static局部變量在所處模塊在初次運(yùn)行時(shí)進(jìn)行初始化工作,且只操作一次。

  • 常量存儲(chǔ)。常量值通常直接存放在程序代碼內(nèi)部,這樣做是安全的,因?yàn)樗麄冇肋h(yuǎn)不會(huì)被 改變。

  • 非RAM存儲(chǔ)。比如流對(duì)象和持久化對(duì)象,發(fā)送給另一臺(tái)機(jī)器或者存放在磁盤上。

2、基本成員默認(rèn)值

如果類的某個(gè)成員是基本數(shù)據(jù)類型,即使沒有進(jìn)行初始化,Java也會(huì)確保他獲得一個(gè)默認(rèn)值。

boolean false

char null

byte 0

short 0

int 0

long 0

float 0.0

double 0.0

3、在采取其他任何操作之前,為對(duì)象分配的存儲(chǔ)空間初始化成二進(jìn)制零。在一個(gè)類里,初始化的順序是由變量在類內(nèi)的定義順序決定的。即使變量定義大量遍布于方法定義的中間,那些變量仍會(huì)在調(diào)用任何方法之前得到初始化—— 甚至在構(gòu)建器調(diào)用之前。

static 初始化只有在必要的時(shí)候才會(huì)進(jìn)行。如果不創(chuàng)建一個(gè) Table 對(duì)象,而且永遠(yuǎn)都不引用 Table.b1 或Table.b2,那么 static Bowl b1 和 b2 永遠(yuǎn)都不會(huì)創(chuàng)建。然而,只有在創(chuàng)建了第一個(gè) Table 對(duì)象之后(或者發(fā)生了第一次 static 訪問),它們才會(huì)創(chuàng)建。在那以后, static 對(duì)象不會(huì)重新初始化。初始化的順序是首先 static(如果它們尚未由前一次對(duì)象創(chuàng)建過程初始化),接著是非static 對(duì)象

4、類的設(shè)計(jì)中為什么要控制對(duì)成員的訪問?

1、防止用戶接觸那些他們不應(yīng)碰的工具。對(duì)于數(shù)據(jù)類型的內(nèi)部機(jī)制,那些工具是必需的。但它們并不屬于用戶接口的一部分,用戶不必用它來(lái)解決自己的特定問題。比如private的方法,有些是不希望被用戶使用的。

2、允許類設(shè)計(jì)者改變類的內(nèi)部工作機(jī)制,同時(shí)不必?fù)?dān)心它會(huì)對(duì)客戶程序員產(chǎn)生什么影響。

3、防止類的成員被用戶隨意修改,比如用戶通過 類名.成員名 就可以改變類的屬性值。

5、為什么優(yōu)先使用組合而非繼承?

1、繼承破壞封裝性。基類的很多內(nèi)部細(xì)節(jié)都是對(duì)派生類可見的,因此這種復(fù)用是“白箱復(fù)用”;

2、如果基類的實(shí)現(xiàn)發(fā)生改變,那么派生類的實(shí)現(xiàn)也將隨之改變。這樣就導(dǎo)致了子類行為的不可預(yù)知性;

3、組成不會(huì)強(qiáng)迫我們的程序設(shè)計(jì)進(jìn)入繼承的分級(jí)結(jié)構(gòu)中。同時(shí),組成顯得更加靈活,因?yàn)榭梢詣?dòng)態(tài)選擇一種類型(以及行為),而繼承要求在編譯期間準(zhǔn)確地知道一種類型。因此降低了應(yīng)用的靈活性。

6、一條常規(guī)的設(shè)計(jì)準(zhǔn)則是:用繼承表達(dá)行為間的差異,并用成員變量表達(dá)狀態(tài)的變化。

7、為什么要向上轉(zhuǎn)型?

好處:向上轉(zhuǎn)型主要是為了用變量來(lái)接收不同的子類對(duì)象,調(diào)用方法的時(shí)候傳參父類對(duì)象,可以調(diào)用子類中不同的重寫方法,實(shí)現(xiàn)不同的效果。

壞處:屏蔽了子類中新增的變量和方法。

8、static關(guān)鍵字 強(qiáng)調(diào)他們只有一個(gè),而final 關(guān)鍵字強(qiáng)調(diào)他們是一個(gè)常數(shù)。不能由于某樣?xùn)|西的屬性是final,就認(rèn)定他的值在編譯的時(shí)候已經(jīng)知道,其實(shí)final的值是進(jìn)行類對(duì)象初始化的時(shí)候確定的。

9、final 關(guān)鍵字 修飾方法 的好處?

1、為方法“上鎖”,防止任何繼承類改變它的本來(lái)含義。設(shè)計(jì)程序時(shí),若希望一個(gè)方法的行為在繼承期間保持不變,而且不可被覆蓋或改寫,就可以采取這種做法。

2、將一個(gè)方法設(shè)成 final 后,編譯器就可以把對(duì)那個(gè)方法的所有調(diào)用都置入“嵌入”調(diào)用里。只要編譯器發(fā)現(xiàn)一個(gè) final 方法調(diào)用,就會(huì)(根據(jù)它自己的判斷)忽略為執(zhí)行方法調(diào)用機(jī)制而采取的常規(guī)代碼插入方法(將自變量壓入堆棧;跳至方法代碼并執(zhí)行它;跳回來(lái);清除堆棧自變量;最后對(duì)返回值進(jìn)行處理)。相反,它會(huì)用方法主體內(nèi)實(shí)際代碼的一個(gè)副本來(lái)替換方法調(diào)用。這樣做可避免方法調(diào)用時(shí)的系統(tǒng)開銷。當(dāng)然,若方法體積太大,那么程序也會(huì)變得雍腫,可能受到到不到嵌入代碼所帶來(lái)的任何性能提升。因?yàn)槿魏翁嵘急换ㄔ诜椒▋?nèi)部的時(shí)間抵消了。 Java 編譯器能自動(dòng)偵測(cè)這些情況,并頗為“明智”地決定是否嵌入一個(gè) final 方法。然而,最好還是不要完全相信編譯器能正確地作出所有判斷。通常,只有在方法的代碼量非常少,或者想明確禁止方法被覆蓋的時(shí)候,才應(yīng)考慮將一個(gè)方法設(shè)為final。

10、為什么要把方法定義成抽象或者定義接口?

1、它能為不同的子類型或者實(shí)現(xiàn)類作出不同的表示。它為我們建立了一種基本形式,使我們能定義在所有衍生類里“通用”的一些東西。比如 子類繼承了父類,雖然如果方法名與父類相同,但自變量或參數(shù)不同,就會(huì)出現(xiàn)重載現(xiàn)象,那或許并非我們所愿意的。所以好一點(diǎn)的方法,就是在父類或者接口中建立一種標(biāo)準(zhǔn)。

2、還有就是父類中的方法實(shí)現(xiàn)其實(shí)很冗余,基本用不到

11、接口也包含了基本數(shù)據(jù)類型的數(shù)據(jù)成員,但他們都默認(rèn)是static 和 final,必須獲得初始化(所以可以借助此性質(zhì)定義需要的“枚舉值”,通過接口名.變量名來(lái)訪問)。接口只提供一種形式,并不提供實(shí)施的細(xì)節(jié)。

12、接口當(dāng)作方法的形參的時(shí)候,傳入的不僅可以是接口的實(shí)現(xiàn)類,也可以是實(shí)現(xiàn)類的子類。

13、利用繼承技術(shù),可方便地為一個(gè)接口添加新的方法聲明,也可以將幾個(gè)接口合并成一個(gè)新接口。在這兩種情況下,最終都得到一個(gè)新接口。接口的繼承實(shí)際上是一個(gè)接口功能增加的過程,有些應(yīng)用只需要簡(jiǎn)單的接口。通過繼承,可以在簡(jiǎn)單的接口上得到適合自己需要的復(fù)雜接口。

14、可以在一個(gè)類的內(nèi)部定義新的類,稱為內(nèi)部類,如果想生成內(nèi)部類的一個(gè)對(duì)象,必須將那個(gè)對(duì)象的類型設(shè)為'外部類名.內(nèi)部類名'

15、為什么需要定義內(nèi)部類?

1、我們準(zhǔn)備實(shí)現(xiàn)某種形式的接口,使自己能夠創(chuàng)建和返回一個(gè)引用。

2、要解決一個(gè)復(fù)雜的問題,并希望創(chuàng)建一個(gè)類,用來(lái)輔助自己的程序方案。同時(shí)不愿意把它公開。

16、匿名內(nèi)部類

1、如果是接口,相當(dāng)于在內(nèi)部返回了一個(gè)接口的實(shí)現(xiàn)類,并且實(shí)現(xiàn)方式是在類的內(nèi)部進(jìn)行的;

2、如果是普通類,匿名類相當(dāng)于繼承了父類,是一個(gè)子類,并可以重寫父類的方法。

3、需要特別注意的是,匿名類沒有名字,不能擁有一個(gè)構(gòu)造器。如果想為匿名類初始化,讓匿名類獲得一個(gè)初始化值,或者說(shuō),想使用匿名內(nèi)部類外部的一個(gè)對(duì)象,則編譯器要求外部對(duì)象為final屬性,否則在運(yùn)行期間會(huì)報(bào)錯(cuò)。

《Thinking in Java》讀書筆記——對(duì)象、集合

17、實(shí)際上,內(nèi)部類的一個(gè)實(shí)例初始化模塊就是一個(gè)匿名內(nèi)部類的構(gòu)造器。初次之外,內(nèi)部類擁有對(duì)封裝類所有元素的訪問權(quán)限。

18、設(shè)計(jì)構(gòu)造器時(shí)一個(gè)特別有效的規(guī)則是:用盡可能簡(jiǎn)單的方法使對(duì)象進(jìn)入就緒狀態(tài);如果可能,避免調(diào)用任何方法。在構(gòu)造器內(nèi)唯一能夠安全調(diào)用的是在基礎(chǔ)類中具有final 屬性的那些方法(也適用于 private方法,它們自動(dòng)具有 final 屬性)

19、泛型類或者泛型方法中,不接受 8 種基本數(shù)據(jù)類型。

三、集合

1、為容納一組對(duì)象,最適宜的選擇應(yīng)當(dāng)是數(shù)組,但是數(shù)組也有他明顯的缺點(diǎn),即容量有限。而且假如容納的是一系列基本數(shù)據(jù)類型,更是必須采用數(shù)組。集合實(shí)際容納的類型為Object的引用,這當(dāng)然包括一切的java對(duì)象,因?yàn)镺bject是一切對(duì)象的基類。當(dāng)然并不包括基本數(shù)據(jù)類型,因?yàn)樗鼈儾⒉皇菑摹叭魏螙|西”繼承來(lái)的。

2、Iterator接口的remove方法將會(huì)刪除上次調(diào)用next方法時(shí)返回的元素。集合也有一個(gè)remove的方法,適用于List 和 Set ,boolean remove(Object)。

《Thinking in Java》讀書筆記——對(duì)象、集合

3、Listiterator和Iterator 的區(qū)別?

一.相同點(diǎn)

都是迭代器,當(dāng)需要對(duì)集合中元素進(jìn)行遍歷不需要干涉其遍歷過程時(shí),這兩種迭代器都可以使用。

二.不同點(diǎn)

1.使用范圍不同,Iterator可以應(yīng)用于所有的集合,Set、List和Map和這些集合的子類型。而ListIterator只能用于List及其子類型。

2.ListIterator有add方法,可以向List中添加對(duì)象,而Iterator不能。

3.ListIterator和Iterator都有hasNext()和next()方法,可以實(shí)現(xiàn)順序向后遍歷,但是ListIterator有hasPrevious()和previous()方法,可以實(shí)現(xiàn)逆向(順序向前)遍歷。Iterator不可以。

4.ListIterator可以定位當(dāng)前索引的位置,nextIndex()和previousIndex()可以實(shí)現(xiàn)。Iterator沒有此功能。

5.都可實(shí)現(xiàn)刪除操作,但是ListIterator可以實(shí)現(xiàn)對(duì)象的修改,set()方法可以實(shí)現(xiàn)。Iterator僅能遍歷,不能修改。

4、Set集合都不能保存重復(fù)的數(shù)據(jù),即使是TreeSet也只是對(duì)不重復(fù)的數(shù)據(jù)進(jìn)行排序罷了。對(duì)于TreeSet或者HashSet來(lái)說(shuō),在進(jìn)行add()以及contain()操作時(shí),HashSet顯然要比ArraySet出色的多,而且性能明顯與元素的多寡關(guān)系不大。一般在元素比較少,而且要進(jìn)來(lái)遍歷查詢的時(shí)候,TreeSet會(huì)稍微快一些。

5、HashSet 與TreeSet和LinkedHashSet的區(qū)別?

HaseSet:

1、不能保證元素的排列順序,順序有可能發(fā)生變化。

2、不是同步的。

3、集合元素可以為null,但只能放入一個(gè)null。

4、當(dāng)向HashSet集合中存入一個(gè)元素時(shí),會(huì)首先調(diào)用該對(duì)象的hashCode()方法來(lái)得到該對(duì)象的hashCode值,然后根據(jù) hashCode值來(lái)決定該對(duì)象在HashSet中存儲(chǔ)位置。如果該HashSet集合中已經(jīng)有這個(gè)對(duì)象的hashCode值,則調(diào)用該對(duì)象的equal()方法,返回true,就不插入,返回false,就另外找一個(gè)hashCode存儲(chǔ)。

TreeSet:

TreeSet底層是一個(gè)紅黑二叉樹結(jié)構(gòu),其中元是不可重復(fù)的。TreeSet類型是J2SE中唯一可實(shí)現(xiàn)自動(dòng)排序的類型。TreeSet支持兩種排序方式,自然排序和定制排序。向treeSet中加入的應(yīng)該是同一個(gè)類的對(duì)象。向TreeSet插入基本數(shù)據(jù)類型時(shí),Java已經(jīng)定義好了CompareTo(Object obj)方法,采用自然排序,默認(rèn)升序。如果放入的是自定義的對(duì)象類需要實(shí)現(xiàn)Comparable接口并重寫compareTo()方法,相等返回0,大于返回正數(shù),小于返回負(fù)數(shù)。同時(shí)treeSet的插入比較也是通過compareTo()或者equal()方法來(lái)比較插入的。

LinkedHashSet:

LinkedHashSet集合同樣是根據(jù)元素的hashCode值來(lái)決定元素的存儲(chǔ)位置,但是它同時(shí)使用鏈表維護(hù)元素的次序。這樣使得元素看起 來(lái)像是以插入順 序保存的,也就是說(shuō),當(dāng)遍歷該集合時(shí)候,LinkedHashSet將會(huì)以元素的添加順序訪問集合的元素。

LinkedHashSet在迭代訪問Set中的全部元素時(shí),性能比HashSet好,但是插入時(shí)性能稍微遜色于HashSet

6、如果兩個(gè)對(duì)象相同,那么他們的hashCode值一定相同。如果兩個(gè)對(duì)象的hashCode值相同,他們不一定相同。

7、HashMap、TreeMap 的區(qū)別?

1、HashMap是基于散列表實(shí)現(xiàn)的,時(shí)間復(fù)雜度能達(dá)到O(1),是無(wú)序的。

2、TreeMap基于紅黑樹(一種自平衡二叉查找書)實(shí)現(xiàn)的,時(shí)間復(fù)雜度平均能達(dá)到O(log n),是有序的。

8、HashMap、HashTable的區(qū)別?

1、HashMap幾乎可以等價(jià)于HashTable,都實(shí)現(xiàn)了Map接口。

2、HashMap是非同步的,線程不安全的。而HashTable是同步的,線程安全的。當(dāng)然我們也可以手動(dòng)進(jìn)行HashMap同步(Collections.synchronizeMap(hashMap))

3、HashTable中hash數(shù)組默認(rèn)大小是11,增加的方式是 old*2+1。HashMap中hash數(shù)組的默認(rèn)大小是16,而且一定是2的指數(shù)。

4、哈希值的使用不同,HashTable直接使用對(duì)象的hashCode。

9、從性能方面來(lái)說(shuō),對(duì)于Map的put()和get(),hashMap和hashTable都要優(yōu)于TreeMap,而hashTable要多花一些開銷在線程同步上,所以hashMap的性能又稍優(yōu)于hashTable。而對(duì)于Map的遍歷來(lái)說(shuō),treeSet的性能要稍優(yōu)于hashMap和hashTable。

10、如果需要?jiǎng)?chuàng)建大量Map,TreeMap、hashMap的性能要優(yōu)于hashTable。

11、對(duì)于Arrays和Collections來(lái)說(shuō),若在執(zhí)行一次 binarySearch()之前不調(diào)用 sort(),便會(huì)發(fā)生不可預(yù)測(cè)的行為,其中甚至包括無(wú)限循環(huán)。排序遵守的是字典排序,亦即大寫字母在字符集中位于小寫字母的前面。

12、Comparator和Comparable的區(qū)別?

集合或者數(shù)組要實(shí)現(xiàn)自動(dòng)排序功能,比如TreeSet、TreeMap、Arrays.sort()、Collections.sort(),有兩種方式。

第一種:比較的類型內(nèi)部實(shí)現(xiàn)了Comparable接口重寫了compareTo()方法。

第二種:自己新建了一個(gè)比較類實(shí)現(xiàn)了Comparator接口,重寫了compare方法。

13、使 Collection 或 Map 不可修改?

Collections.unmodifiableCollection(c);

Collections.unmodifiableList(a);

Collections.unmodifiableSet(s);

Collections.unmodifiableMap(m);

14、使Collection 或 Map 的同步?

Collections.synchronizedCollection(new ArrayList());

Collections.synchronizedList(new ArrayList());

Collections.synchronizedSet(new HashSet());

Collections.synchronizedMap(new HashMap());

四、其他

1、怎么理解TCP是可靠的協(xié)議,而HTTP基于IP/TCP協(xié)議,卻是不可靠的?

1、首先IP 是網(wǎng)絡(luò)層的協(xié)議,確認(rèn)source和target的IP地址。

2、TCP是傳輸層的傳輸協(xié)議,傳輸基于三次握手過程提供可靠的傳輸協(xié)議。

3、HTTP是應(yīng)用層協(xié)議,它只負(fù)責(zé)把服務(wù)器的資源反饋到客戶端。

4、怎么理解三個(gè)協(xié)議之間的合作呢,IP提供源地址和目標(biāo)地址,TCP建立可靠的通道,最后由HTTP來(lái)負(fù)責(zé)傳輸內(nèi)容,如果一個(gè)會(huì)話需要多個(gè)層級(jí)的連接,會(huì)造成延遲大、資源浪費(fèi),所以如果一個(gè)層級(jí)已經(jīng)提供了可靠連接,則其它層級(jí)完全沒有必要連接,只需要交流信息即可,比如這里的HTTP。

學(xué)習(xí)Java的同學(xué)注意了!?。?/p>

學(xué)習(xí)過程中遇到什么問題或者想獲取學(xué)習(xí)資源的話,歡迎加入Java學(xué)習(xí)交流群495273252,我們一起學(xué)Java!

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多