大數(shù)據(jù)技術(shù)之高頻面試題_第1頁
大數(shù)據(jù)技術(shù)之高頻面試題_第2頁
大數(shù)據(jù)技術(shù)之高頻面試題_第3頁
大數(shù)據(jù)技術(shù)之高頻面試題_第4頁
大數(shù)據(jù)技術(shù)之高頻面試題_第5頁
已閱讀5頁,還剩110頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

目錄

第1章面試說明9

1.1面試過程最關(guān)鍵的是什么?9

1.2面試時(shí)該怎么說?91)語言表達(dá)清楚9

2)所述內(nèi)容不犯錯(cuò)9

1.3面試技巧9六個(gè)常見問題9

1.3.1兩個(gè)考前須知10自我介紹(控制在4分半以內(nèi),不超過5分鐘)10

第2章手寫代碼10

2.1冒泡排序10

2.2二分查找11

2.3快排13

2.4歸并14

2.5二叉樹之Scala實(shí)現(xiàn)16二叉樹概念16

2.5.1二叉樹的特點(diǎn)16二叉樹的Scala代碼實(shí)現(xiàn)16

2.6手寫Spark-WordCount20

2.7手寫Spark程序21第3章工程架構(gòu)21

3.1數(shù)倉概念21

3.2系統(tǒng)數(shù)據(jù)流程設(shè)計(jì)21

3.3框架版本選型21

3.4服務(wù)器選型211)機(jī)器本錢考慮:22

2)運(yùn)維本錢考慮:22

3.5集群規(guī)模22

3.6人員配置參考22整體架構(gòu)。22

3.6.1你們部門的職級(jí)等級(jí),晉升規(guī)那么22人員配置參考23

第4章工程涉及技術(shù)23

1.1

第1章面試說明

1.1面試過程最關(guān)鍵的是什么?

1)不是你說了什么,而是你怎么說2)大大方方的聊,放松

1.2面試時(shí)該怎么說?

1)語言表達(dá)清楚(1)思維邏輯清晰,表達(dá)流暢

(2)一二三層次表達(dá)2)所述內(nèi)容不犯錯(cuò)

(1)不說前東家或者自己的壞話(2)往自己擅長(zhǎng)的方面說

(3)實(shí)質(zhì),對(duì)考官來說,內(nèi)容聽過,就是自我肯定;沒聽過,那就是個(gè)學(xué)習(xí)的過程。

1.3面試技巧六個(gè)常見問題

1)你的優(yōu)點(diǎn)是什么?

大膽的說出自己各個(gè)方面的優(yōu)勢(shì)和特長(zhǎng)2)你的缺點(diǎn)是什么?

不要談自己真實(shí)問題;月“缺點(diǎn)”襯托自己的優(yōu)點(diǎn)3)你的離職原因是什么?

>不說前東家壞話,哪怕被傷過

>合情合理合法

>不要說超過1個(gè)以上的原因4)您對(duì)薪資的期望是多少?

>非終面不深談薪資

>只說區(qū)間,不說具體數(shù)字

>底線是不低于當(dāng)前薪資

>非要具體數(shù)字,區(qū)間取中間值,或者當(dāng)前薪資的+20%

finalize:Object類中定義的方法,Java中允許使用finalize。方法在垃圾收集器將對(duì)象

從內(nèi)存中清除出去之前做必要的清理工作。這個(gè)方法是由垃圾收集器在銷毀對(duì)象時(shí)調(diào)用的,

通過重寫finalize.方法可以整理系統(tǒng)資源或者執(zhí)行其他清理工作。

10.7二二和Equals區(qū)另lj

二:如果比擬的是基本數(shù)據(jù)類型,那么比擬的是變量的值如果比擬的是引用數(shù)據(jù)類型,

那么比擬的是地址值(兩個(gè)對(duì)象是否指向同一塊內(nèi)

存)

equals:如果沒重寫equals方法比擬的是兩個(gè)對(duì)象的地址值。

如果重寫了equals方法后我們往往比擬的是對(duì)象中的屬性的內(nèi)容

equal*方法是從Object類中繼承的,默認(rèn)的實(shí)現(xiàn)就是使用二publicboolean

return(this

n.i緩存穿透、緩存雪崩、緩存擊穿1)緩存穿透是指查詢一個(gè)一定不

存在的數(shù)據(jù)。由于緩存命不中時(shí)會(huì)去查詢數(shù)據(jù)庫,查不到數(shù)據(jù)那么不

寫入緩存,這將導(dǎo)致這個(gè)不存在的數(shù)據(jù)每次請(qǐng)求都要到數(shù)據(jù)庫去查

詢,造成緩存穿透。

解決方案:

①是將空對(duì)象也緩存起來,并給它設(shè)置一個(gè)很短的過期時(shí)間,最長(zhǎng)不超過5分鐘

②采用布隆過濾器,將所有可能存在的數(shù)據(jù)哈希到一個(gè)足夠大的bitmap中,一個(gè)一定不

存在的數(shù)據(jù)會(huì)被這個(gè)bitmap攔截掉,從而防止了對(duì)底層存儲(chǔ)系統(tǒng)的查詢壓力2)如果緩存集中

在一段時(shí)間內(nèi)失效,發(fā)生大量的緩存穿透,所有的查詢都落在數(shù)據(jù)庫上,就會(huì)造成緩存雪崩。

解決方案:

盡量讓失效的時(shí)間點(diǎn)不分布在同一個(gè)時(shí)間點(diǎn)3)緩存山穿,是指一個(gè)key非常熱點(diǎn),在不

停的扛著大并發(fā),當(dāng)這個(gè)key在失效的瞬間,持續(xù)的大并發(fā)就穿破緩存,直接請(qǐng)求數(shù)據(jù)庫,

就像在一個(gè)屏障上鑿開了一個(gè)洞。

解決方案:

可以設(shè)置key永不過期99

11.2哨兵模式

主從復(fù)制中反客為主的自動(dòng)版,如果主機(jī)Down掉,哨兵會(huì)從從機(jī)中選擇一臺(tái)作為主

機(jī),并將它設(shè)置為其他從機(jī)的主機(jī),而且如果原來的主機(jī)再次啟動(dòng)的話也會(huì)成為從機(jī)。

11.3數(shù)據(jù)類型

string字符串

list可以重復(fù)的集合

set不口J以重復(fù)的集合

hash類似于Map<String,String>

zset(sortedset)帶分?jǐn)?shù)的set

