Kotlin知识点
1.說(shuō)說(shuō)Kotlin和Java有什么區(qū)別
與Java 100%互通,并具備諸多Java尚不支持的新特性。 1 kotlin語(yǔ)言更加簡(jiǎn)潔,比如數(shù)據(jù)類 Data Classes- 在Kotlin中有數(shù)據(jù)類,它們導(dǎo)致自動(dòng)生成樣板,如equals,hashCode,toString,getter / setter等等
2 kotlin不必明確指定每個(gè)變量的類型,系統(tǒng)會(huì)自動(dòng)判斷
3 Kotlin的空安全性很好,擺脫NullPointerExceptions。這種類型的系統(tǒng)幫助我們避免空指針異常。
4 Kotlin允許我們擴(kuò)展現(xiàn)有類的功能,而不繼承它們或者使util類
5 Kotlin是功能性的編程語(yǔ)言,Kotlin由許多有用的方法組成,其中包括高階函數(shù),lambda表達(dá)式,運(yùn)算符重載等功能性編程使得Kotlin在收藏上更加便利
2.遞歸和迭代的區(qū)別
遞歸指的是函數(shù)自身會(huì)調(diào)用自身,造成嵌套調(diào)用,這種方式會(huì)在嵌套數(shù)過(guò)多的情況下,引起程序發(fā)生棧內(nèi)存溢出異常,問(wèn)題的出現(xiàn)是因?yàn)榍短走^(guò)多的情況下,棧內(nèi)存中保存了所有的函數(shù)調(diào)用棧,且不會(huì)回收,當(dāng)超出極限時(shí),即發(fā)生報(bào)錯(cuò)
而迭代時(shí),棧內(nèi)存中的變量會(huì)在不需要時(shí)就回收,不會(huì)因?yàn)榈螖?shù)過(guò)多,導(dǎo)致使用的內(nèi)存相應(yīng)增長(zhǎng)的情況.也就不會(huì)有遞歸的問(wèn)題.
使用遞歸算法,邏輯會(huì)比使用迭代簡(jiǎn)單.
kotlin中支持尾遞歸優(yōu)化,其實(shí)現(xiàn)原理是將遞歸代碼自動(dòng)轉(zhuǎn)化為迭代代碼.
| 遞歸 | 邏輯比較簡(jiǎn)單, 容易實(shí)現(xiàn) | 如果遞歸層級(jí)比較深, 易造成棧內(nèi)存溢出(內(nèi)存開(kāi)銷比較大) |
| 迭代 | 內(nèi)存開(kāi)銷小 | 抽象出數(shù)學(xué)模型, 不容易理解, 編寫(xiě)代碼較為困難 |
3.抽象類和接口的區(qū)別
抽象類可用于繼承,接口用于被實(shí)現(xiàn),單繼承,多實(shí)現(xiàn)
抽象類指的是事物的本質(zhì)屬性
接口用于表示事物的能力
| 區(qū)別1 | 標(biāo)識(shí)符: abstract | 標(biāo)識(shí)符: interface |
| 區(qū)別2 | 反映的是事物的本質(zhì) | 反映的是事物的能力 |
| 區(qū)別3 | 只能單繼承 | 可以多繼承 |
| 區(qū)別4 | 可以沒(méi)有方法和字段 | 必須有方法或字段 |
4.解釋一下泛型和泛型擦除
泛型,即“參數(shù)化類型”,就是將類型由原來(lái)的具體的類型參數(shù)化,類似于方法中的變量參數(shù),此時(shí)類型也定義成參數(shù)形式(可以稱之為類型形參),然后在使用/調(diào)用時(shí)傳入具體的類型(類型實(shí)參)。泛型的本質(zhì)是為了參數(shù)化類型(在不創(chuàng)建新的類型的情況下,通過(guò)泛型指定的不同類型來(lái)控制形參具體限制的類型)。也就是說(shuō)在泛型使用過(guò)程中,操作的數(shù)據(jù)類型被指定為一個(gè)參數(shù),這種參數(shù)類型可以用在類、接口和方法中,分別被稱為泛型類、泛型接口、泛型方法。
使用泛型好處是讓編譯器保留參數(shù)類型信息,執(zhí)行類型檢查,執(zhí)行類型轉(zhuǎn)換操作,同時(shí)省掉了顯式的強(qiáng)制類型轉(zhuǎn)換,保證了這些類型轉(zhuǎn)換的正確性,保證類型安全,并實(shí)現(xiàn)了更為通用的算法。
泛型擦除,泛型信息只存在于代碼編譯階段,在進(jìn)入 JVM 之前,與泛型相關(guān)的信息會(huì)被擦除掉
在kotlin中可以使用inline+reified組合的方式,提供在運(yùn)行時(shí)獲取泛型的能力
fun main(args: Array<String>) {val box1 = Box<String>("")val box2 = Box<Int>(10) } inline fun <reified T> Box(thing: T) {val type = T::classprintln(type) } 復(fù)制代碼5.解釋一下委托,以及他的作用
委托模式是軟件設(shè)計(jì)模式中的一項(xiàng)基本技巧。在委托模式中,有兩個(gè)對(duì)象參與處理同一個(gè)請(qǐng)求,接受請(qǐng)求的對(duì)象將請(qǐng)求委托給另一個(gè)對(duì)象來(lái)處理。
Kotlin 直接支持委托模式,更加優(yōu)雅,簡(jiǎn)潔。Kotlin 通過(guò)關(guān)鍵字 by 實(shí)現(xiàn)委托。
如:類的委托,即一個(gè)類中定義的方法實(shí)際是調(diào)用另一個(gè)類的對(duì)象的方法來(lái)實(shí)現(xiàn)的。
屬性委托,指的是一個(gè)類的某個(gè)屬性值不是在類中直接進(jìn)行定義,而是將其托付給一個(gè)代理類,從而實(shí)現(xiàn)對(duì)該類的屬性統(tǒng)一管理。
-
類委托
一個(gè)類中定義的方法實(shí)際上是調(diào)用其他另一個(gè)類的對(duì)象的方法來(lái)實(shí)現(xiàn)的
-
屬性委托
一個(gè)類的某個(gè)屬性值不是在類中直接進(jìn)行定義,而是將其托付給一個(gè)代理類,從而實(shí)現(xiàn)對(duì)該類的屬性統(tǒng)一管理
6.列舉一些你經(jīng)常用到的高階函數(shù)
7.說(shuō)明一下接口回調(diào)和函數(shù)式回調(diào)
接口回調(diào)
函數(shù)式回調(diào)
8.描述一下函數(shù)式編程有什么好處
在函數(shù)式編程中,由于數(shù)據(jù)全部都是不可變的,所以沒(méi)有并發(fā)編程的問(wèn)題,是多線程安全的。可以有效降低程序運(yùn)行中所產(chǎn)生的副作用,對(duì)于快速迭代的項(xiàng)目來(lái)說(shuō),函數(shù)式編程可以實(shí)現(xiàn)函數(shù)與函數(shù)之間的熱切換而不用擔(dān)心數(shù)據(jù)的問(wèn)題,因?yàn)樗且院瘮?shù)作為最小單位的,只要函數(shù)與函數(shù)之間的關(guān)系正確即可保證結(jié)果的正確性。
函數(shù)式編程的表達(dá)方式更加符合人類日常生活中的語(yǔ)法,代碼可讀性更強(qiáng)。實(shí)現(xiàn)同樣的功能函數(shù)式編程所需要的代碼比面向?qū)ο缶幊桃俸芏?#xff0c;代碼更加簡(jiǎn)潔明晰。函數(shù)式編程廣泛運(yùn)用于科學(xué)研究中,因?yàn)樵诳蒲兄袑?duì)于代碼的工程化要求比較低,寫(xiě)起來(lái)更加簡(jiǎn)單,所以使用函數(shù)式編程開(kāi)發(fā)的速度比用面向?qū)ο笠吆芏?#xff0c;如果是對(duì)開(kāi)發(fā)速度要求較高但是對(duì)運(yùn)行資源要求較低同時(shí)對(duì)速度要求較低的場(chǎng)景下使用函數(shù)式會(huì)更加高效。
參考 https://www.cnblogs.com/zhenw/p/6160931.html
1.代碼簡(jiǎn)潔,開(kāi)發(fā)快速
函數(shù)式編程大量使用函數(shù),減少了代碼的重復(fù),因此程序比較短,開(kāi)發(fā)速度較快。
2.接近自然語(yǔ)言,易于理解
函數(shù)式編程的自由度很高,可以寫(xiě)出很接近自然語(yǔ)言的代碼。
3.更方便的代碼管理
函數(shù)式編程不依賴、也不會(huì)改變外界的狀態(tài),只要給定輸入?yún)?shù),返回的結(jié)果必定相同。
4.易于"并發(fā)編程"
函數(shù)式編程不需要考慮"死鎖"(deadlock),因?yàn)樗恍薷淖兞?#xff0c;所以根本不存在"鎖"線程的問(wèn)題。不必?fù)?dān)心一個(gè)線程的數(shù)據(jù),被另一個(gè)線程修改,所以可以很放心地把工作分?jǐn)偟蕉鄠€(gè)線程,部署"并發(fā)編程"(concurrency)。
9.什么是dsl, dsl有什么優(yōu)點(diǎn)
dsl(Domain specific language)指的是專注于特定問(wèn)題領(lǐng)域的計(jì)算機(jī)語(yǔ)言,與GPL不同.特定領(lǐng)域可以是某一個(gè)產(chǎn)業(yè),例如保險(xiǎn)教育航空醫(yī)療,也可以是某一個(gè)方法或者技術(shù),例如數(shù)據(jù)庫(kù),html
DSL只是問(wèn)題解決方案模型的外部封裝,這個(gè)模型可能是一個(gè)API庫(kù),也可能是一個(gè)完整的框架
沒(méi)有具體的標(biāo)準(zhǔn)來(lái)區(qū)分DSL和普通的API,DSL代碼更易于理解,不僅對(duì)于開(kāi)發(fā)人員而且對(duì)于技術(shù)含量較低的人員來(lái)說(shuō)也更易于理解。
10.gradle是什么,有什么用處
gradle是一個(gè)自動(dòng)化的構(gòu)建工具,可以實(shí)現(xiàn)用代碼編寫(xiě)功能的需求,可用來(lái)編譯測(cè)試,依賴管理,通過(guò)DSL自定義拓展任務(wù),總之他是一個(gè)很牛逼的構(gòu)建工具,構(gòu)建一切可構(gòu)建的內(nèi)容
11.task的生命周期
分為掃描時(shí)生命周期,和運(yùn)行時(shí)生命周期,定義在doFirst和doLast中.
直接寫(xiě)在task中的代碼 在 掃描時(shí)生命周期 執(zhí)行, 順序由定義時(shí)上下順序決定
而運(yùn)行時(shí)生命周期的代碼 會(huì)在掃描后執(zhí)行,而且執(zhí)行順序由task之間的依賴順序決定
12.線程join有什么作用
- 將線程之間的并行執(zhí)行變成串行執(zhí)行
- 讓主線程和新線程按編程順序執(zhí)行
13.線程和協(xié)程的區(qū)別
協(xié)程是一種用戶態(tài)的輕量級(jí)線程,協(xié)程的調(diào)度完全由用戶控制。
線程是進(jìn)程的一個(gè)實(shí)體,是CPU調(diào)度和分派的基本單位,它是比進(jìn)程更小的能獨(dú)立運(yùn)行的基本單位.
協(xié)程和線程的區(qū)別
1 一個(gè)線程可以多個(gè)協(xié)程,一個(gè)進(jìn)程也可以單獨(dú)擁有多個(gè)協(xié)程
2 線程進(jìn)程都是同步機(jī)制,而協(xié)程則是異步
3 協(xié)程能保留上一次調(diào)用時(shí)的狀態(tài),每次過(guò)程重入時(shí),就相當(dāng)于進(jìn)入上一次調(diào)用的狀態(tài)
14.描述協(xié)程的工作原理
協(xié)程通過(guò)掛起 耗時(shí)的 非阻塞的 可掛起函數(shù),從而使耗時(shí)操作不阻塞程序的運(yùn)行, 在掛起的函數(shù)結(jié)束掛起后,從線程池中提供空閑的線程去繼續(xù)執(zhí)行
總結(jié)
- 上一篇: 问题:linux系统经常出现断网的情况,
- 下一篇: 入门设计模式之建造者模式