11.4持久化RDB持久化:

①在指定的時(shí)間間隔內(nèi)持久化

②服務(wù)shutdown會(huì)自動(dòng)持久化

③輸入bgsave也會(huì)持久化)AOF:以日志形式記錄每個(gè)更新操作

Redis重新啟動(dòng)時(shí)讀取這個(gè)文件,重新執(zhí)行新建、修改數(shù)據(jù)的命令恢復(fù)數(shù)據(jù)。

保存策略:

推薦(并且也是默認(rèn))的措施為每秒持久化一次,這種策略可以兼顧速度和平安性。

缺點(diǎn):

1比起RDB占用更多的磁盤空間

2恢復(fù)備份速度要慢

3每次讀寫都同步的話,有一定的性能壓力

4存在個(gè)別Bug,造成恢復(fù)不能選擇策略:

官方推薦:

10()

如果對(duì)數(shù)據(jù)不敏感,可以選單獨(dú)用RDB;不建議單獨(dú)用AOF,因?yàn)榭赡艹霈F(xiàn)Bug:如果只

是做純內(nèi)存緩存,可以都不用悲觀鎖

執(zhí)行操作前假設(shè)當(dāng)前的操作肯定(或有很大幾率)會(huì)被打斷(悲觀)?;谶@個(gè)假設(shè),

我們?cè)谧霾僮髑熬蜁?huì)把相關(guān)資源鎖定,不允許自己執(zhí)行期間有其他操作干擾。

11.5樂觀鎖

執(zhí)行操作前假設(shè)當(dāng)前操作不會(huì)被打斷(樂觀)。基于這個(gè)假設(shè),我們?cè)谧霾僮髑安粫?huì)鎖定

資源,萬一發(fā)生了其他操作的干擾,那么本次操作將被放棄。Redis使用的就是樂觀鎖。

第12章MySqlMylSAM與InnoDB的區(qū)別

比照項(xiàng)MylSAMInnoDB

外鍵不支持支持

事務(wù)不支持支持

行表鎖表鎖,即使操作一條記錄也會(huì)行鎖,操作時(shí)只鎖某一行,不對(duì)

鎖住整個(gè)表,不適合高并發(fā)的其它行有影響,

操作適合高并發(fā)的操作

緩存只緩存索引,不緩存真實(shí)數(shù)據(jù)不僅緩存索引還要緩存真實(shí)數(shù)

據(jù),對(duì)內(nèi)存要求較高,而且內(nèi)存

大小對(duì)性能有決定性的影響

_______

數(shù)據(jù)結(jié)構(gòu):B+Tree

一般來說能夠到達(dá)range就可以算是優(yōu)化了口訣(兩個(gè)法那么加6種索引失效的情況)

全值匹配我最愛,最左前綴要遵守;

帶頭大哥不能死,中間兄弟不能斷;101

索引列上少計(jì)算,范圍之后全失效;

LIKE百分寫最右,覆蓋索引不寫啊

不等空值還有OR.索引影響要注意;

VAR引號(hào)不可丟,SQL優(yōu)化有訣竅。

12.1b-tree和b+tree的區(qū)別B-

樹的關(guān)鍵字和記錄是放在一起的,葉子節(jié)點(diǎn)可以看作外部節(jié)點(diǎn),不包

含任何信息;B+

樹的非葉子節(jié)點(diǎn)中只有關(guān)鍵字和指向下一個(gè)節(jié)點(diǎn)的索引,記錄只放在

葉子節(jié)點(diǎn)中。

2)在B-樹中,越靠近根節(jié)點(diǎn)的記錄查找時(shí)間越快,只要找到關(guān)鍵字即可確定記錄的存在;而

B+樹中每個(gè)記錄的查找時(shí)間基本是一樣的,都需要從根節(jié)點(diǎn)走到葉子節(jié)點(diǎn),而且在葉子節(jié)點(diǎn)

中還要再比擬關(guān)鍵字。

12.2redis是單線程的,為什么那么快

1)完全基于內(nèi)存,絕大局部請(qǐng)求是純粹的內(nèi)存操作,非??焖?。

2)數(shù)據(jù)結(jié)構(gòu)簡(jiǎn)單,對(duì)數(shù)據(jù)操作也簡(jiǎn)單,Redis中的數(shù)據(jù)結(jié)構(gòu)是專門進(jìn)行設(shè)計(jì)的3)采用單線程,

防止了不必要的上下文切換和競(jìng)爭(zhēng)條件,也不存在多進(jìn)程或者多線程導(dǎo)致的切換而消耗CPU,

不用去考慮各種鎖的問題,不存在加鎖釋放鎖操作,沒有因?yàn)榭赡艹霈F(xiàn)死鎖而導(dǎo)致的性能消

4)使用多路1/0復(fù)用模型,非阻塞105)使用底層模型不同,它們之間底層實(shí)現(xiàn)方式以及與客戶

端之間通信的應(yīng)用協(xié)議不一樣,Rcdis直接自己構(gòu)建了VM機(jī)制,因?yàn)橐话愕南到y(tǒng)調(diào)用系統(tǒng)函

數(shù)的話,會(huì)浪費(fèi)一定的時(shí)間去移動(dòng)和請(qǐng)求

12.3MySQL的事務(wù)一、事務(wù)的基本要素(ACID)

1、原子性(Atomicity):事務(wù)開始后所有操作,要么全部做完,要么全部不做,不可能停滯在中

間環(huán)節(jié)。事務(wù)執(zhí)行過程中出錯(cuò),會(huì)回滾到事務(wù)開始前的狀態(tài),所有的操作就像沒有發(fā)生一樣。

也就是說事務(wù)是一個(gè)不可分割的整體,就像化學(xué)中學(xué)過的原子,是物質(zhì)構(gòu)成的基本單位2、一

致性(Consislency):事務(wù)開始前和結(jié)束后,數(shù)據(jù)庫的完整性約束沒有被破壞。比如A向B轉(zhuǎn)

賬,不可能A扣了錢,B卻沒收到。

1023、隔離性(Isolation):同一時(shí)間,只允許一個(gè)事務(wù)請(qǐng)求同一數(shù)據(jù),不同的事務(wù)之間彼此沒

有任何干擾.比方A正在從一張銀行卡中取錢,在A取錢的過程結(jié)束前,R不能向這張卡轉(zhuǎn)

賬。

4、持久性(Durability):事務(wù)完成后,事務(wù)對(duì)數(shù)據(jù)庫的所有更新將被保存到數(shù)據(jù)庫,不能回

滾。

二、事務(wù)的并發(fā)問題1、臟讀:事務(wù)A讀取了事務(wù)B更新的數(shù)據(jù),然后B回滾操作,那么A

讀取到的數(shù)據(jù)是臟數(shù)據(jù)

2、不可重復(fù)讀:事務(wù)A屢次讀取同一數(shù)據(jù),事務(wù)B在事務(wù)A屢次讀取的過程中,對(duì)數(shù)據(jù)作

了更新并提交,導(dǎo)致事務(wù)A屢次讀取同一數(shù)據(jù)時(shí)\結(jié)果不一致3、幻讀:系統(tǒng)管理員A將數(shù)據(jù)

庫中所有學(xué)生的成績(jī)從具體分?jǐn)?shù)改為ABCDE等級(jí),但是系統(tǒng)管理員B就在這個(gè)時(shí)候插入了

一條具體分?jǐn)?shù)的記錄,當(dāng)系統(tǒng)管理員A改結(jié)束后發(fā)現(xiàn)還有一條記錄沒有改過來,就好像發(fā)生

了幻覺一樣,這就叫幻讀。

小結(jié):不可重復(fù)讀的和幻讀很容易混淆,不可重復(fù)讀側(cè)重于修改,幻讀側(cè)重于新增或刪除。

解決不可重復(fù)讀的問題只需鎖住滿足條件的行,解決幻讀需要鎖表三、MySQL事務(wù)隔離級(jí)別

事務(wù)隔離級(jí)別臟讀不可重復(fù)讀幻讀

讀未提交(read-uncommilted)是是是

不可重復(fù)讀(read-committed)否是是

可重復(fù)讀(repeatable-read)否否是

串行化(serializable)否否否

拓恁敏題墉蚓杵詢出每門課都大于80分的學(xué)生姓名namekecheng

張三語文81張三數(shù)學(xué)75

李四語文76李四數(shù)學(xué)90

103

王五語文數(shù)學(xué)81

王五王五英語90A:100

selectdistinctnamefromtablewherenamenotin(selectdistinctname

fromtablewherefenshu<=80)

B:selectnamefromtablegroupbynamehavingmin(fenshu)>802.學(xué)生表如下:

自動(dòng)編號(hào)學(xué)號(hào)姓名課程編號(hào)課程名稱分?jǐn)?shù)

12005001張三0001數(shù)學(xué)69

數(shù)

ooo1學(xué)89

22005002李四1

數(shù)

ooo1學(xué)69

32005001張三1

刪除除了自動(dòng)編號(hào)不同,其他都相同的學(xué)生冗余信息A:deletetablcnamewhere

自動(dòng)編號(hào)notin(selectmin(自動(dòng)編號(hào))fromtablenamegroupby學(xué)號(hào),姓

名,課程編號(hào),課程名稱,分?jǐn)?shù))

3.一個(gè)叫team的表,里面只有一個(gè)字段name,一共有4條紀(jì)錄,分別是a,b,c,d,

對(duì)應(yīng)四個(gè)球隊(duì),現(xiàn)在四個(gè)球隊(duì)進(jìn)行比賽,用一條sql語句顯示所有可能的比賽組

合.

答:selecta.name,b.n^mefromteama,teambwherea.name<b.named.面試

題:怎么把這樣一個(gè)

yearmonthamount

199111.1

199121.2

199131.3

199141.4

199212.1

199222.2

199232.3

1碗42.4

查成這樣一個(gè)結(jié)果yearmlm2m3m4

19911.11.21.31.419922.12.22.32.4

selectyear,

(selectamountfrom

(selectamountfrom

(selectamountfrom

(cclc八十cmciin十

答案

selectyear,

(selectamountfromaaamwheremonth=landm.year=aaa.year)asml,

(selectamountfroniaaamwheremonth=2andm.year=aaa.year)asm2,

(selectamountfromaaainwheremonth=3andm.year=aaa.year)asm3,

aaamwharamont.h=4andm.year:aaa.year)asm4

fromaaagroupbyyear/TirtfcTaExmx?xmEMXmcf?■,Xn?m/n/八la3E/T?m

SQL:select*!5.說明:復(fù)制表(只復(fù)制結(jié)構(gòu),源表名:a新表名:b)

SQL:select*intobfromawhereK>1(wherel=l,拷貝表結(jié)構(gòu)和數(shù)據(jù)內(nèi)容)

ORACLE:createtableb

As

_<>笊)*(6^5aMzfec&npact)

訕擬兩個(gè)表達(dá)式。當(dāng)使用此運(yùn)算符比擬非空表達(dá)式時(shí),如果左操作數(shù)不等于右操

作數(shù),那么結(jié)果為TRUEo否那么,結(jié)果為FALSE。].

原表:

courseidcoursenamescore1java70

2oracle903xml40

4jsp305servlet80

105

為了便于閱讀,查詢此表后的結(jié)果顯式如下(及格分?jǐn)?shù)為60):courseid

coursenamescoremarkjava70pass

1oracle90passxml40fail

2jsp30failservlet80pass

寫出此查詢語句selectcourseid,coursename,score,if(score>=60,

pass","failff)asmarkfromcourse

7.表購物信息

購物人商品名稱數(shù)量

A甲2

B乙4

C丙1

AT2

給出所有購入確為兩種或兩種以上的購物人記錄

答:select*from購物信息where購物人in(select購物人from購物信息group

by購物人havingcount(*)>=2);8.

info表dateresult

2005-05-09win2005-05-09lose

2005-05-09lose2005-05-09lose

2005-05-10win2005-05-10lose

2005-05-10lose106

如果耍生成以下結(jié)果,該如何寫sql語句?winlose2005-05-0922

2005-05-1012答案:

(1)selectdate,sum(casewhenresult="win"then1else0end)as〃

win〃,sum(casewhenresult二"lose〃then1else0encl)as〃lose,!from

infogroupbydate;selecta.date,a.resultaswin,b.resultaslose

from

(selectdate,count(result)asresultfrominfowhereresult二"winf,

groupbydate)asa

join

(selectdate,count(result)asresultfrominfowhereresult=fflose"

groupbydate)asb

ona.date=b.date;107

第13章JVM13.1JVM內(nèi)存分哪幾個(gè)區(qū),每個(gè)區(qū)的作用是什么?

類裝載器子系統(tǒng)

Classloader

Classfiles

類裝載器子系統(tǒng)

Classloader

方法區(qū)

MethodArea

運(yùn)行時(shí)數(shù)據(jù)區(qū)(RuntimeDataArea)

方法區(qū)Java棧本法棧

MethodAreaJavastackNativeMethodStack

程序計(jì)數(shù)器

ProgramCounterRegister

堆Execution

heapEngine

java虛擬機(jī)主要分為以下幾個(gè)區(qū):

本地方法接口本地方法走

1)方法區(qū):NativeInterface

a.有時(shí)候也成為永久代,在該區(qū)內(nèi)很少發(fā)生垃圾回收,但是并不代表不發(fā)生GC,在這里進(jìn)行

的GC主要是對(duì)方法區(qū)里的常量池和對(duì)類型的卸載b.方法區(qū)主要用來存儲(chǔ)已被虛擬機(jī)加載

的類的信息、常量、靜態(tài)變量和即時(shí)編譯器編譯后的代碼等數(shù)據(jù)。

c.該區(qū)域是被線程共享的。

d.方法區(qū)里有一個(gè)運(yùn)行時(shí)常量池,用于存放靜態(tài)編譯產(chǎn)生的字面量和符號(hào)引用。該常量池具

有動(dòng)態(tài)性,也就是說常量并不一定是編譯時(shí)確定,運(yùn)行時(shí)生成的常量也會(huì)存在這個(gè)常量池

中。

2)虛擬機(jī)棧:

a.虛擬機(jī)棧也就是我們平常所稱的棧內(nèi)存,它為java方法服務(wù),每個(gè)方法在執(zhí)行的時(shí)候都會(huì)

創(chuàng)立一個(gè)棧幀,用于存儲(chǔ)局部變量表、操作數(shù)棧、動(dòng)態(tài)鏈接和方法出口等信息。

108

5)您還有什么想問的問題?

>這是表達(dá)個(gè)人眼界和層次的問題

>問題本身不在于面試官想得到什么樣的答案,而在于你跟別的應(yīng)聘者的比照

>標(biāo)準(zhǔn)答案:

公司希望我入職后的3-6個(gè)月內(nèi),給公司解決什么樣的問題公司(或者對(duì)這個(gè)部門)

未來的戰(zhàn)略規(guī)劃是什么樣子的?

以你現(xiàn)在對(duì)我的了解,您覺得我需要多長(zhǎng)時(shí)間融入公司?

6)您最快多長(zhǎng)時(shí)間能入職?

一周左右,如果公司需要,可以適當(dāng)提前兩個(gè)考前須知

1)職業(yè)化的語言2)職業(yè)化的形象

1.3.2自我介紹(控制在4分半以內(nèi),不超過5分鐘)1)個(gè)人基本信息

2)工作履歷

時(shí)間、公司名稱、任職崗位、主要工作內(nèi)容、工作業(yè)績(jī)、離職原因3)深度溝通(也叫壓

力面試)

刨根問底下沉式追問(注意是下沉式,而不是發(fā)散式的)

基本技巧:往自己熟悉的方向說第2章手寫代碼

2.1冒泡排序/★*

*冒泡排序時(shí)間復(fù)雜度0(n人2)空間復(fù)雜度0(1)

*/publicclassBubbleSort{

publicstaticvoidbubbleSort(int[]data){System.out.printin(〃開始排序”);

intarrayLength=data.lcngth;10

b.虛擬機(jī)棧是線程私有的,它的生命周期與線程相同。

c.局部變量表里存儲(chǔ)的是基本數(shù)據(jù)類型、returnAddress類型(指向一條字節(jié)碼指令的地址)

和對(duì)象引用,這個(gè)對(duì)象引用有可能是指向?qū)ο笃鹗嫉刂返囊粋€(gè)指針,也有可能是代表對(duì)象

的句柄或者與對(duì)象相關(guān)聯(lián)的位置。局部變量所需的內(nèi)存空間在編譯器間確定d.操作數(shù)棧的

作用主要用來存儲(chǔ)運(yùn)算結(jié)果以及運(yùn)算的操作數(shù),它不同于局部變量表通過索引來訪問,而

是壓棧和出棧的方式

e.每個(gè)棧幀都包含一個(gè)指向運(yùn)行時(shí)常量池中該棧幀所屬方法的引用,持有這個(gè)引用是為了支

持方法調(diào)用過程中的動(dòng)態(tài)連接.動(dòng)態(tài)鏈接就是將常量池中的符號(hào)引用在運(yùn)行期轉(zhuǎn)化為直接

引用。

3)本地方法棧:

本地方法棧和虛擬機(jī)棧類似,只不過本地方法棧為Native方法服務(wù)。

4)堆:

java堆是所有線程所共享的一塊內(nèi)存,在虛擬機(jī)啟動(dòng)時(shí)創(chuàng)立,幾乎所有的對(duì)象實(shí)例都在這里創(chuàng)

立,因此該區(qū)域經(jīng)常發(fā)生垃圾回收操作。

5)程序計(jì)數(shù)器:

內(nèi)存空間小,字節(jié)碼解釋器工作時(shí)通過改變這個(gè)計(jì)數(shù)值可以選取下一條需要執(zhí)行的字節(jié)碼指令,

分支、循環(huán)、跳轉(zhuǎn)、異常處理和線程恢復(fù)等功能都需要依賴這個(gè)計(jì)數(shù)器完成。該內(nèi)存區(qū)域是唯

一一個(gè)java虛擬機(jī)規(guī)范沒有規(guī)定任何00M情況的區(qū)域。

13.2Java類加載過程?

Java類加載需要經(jīng)歷一下幾個(gè)過程:

1)加載加載時(shí)類加載的第一個(gè)過程,在這個(gè)階段,將完成一下三件事情:

a.通過一個(gè)類的全限定名獲取該類的二進(jìn)制流。

b.將該二進(jìn)制流中的靜態(tài)存儲(chǔ)結(jié)構(gòu)轉(zhuǎn)化為方法去運(yùn)行時(shí)數(shù)據(jù)結(jié)構(gòu)。

C.在內(nèi)存中生成該類的Class對(duì)象,作為該類的數(shù)據(jù)訪問入口。

2)驗(yàn)證驗(yàn)證的目的是為了確保Class文件的字節(jié)流中的信息不回危害到虛擬機(jī).在該階段主要

完成以下四鐘驗(yàn)證:

a.文件格式驗(yàn)證:驗(yàn)證字節(jié)流是否符合Class文件的規(guī)范,如主次版本號(hào)是否在當(dāng)前虛擬機(jī)

范圍內(nèi),常量池中的常量是否有不被支持的類型.

b-元數(shù)據(jù)驗(yàn)證:對(duì)字節(jié)碼描述的信息進(jìn)行語義分析,如這個(gè)類是否有父類,是否集成了不被

繼承的類等。

C.字節(jié)碼驗(yàn)證:是整個(gè)驗(yàn)證過程中最復(fù)雜的一個(gè)階段,通過驗(yàn)證數(shù)據(jù)流和控制流的分析,109確

定程序語義是否正確,主要針對(duì)方法體的驗(yàn)證。如:方法中的類型轉(zhuǎn)換是否正確,跳轉(zhuǎn)指令是

否正確等。

d.符號(hào)引用驗(yàn)證:這個(gè)動(dòng)作在后面的解析過程中發(fā)生,主要是為了確保解析動(dòng)作能正確執(zhí)行。

已準(zhǔn)備準(zhǔn)備階段是為類的靜態(tài)變量分配內(nèi)存并將其初始化為默認(rèn)值,這些內(nèi)存都將在方法區(qū)

中進(jìn)行分配。準(zhǔn)備階段不分配類中的實(shí)例變量的內(nèi)存,實(shí)例變量將會(huì)在對(duì)象實(shí)例化時(shí)隨著對(duì)

象一起分配在Java堆中。

3)解析該階段主要完成符號(hào)引用到直接引用的轉(zhuǎn)換動(dòng)作,解析動(dòng)作并不一定在初始化動(dòng)作完成

之前,也有可能在初始化之后。

4)初始化初始化時(shí)類加載的最后一步,前面的類加載過程,除了在加載階段用戶應(yīng)用程序可

以通過自定義類加載器參與之外,其余動(dòng)作完全由虛擬機(jī)主導(dǎo)和控制。到了初始化階段,才

真正開始執(zhí)行類中定義的Java程序代碼。

13.3java中垃圾提供的方法有哪些?

1)引用計(jì)數(shù)法應(yīng)用于:微軟為C0M/ActionScrip3/Python等

a)如果對(duì)象沒有被引用,就會(huì)被回收,缺點(diǎn):需要維護(hù)一個(gè)引用計(jì)算器2)復(fù)制算法年

輕代中使用的是MinorGC,這種GC算法采用的是復(fù)制算法(Copying)

a)效率高,缺點(diǎn):需要內(nèi)存容量大,比擬耗內(nèi)存

b)使用在占空間比擬小、刷新次數(shù)多的新牛區(qū)3)標(biāo)記清除老年代一般是由標(biāo)記清除或者

是標(biāo)記清除與標(biāo)記整理的混合實(shí)現(xiàn)

a)效率比擬低,會(huì)差生碎片。

4)標(biāo)記壓縮老年代一般是由標(biāo)記清除或者是標(biāo)記清除與標(biāo)記整理的混合實(shí)現(xiàn)

a)效率低速度慢,需要移動(dòng)對(duì)象,但不會(huì)產(chǎn)生碎片,

5)標(biāo)記清除壓縮標(biāo)記清除-標(biāo)記壓縮的集合,屢次GC后才Compact

a)使用于占空間大刷新次數(shù)少的養(yǎng)老區(qū),是34的集合體如何判斷一個(gè)對(duì)象是否存活?

(或者GC對(duì)象的判定方法)

判斷一個(gè)對(duì)象是否存活有兩種方法:

1)引用計(jì)數(shù)法110

2)可達(dá)性算法(引用鏈法)什么是類加載器,類加載器有哪些?

實(shí)現(xiàn)通過類的權(quán)限定名獲取該類的二進(jìn)制字節(jié)流的代碼塊叫做類加載器。

主要有一下四種類加載器:

1)啟動(dòng)類加載器(BootslrapClassLoader)用來力n載java核心類庫,無法被java程序直接引用。

2)擴(kuò)展類加載器(extensionsclassloader):它用來加載Java的擴(kuò)展庫。Java虛擬機(jī)的實(shí)現(xiàn)會(huì)提供

一個(gè)擴(kuò)展庫目錄。該類加載器在此目錄里面查找并加載Java類。

3)系統(tǒng)類加載器(systemclassloader)也叫應(yīng)用類加載器:它根據(jù)Java應(yīng)用的類路徑

(CLASSPATH)來加載Java類。一般來說,Java應(yīng)用的類都是由它來完成加載的。

可以通過ClassLoader.getSystemClassLoader。來獲取它。

4)用戶自定義類加載器,通過繼承類的方式實(shí)現(xiàn)。

13.6簡(jiǎn)述Java內(nèi)存分配與收策略以及MinorGC和MajorGC

(fullGC)內(nèi)存分配:

1)棧區(qū):棧分為java虛擬機(jī)棧和本地方法棧2)堆區(qū):堆被所有線程共享區(qū)域,在虛擬機(jī)啟動(dòng)時(shí)

創(chuàng)立,唯一目的存放對(duì)象實(shí)例。堆區(qū)是gc的主要區(qū)域,通常情況下分為兩個(gè)區(qū)塊年輕代和年老

代。更細(xì)一點(diǎn)年輕代又分為Eden區(qū),主要放新創(chuàng)立對(duì)象,F(xiàn)romsurvivor和Tosurvivor保存

gc后幸存下的對(duì)象,默認(rèn)情況下各自占比8:l:k

3)方法區(qū):被所有線程共享區(qū)域,用于存放已被虛擬機(jī)加載的類信息,常量,靜態(tài)變量等數(shù)據(jù)。

被Java虛擬機(jī)描述為堆的一個(gè)邏輯局部。習(xí)慣是也叫它永久代(pennanmentgencration)4)

程序計(jì)數(shù)器:當(dāng)前線程所執(zhí)行的行號(hào)指示器。通過改變計(jì)數(shù)器的值來確定下一條指令,比

方循環(huán),分支,跳轉(zhuǎn),異常處理,線程恢復(fù)等都是依賴計(jì)數(shù)器來完成。線程私有的。

回收策略以及MinorGC和MajorGC:

1)對(duì)象優(yōu)先在堆的Eden區(qū)分配。

2)大對(duì)象直接進(jìn)入老年代。

3)長(zhǎng)期存活的對(duì)象將直接進(jìn)入老年代。

當(dāng)Eden區(qū)沒有足夠的空間進(jìn)行分配時(shí),虛擬機(jī)會(huì)執(zhí)行一次MinorGC.MinorGC通常發(fā)生在新

生代的Eden區(qū),在這個(gè)區(qū)的對(duì)象生存期短,往往發(fā)生GC的頻率較高,回收速度比擬llI快;Full

Gc/MajorGC發(fā)生在老年代,一般情況下,觸發(fā)老年代GC的時(shí)候不會(huì)觸發(fā)MinorGC,但是通過

配置,可以在FullGC之前進(jìn)行一次MinorGC這樣可以加快老年代的回收速度。

第14章JUCSynchronized與Lock的區(qū)另lj

1)Synchronized能實(shí)現(xiàn)的功能Lock都可以實(shí)現(xiàn),而且Lock比Synchronized更好用,更靈

活。

2)Synchronized可以自動(dòng)上鎖和解鎖;Lock需要手動(dòng)上鎖和解鎖Runnable和Callable的

區(qū)別

1)Runnable接口中的方法沒有返回值:Callable接口中的方法有返叵I值Runnable接口中的方

法沒有拋出異常;Callable接口中的方法拋出了異常

2)Runnable接口中的落地方法是call方法;Callable接口中的落地方法是run方法

什么是分布式鎖

當(dāng)在分布式模型下,數(shù)據(jù)只有一份(或有限制),此時(shí)需要利用鎖的技術(shù)控制某一時(shí)刻修改

數(shù)據(jù)的進(jìn)程數(shù)。分布式鎖可以將標(biāo)記存在內(nèi)存,只是該內(nèi)存不是某個(gè)進(jìn)程分配的內(nèi)存而是公共

內(nèi)存,如Rudis,通過scl(key,value,nx,px,liineoul)方法添力口分飾式鎖。

14.1什么是分布式事務(wù)

分布式事務(wù)指事務(wù)的參與者、支持事務(wù)的服務(wù)器、資源服務(wù)器以及事務(wù)管理器分別位于不

同的分布式系統(tǒng)的不同節(jié)點(diǎn)之上。簡(jiǎn)單的說,就是一次大的操作由不同的小操作組成,這些小

的操作分布在不同的服務(wù)器上,且屬于不同的應(yīng)用,分布式事務(wù)需要保證這些小操作要么全部

成功,要么全部失敗。

第15章模擬考試選擇題

14.1.1HDFS1,下面哪個(gè)程序負(fù)責(zé)HDFS數(shù)據(jù)存儲(chǔ)?

a)NameNodeb)Jobtrackerc)Datanoded)secondaryNameNodee)tasktrackerHDfS中的block

默認(rèn)保存幾份?

心3份房2份61份d)不確定以下哪個(gè)程序通常與NameNode在一個(gè)節(jié)點(diǎn)啟動(dòng)?

112

a)SecondaryNameNodeb)DataNodec)TaskTrackerd)Jobtracker

解析:

JobTracker對(duì)應(yīng)于NameNode

TaskTracker對(duì)應(yīng)于DataNodeHDFS默認(rèn)BlockSize

a)32MBb)64MBc)128MB

注:舊版本是64MBelient端上傳文件的時(shí)候以下哪項(xiàng)正確

a)數(shù)據(jù)經(jīng)過NameNode傳遞給DataNode

b)Client端將文件切分為Block,依次上傳

c)Client只上傳數(shù)據(jù)到一臺(tái)DataNode,然后由NameNode負(fù)貢Block宴制工作

分析:

Client向NameNode發(fā)起文件寫入的請(qǐng)求。

NameNode根據(jù)文件大小和文件塊配置情況,返回給Client它所管理局部DataNode的信

Client將文件劃分為多個(gè)Block,根據(jù)DataNode的地址信息,按順序?qū)懭氲矫恳粋€(gè)

DataNode塊中。

2.下面與HDFS類似的框架是?C

ANTFSBFAT32CGESDEX13集群管埋

L以下哪項(xiàng)通常是集群的最主要瓶頸C

a)CPUb)網(wǎng)絡(luò)c)磁盤10d)內(nèi)存.關(guān)于SecondaryNameNode哪項(xiàng)是正確的?C

a)它是NameNode的熱各

b)它對(duì)內(nèi)存沒有要求

c)它的目的是幫助NameNode合并編輯日志,減少NameNode啟動(dòng)時(shí)間

d)SecondaryNameNode應(yīng)與NameNode部署到一個(gè)節(jié)點(diǎn).配置機(jī)架感知的下面哪項(xiàng)正確C

a)如果一個(gè)機(jī)架出問題,不會(huì)影響數(shù)據(jù)讀寫113

b)寫入數(shù)據(jù)的時(shí)候會(huì)寫到不同機(jī)架的DataNode中

c)M叩Reduce會(huì)根據(jù)機(jī)架獲取離自己比擬近的網(wǎng)絡(luò)數(shù)據(jù)4,以下哪個(gè)是Hadoop運(yùn)行的模

式ABC

a)單機(jī)版b)偽分布式c)分布式5.Cloudera提供哪幾種安裝式H的方法A

a)Clouderamanagerb)Tarballc)Yumd)Rpm14.1.3ZookeeperStill

1.卜面與Zookeeper類似的框架是?D

AProtobuf

BJava

CKafka

DChubby14.2判斷題

14.2.1集群管理

Ganglia不僅可以進(jìn)行監(jiān)控,也可以進(jìn)行告警。(正確)

1.Nagios不可以監(jiān)控Hadocp集群,因?yàn)樗惶峁〩adoop支持。(錯(cuò)誤)如果NameNode意

外終止,SecondaryNameNode會(huì)接替它使集群繼續(xù)工作。(錯(cuò)誤)

2.ClouderaCDH是需要付費(fèi)使用的。(錯(cuò)誤)NameNode負(fù)責(zé)管理metadata,client端每次讀

寫請(qǐng)求,它都會(huì)從磁盤中讀取或那么會(huì)寫入metadata信息并反應(yīng)client端。(錯(cuò)誤)

3.DataNodc通過長(zhǎng)連接與NamcNodc保持通信。錯(cuò)誤

Hadoop自身具有嚴(yán)格的權(quán)限管理和平安措施保障集群正常運(yùn)行。(錯(cuò)誤)

4.Slave節(jié)點(diǎn)要存儲(chǔ)數(shù)據(jù),所以它的磁盤越大越好。(錯(cuò)誤)hadoopdfsadmin-report命

令用于檢測(cè)HDFS損壞塊。(借誤)

5.Hadoop默認(rèn)調(diào)度器策略為FIFO(錯(cuò)誤)

集群內(nèi)每個(gè)節(jié)點(diǎn)都應(yīng)該配RAID,這樣防止單磁盤損壞,影響整個(gè)節(jié)點(diǎn)運(yùn)行。(錯(cuò)誤)

6.Hadoop環(huán)境變量中的HADOOP.HEAPSIZE用于設(shè)置所有Hadoop守護(hù)線程的內(nèi)存。它

默認(rèn)是2()0GB。(錯(cuò)誤)114

7.DataNode首次加入cluster的時(shí)候,如果log中報(bào)告不兼容文件版本,那需要NameNode執(zhí)

行一Hadoopnamenode-formatII操作格式化磁盤。(錯(cuò)誤)

14.2.2HDFSBlockSize是不可以修改的。(錯(cuò)誤)

1.Hadoop支持?jǐn)?shù)據(jù)的隨機(jī)讀寫。(錯(cuò))3?因?yàn)镠DFS有多個(gè)副本,所以NameNode是不存

在單點(diǎn)問題的。(錯(cuò)誤)

14.2.3MapReducel.Hadoop是Java開發(fā)的,所以MapReduce只支持Java語言編

寫。(錯(cuò)誤)

2.每個(gè)map就是■■個(gè)線程。(錯(cuò)誤).Mapreduce的inputsplit就是一個(gè)blocko(錯(cuò)

誤)

115

for(inti=0;i<arrayLength-1;i++){booleanflag=false;

for(intj=0;j<arrayLength-1-i;j++){if(data[j]>data[j+1]){

inttemp=data[j+l];data[j+1]=data|j);

data[j]=tcmp;flag=true;

))

System.out.printin(java.util.Arrays.toString(data));if(!flag)break;

)

)

publicstaticvoidmain(String[]args){int[]data={9,-16,21,23,-30,-49,21,30,30);

System.out.println(*'序之前:\nn+java.util.Arrays.toString(data));

bubbleSort(data);System.out.printinC排序之后:W+

java.util.Arrays.toString(data));

))

二分查找全流程fAaikeba

125810253564

10

Ie代midright2.2二分查找

二分查找前提:數(shù)組有序

10>&向左道歷.mid敏值給left,杳找范圍城半二分堂找的思路.先找到中間值

.然后將中間值和查找值比擬相等,找出

中向值>查找值,向左進(jìn)行遞歸查找中聞伍<杏找便,向右進(jìn)行遞歸杳找

findVai

[00leftmidright如果存在值,就返回而應(yīng)的卜標(biāo).否那么返回t圖4-二分查找核心思路

10<25,向右遍歷.midright,查找英圖再次減半

leftmidright

10=10、找到.返回Ed

實(shí)現(xiàn)代碼:

/**

*二分查找時(shí)間復(fù)雜度0(【og2n);空間復(fù)雜度0(1)

*/defbinarySearch(arr:Array[Int]rleft:Int,right:Int,findVai:Int):

Int={

if(left)right){〃遞歸退出條件,找不到,返回-1

-1

valmidIndex=(left+right)/2if(findVal<arr(midLnd?x)){〃向左遞歸查找

biiiaiySeaich(aii,left,inidiiidex,fiudVal)

}elseif(findVal>arr(midI:ndex)){〃向右遞歸查找binarySearch(arrf

midIndex,righl,findVal)}else{〃查找至Ij,返回下標(biāo)midIndex

))拓展需求:當(dāng)一個(gè)有序數(shù)組中,有多個(gè)相同的數(shù)值時(shí),如何將所有的數(shù)值都查找到。

代碼實(shí)現(xiàn)如下:

i大

{1,8,10,89,1000,1000,1234}當(dāng)?個(gè)有序數(shù)組中,有多個(gè)相同的數(shù)值時(shí),如何將所有的數(shù)

值都查找到,比方這里的1000.

〃分析

1.返回的結(jié)果是一個(gè)可變數(shù)組ArrayBuff一r

2.在找到結(jié)果時(shí),向左邊掃描,向右邊掃描[條件]

3.找到結(jié)果后,就加入到ArrayBuffer

*/defbinar)rSearch2(arr:Array[Int],1:工nt,r:Int,findVal:Int):

ArrayBuffer[Int]={

〃找不到條件?

if(l>r){

returnArrayBuffer())

valmidlndex=(1+r)/2

valmidVai=arr(midlndex)

if(midVai>findVal){〃向左進(jìn)行遞歸查找

binarySearch2(arr,1,midlndex-lrfindVal))elseif(midVai<findVal){〃向右進(jìn)行遞

歸查找binaryScarch2(arr,midlndex+lrfindVal)

}else{

printin(^micllndex^+mid工nd一x)//定義一個(gè)可變數(shù)組

valresArr=ArrayBuffer[Int]()〃向左邊掃描

vartemp=midIndex-1

breakable(12

while(true){if(temp<0||

arr(temp)!=findVai){break

0

)if(arr(temp)

==findVal)

{resArr.appe

nd(temp)

)temp-=1

)

)

〃將中間這個(gè)索引加入resArr.append(midlndex)〃向右邊掃描temp=midlndex+1

breakable{while(true){

if(temp>arr.length-1||arr(temp)!=findVai){break())

if(arr(temp)==findVal){resArr.append(temp))

temp+=1)

}returnresArr)

2.3快排

k'ikaba

快速排序圖解核心思想

1.取數(shù)組最左邊為左點(diǎn)(15),取數(shù)組最右邊為6點(diǎn)口6),取數(shù)阻中間值為基準(zhǔn)點(diǎn)(即將數(shù)據(jù)分成西阻的中間值點(diǎn)10)varhint=left

157108<—16varr:Int=right

varpivot7rMieft+nght)/2),左點(diǎn)向右走,到大于中間值此時(shí)右點(diǎn)向左走,在到小于中間值交換左右點(diǎn)的(ft

while(an(l)<pivotl(while(arr(r)>pivotl(temp=arr(l)l+=lr-=larr(l)=arr(r)

}}arr(r)=:emp

2

87_>101516左點(diǎn)向右走’“到大于中間值(無),比時(shí)右點(diǎn)向左上’“到小于中間值(無3第?輪結(jié)束

if(l>=r){

break。

3.這中間值左右兩邊拘個(gè)數(shù)級(jí)調(diào)用自身排序方法(遞歸),將左方兩個(gè)數(shù)組博序if0eft<r){l“rlght>l){

87101516quicksort-r,arr)quicksortsright,arr)ii

5?nn.

圖1-快速排序核心思想

78101516

代碼實(shí)現(xiàn):

/**

*快排

*時(shí)間復(fù)雜度:平均時(shí)間復(fù)雜度為O(nlogn)13

上空間復(fù)雜度:0(logn),因?yàn)檫f歸??臻g的使用問題

*/defquicksort(list:List[Int]):List[Int]=listmatch{caseNi1=>Ni1

caseList()=>List()

casehead::tail=>

val(left,right)=tail.partition(_<head)quicksort(left):二head::quicksort(right))

2.4歸并

歸并排序k'alkeba

核心思想

分一

核心思想:不斷的將大的數(shù)組分成兩個(gè)小數(shù)組,直到不能拆分為止,即形成了單個(gè)值。此

圖2-歸并排序核心思想

時(shí)使用合并的排序思想對(duì)己經(jīng)有序的數(shù)組進(jìn)行合并,合并為一個(gè)大的數(shù)據(jù),不斷重復(fù)此過程,

直到最終所有數(shù)據(jù)合并到一個(gè)數(shù)組為止。

14

歸并排序治流程

1<4,將1收入tempj右移temp

temp

2<4刈2放入tempMi核

_temp

7>6,將6取入temp,此時(shí)IH經(jīng)足出大用

456

直按珞1號(hào)數(shù)組剜余數(shù)據(jù)添加至期時(shí)數(shù)出

最后:將臨時(shí)數(shù)組的數(shù)據(jù)拷貝回原數(shù)組

圖3.歸并排序“治”流程

代碼實(shí)現(xiàn):

/**

*快排

*時(shí)間復(fù)雜度:O(n)ogn)

*空間復(fù)雜度:0(n)

*/defmerge(left:List[Int],right:List[Int]):List[Int]=(left,right)

nicitch{

case(Nil,_)=>right

case(_,Nil)=>left

case(x::xTail,y::yTail)=>if(x<=y)x::merge(xTail,right)

elsey::merge(left,yTail)

)15

2.5二叉樹之Scala實(shí)現(xiàn)二叉樹概念

二叉樹的概念fzaikeba

1)樹有很多種,每個(gè)節(jié)點(diǎn)最多只旨總有兩個(gè)子節(jié)點(diǎn)的一種形式稱為二叉樹-

2)二叉的的子節(jié)點(diǎn)分為左節(jié)點(diǎn)和右節(jié)點(diǎn).

3)如果該二叉樹的所有葉子節(jié)點(diǎn)都在最后一層,并且結(jié)點(diǎn)總數(shù)=2八n-l,n為層數(shù),那么我們稱為滿二叉W,

4)如果該二叉樹的所有葉子節(jié)點(diǎn)都在最后一層或者倒數(shù)第二層,而且最后一層的葉子節(jié)點(diǎn)在左邊連續(xù),倒數(shù)第二層的葉子節(jié)點(diǎn)在右邊連續(xù).

我們稱為完全二叉樹.

二叉樹滿二叉樹完全二叉樹,如果把《61>節(jié)點(diǎn)刪除,

二叉樹的特點(diǎn)就不是完全二叉樹了,因?yàn)槿~子節(jié)點(diǎn)不連城了

1)樹執(zhí)行查找、刪除、插入的時(shí)間復(fù)雜度都是0(logN)

2)遍歷二叉樹的方法包括前序、中序、后序

3)非平衡樹指的是根的左右兩邊的子節(jié)點(diǎn)的數(shù)量不一致

4)在非空二叉樹中,第i層的結(jié)點(diǎn)總數(shù)不超過,i>=l;

5)深度為h的二叉樹最多有個(gè)結(jié)點(diǎn)(h>=l),最少有h個(gè)結(jié)點(diǎn);

6)對(duì)于任意一棵二叉樹,如果其葉結(jié)點(diǎn)數(shù)為NO,而度數(shù)為2的結(jié)點(diǎn)總數(shù)為N2,那么

NON2+1;

2.5.1二叉樹的Scala代碼實(shí)現(xiàn)

定義節(jié)點(diǎn)以及前序、中序、后序遍歷classTreeNode(treeNo:Int){valno=treeNo

varleft:TreeNode=nullvarright:TreeNode=null

〃后序遍歷

defpostOrderO:Unit={

〃向左遞歸輸出左子樹16

//向右遞歸輸出右子樹if(this,right!=null)

)

〃輸出當(dāng)前節(jié)點(diǎn)值

n

printf(〃節(jié)點(diǎn)信息no=%d\nzno))

//中序遍歷

definfixOrdcr():Unit={

〃向左遞歸輸出左子樹if(this,left!=null){this.left.infixOrder()

)

〃輸出當(dāng)前節(jié)點(diǎn)值

printf("節(jié)點(diǎn)信息no=%d\nnzno)

〃向右遞歸輸出右子樹if(this,right!=null){this.right.infixOrder()

)

)

〃前序遍歷

defpreOrder():Unit={

〃輸出當(dāng)前節(jié)點(diǎn)值

printf(“節(jié)點(diǎn)信息no=%d\n”,no)

〃向左遞歸輸出左子樹if(this,left!=null){this.left.postOrder()

)

〃向右遞歸輸出右子樹if(this,right!=null){this,right.preOrder0

〃后序遍歷查找

defpostOrderSearch(no:Inc):TreeNodc={

〃向左遞歸輸出左子樹

varresNode:TreeNode=null

if(this.left!=null){

resNodc=this.lcft.postOrdcrScarch(no))it(rcsNodc!=null){returnresNodc

)

if(this.right!=null){

resNode=this.right.postOrderSearch(no))

if(resNode!=null){17

returnresNodc

)

printin("ttt??”)if(this.no==no){returnthis

)

resNode

〃中序遍歷查找

definfixOrderSearch(no:Int):TreeNode={

varresNode:TreeNode=null

〃先向左遞歸查找

if(this.left!=null){resNode=this.left.infixOrderSearch(no))if(resNode!=null){return

resNode

)

printin("yyy-----")if(no==this.no){returnthis

)

〃向右遞歸查找

if(this.right!=null){resNode=this.right.infixOrderSearch(no))returnresNode

)

〃前序查找

defpreOrderSearch(no:Int):TreeNode={if(no==this.no){returnthis

)

〃向左遞歸查找

varresNode:TreeNode=null

if(this

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論