Android面試知識(shí)整理-java篇

Android面試知識(shí)整理-android基礎(chǔ)知識(shí)

Android面試知識(shí)整理-性能優(yōu)化

Android面試知識(shí)整理-android版本新特性

以下內(nèi)容,是我根據(jù)自己的理解,對(duì)Java知識(shí)進(jìn)行總結(jié),如有不足谤辜,希望大神多多指正忌锯。

1.java虛擬機(jī)

內(nèi)存包括內(nèi)存共享區(qū)和內(nèi)存私有區(qū),共享區(qū)包括堆和方法區(qū),私有區(qū)包括虛擬機(jī)棧、局部變量表栅受、本地方法區(qū),除了這些一些虛擬機(jī)還包括直接內(nèi)存恭朗,通過NIO技術(shù)可以操作屏镊。

:中包括幾乎所有對(duì)象和數(shù)組,虛擬機(jī)優(yōu)化之后痰腮,一些對(duì)象會(huì)在棧上執(zhí)行而芥,是因?yàn)樘右菁夹g(shù)。

方法區(qū):包括final膀值、static棍丐、編譯后的class。

虛擬機(jī)棧:包括局部變量表沧踏、操作數(shù)棧歌逢、返回地址、動(dòng)態(tài)鏈接翘狱、本地線程緩存等秘案,進(jìn)行對(duì)象引用的入棧出棧操作,局部變量表中存放一些基本數(shù)據(jù)類型和局部變量的引用潦匈。

本地方法棧:存放native的方法

程序計(jì)數(shù)器:為當(dāng)前線程進(jìn)行標(biāo)識(shí)阱高,為什么需要程序計(jì)數(shù)器?因?yàn)樾枰€程切換

為什么jvm要使用棧茬缩,先進(jìn)后出赤惊,符合方法間的調(diào)用

2.垃圾回收機(jī)制

垃圾回收主要是堆和方法區(qū),按照GC Root引用鏈凰锡,回收引用的對(duì)象未舟,包括棧中引用圈暗、本地方法區(qū)引用、final处面、static引用的對(duì)象厂置。其中方法區(qū)回收效率差,只回收無用final和無用類魂角。

引用分為:

強(qiáng)引用昵济,new對(duì)象,只要存在就不會(huì)回收,只有當(dāng)引用為null時(shí)野揪,才會(huì)回收

軟引用,在內(nèi)存溢出OOM時(shí)進(jìn)行回收

弱引用访忿,下一次垃圾回收gc時(shí)候回收

虛引用,在回收時(shí)候進(jìn)行一些操作斯稳,收到一個(gè)系統(tǒng)通知

另外海铆,沒有引用,內(nèi)存滿了必然回收

分為新生代挣惰、老年代卧斟、永久帶(方法區(qū))

gc算法一般分為copy算法、mark算法憎茂、分代收集算法

copy算法使用一個(gè)大的Eden空間和兩個(gè)小的survivor空間珍语,將存活的對(duì)象,先復(fù)制到Eden和一個(gè)survivor里竖幔,不夠再使用survivor板乙,再不夠使用老年代,始終保證一個(gè)survivor為空閑拳氢。

Mark算法標(biāo)記存活的進(jìn)行回收

3.多線程并發(fā)

CPU核心數(shù)即通常說的雙核募逞、四核、八核馋评,線程數(shù)一般與核心數(shù)為2:1的關(guān)心放接,源于后來Intel提出的超線程技術(shù)。

而我們通常開發(fā)時(shí)用到的線程是通過時(shí)間片輪轉(zhuǎn)機(jī)制留特,將線程分為一個(gè)個(gè)時(shí)間片實(shí)現(xiàn)并發(fā)的纠脾。

進(jìn)程是操作系統(tǒng)分配的資源,包括CPU磕秤、內(nèi)存空間乳乌、磁盤IO等捧韵,一個(gè)進(jìn)程對(duì)應(yīng)多個(gè)線程市咆,線程的并行是真正的同時(shí)執(zhí)行,而并發(fā)需要在一段時(shí)間內(nèi)運(yùn)行再来,需要有時(shí)間的概念蒙兰。

線程在使用時(shí)候還需要注意線程安全的問題磷瘤,和synchronized同步有關(guān)。以及線程調(diào)用時(shí)候注意死鎖問題搜变。

Java中只有Tread具有線程的概念

線程啟動(dòng)的方式有三種:

1采缚、x extends Thread;然后運(yùn)行x.run();然后調(diào)用start();

2、x implements Runnable;實(shí)現(xiàn)run方法挠他,然后new Thread(run).start();

3扳抽、x implements Callable;實(shí)現(xiàn)call方法,然后new FutureTask<>(call);然后new Thread(run).start();

其中FutureTask實(shí)現(xiàn)了Future和Runnable接口殖侵。

線程的中止:有一些過期的API提供了stop()贸呢,stop()不保證線程的資源是否正常釋放,所以被廢棄了拢军;常用的中止方法為interrupt楞陷,在這里就體現(xiàn)了線程是協(xié)作式的,而不是搶占式的茉唉。interrupt配合isInterrupted()或Thread.interrupted()來使用固蛾,原理是通過設(shè)置Boolean標(biāo)志位實(shí)現(xiàn)。

線程的yield()方法:讓出當(dāng)前線程的CPU占有權(quán)度陆,但讓出時(shí)間不確定艾凯。

線程的join方法:把指定的線程加入到當(dāng)前線程,意思是把兩個(gè)線程順序執(zhí)行坚芜,如在B中A.join()览芳,會(huì)先執(zhí)行A,再執(zhí)行B.

線程同步實(shí)現(xiàn):synchronized內(nèi)置鎖機(jī)制鸿竖,其實(shí)是對(duì)象鎖和類鎖的概念沧竟,通過鎖定類、方法缚忧、代碼塊實(shí)現(xiàn)線程鎖定以及同步悟泵。還有顯示鎖Lock,顯示鎖是一個(gè)接口闪水,通過ReentrantLock實(shí)現(xiàn)糕非,內(nèi)置鎖不可以配置,顯示鎖可以實(shí)現(xiàn)一些其他功能球榆,如中斷鎖朽肥、超時(shí)獲取鎖、非阻塞獲取鎖等持钉。還包括讀寫鎖的方法衡招。非公平鎖比公平鎖性能更優(yōu)。通過condition實(shí)現(xiàn)了類似wait方法的功能每强。

線程協(xié)作始腾,即生產(chǎn)消費(fèi)者模式州刽,由于線程難以及時(shí)響應(yīng),所以難以有效的協(xié)作浪箭。通過wait()/notifyAll()有效的實(shí)現(xiàn)了線程間的協(xié)作穗椅,并且在使用時(shí)都要有synchronized內(nèi)置鎖控制。

線程隔離奶栖,即ThreadLocal匹表,它是鍵值對(duì)結(jié)構(gòu),以ThreadLocal為鍵宣鄙,包括initialValue桑孩、get、set框冀、remove等方法流椒。

handler機(jī)制的Looper對(duì)象就是通過ThreadLocal實(shí)現(xiàn)的。

線程池Threadpool:好處實(shí)現(xiàn)線程的復(fù)用明也,降低消耗宣虾、提高響應(yīng)速度

線程池七個(gè)主要參數(shù):

corePoolSize:線程池線程核心數(shù)

maximumPoolSize:線程池中運(yùn)行最大線程數(shù)

keepAliveTime:線程沒有任務(wù)運(yùn)行時(shí),繼續(xù)存活的時(shí)間

TimeUnit:keepAliveTime時(shí)間單位

workQueue:BlockingQueue阻塞隊(duì)列温数,滿了阻塞的意思

threadFactory:線程工廠绣硝,線程命名時(shí)用到

RejectedExecutionHandler:飽和策略,當(dāng)線程池滿了撑刺,執(zhí)行一些方法鹉胖,如拋出異常、執(zhí)行任務(wù)够傍、丟棄任務(wù)

工作機(jī)制:當(dāng)線程小于corePoolSize甫菠,新建線程,若線程多于corePoolSize冕屯,加到阻塞隊(duì)列里寂诱,若阻塞隊(duì)列滿了,新建線程安聘,若新建的線程超過maximumPoolSize痰洒,則調(diào)用RejectedExecutionHandler.rejectedExecution()方法。

cpu密集型設(shè)置cpu+1,IO密集型設(shè)置2×cpu浴韭,混合型視情況而定丘喻。

AsyncTask原理:創(chuàng)建時(shí)通過創(chuàng)建線程池和串行化任務(wù),執(zhí)行時(shí)從隊(duì)列中輪詢念颈,消息處理通過handler實(shí)現(xiàn)

缺點(diǎn):不適合大量UI異步更新泉粉,需要考慮多線程的控制問題。

static:執(zhí)行時(shí)不依附于任何對(duì)象舍肠,先于類中其他對(duì)象執(zhí)行搀继,可以通過this來調(diào)用,如this.static對(duì)象

4.設(shè)計(jì)模式

創(chuàng)建型:

1.單例模式:

優(yōu)選方案:餓漢式翠语、靜態(tài)內(nèi)部類叽躯、雙重加鎖dcl需加volatile關(guān)鍵字

2.建造者模式:

用戶不關(guān)心產(chǎn)品是如何創(chuàng)建的,直接調(diào)用

應(yīng)用場(chǎng)景:AlertDialog.builder

3.工廠方法模式


每一個(gè)產(chǎn)品對(duì)應(yīng)每一個(gè)工廠

4.簡(jiǎn)單工廠模式

實(shí)現(xiàn)了接口的簡(jiǎn)單封裝肌括,一個(gè)工廠生產(chǎn)很多產(chǎn)品

5.抽象工廠模式

抽象工廠可以理解成:一個(gè)工廠里可以生產(chǎn)多個(gè)產(chǎn)品

6.原型模式

調(diào)用clone方法實(shí)現(xiàn)對(duì)象的拷貝

淺拷貝:直接將對(duì)象引用拷貝給新對(duì)象

深拷貝:先復(fù)制一個(gè)對(duì)象点骑,然后將新對(duì)象進(jìn)行淺拷貝

應(yīng)用場(chǎng)景:Intent中實(shí)現(xiàn)了Cloneable接口,但卻用new實(shí)現(xiàn)的

結(jié)構(gòu)性模式

7.代理模式

一個(gè)真實(shí)對(duì)象接口谍夭,一個(gè)真實(shí)對(duì)象黑滴,一個(gè)代理對(duì)象,代理對(duì)象持有真實(shí)對(duì)象的引用

動(dòng)態(tài)代理:一個(gè)真實(shí)對(duì)象接口紧索,一個(gè)真實(shí)對(duì)象袁辈,一個(gè)動(dòng)態(tài)代理類,實(shí)現(xiàn)了InvocationHandler方法珠漂,重寫它的invoke()晚缩,內(nèi)部用反射實(shí)現(xiàn)

應(yīng)用場(chǎng)景:ActivityManager中的ActivityManagerProxy

8.組合模式:部分—整體模式


透明的組合模式:抽象類里包含所有抽象方法

安全的組合模式:抽象類里包含基本方法,一些其他方法在子類實(shí)現(xiàn)

應(yīng)用場(chǎng)景:ViewGroup與View,并且是安全的組合模式

9.適配器模式:

對(duì)象適配器:適配器中持有源對(duì)象的引用

類適配器:繼承源對(duì)象媳危,實(shí)現(xiàn)adapter接口荞彼,不需要持有源對(duì)象引用

應(yīng)用場(chǎng)景:RecyclerView屬于類適配器

10.裝飾者模式

擴(kuò)展一個(gè)類的額外功能時(shí),是繼承的替代方案之一

應(yīng)用場(chǎng)景:Context類待笑,Context是具體抽象類鸣皂,ContextImpl具體實(shí)現(xiàn)類,ContextWrapper是裝飾角色暮蹂,Activity寞缝、Service是擴(kuò)展的功能

11、橋接模式

如果兩端都需要拓展仰泻,可以用橋接模式第租,比如,人穿衣服我纪,衣服有多種慎宾,人有多種,可以進(jìn)行拓展(人中需要持有衣服的引用)

應(yīng)用場(chǎng)景:window與windowManager浅悉,AbsListView與ListAdapter

12趟据、享元模式

池技術(shù)重要實(shí)現(xiàn)技術(shù),減少重復(fù)對(duì)象的創(chuàng)建术健,通過享元工廠管理享元角色

應(yīng)用場(chǎng)景:String字符串常量池

13汹碱、外觀模式(門面模式)

對(duì)子系統(tǒng)進(jìn)行封裝,封裝成一個(gè)類荞估,調(diào)用封裝類

行為型模式

14咳促、策略模式

抽象類實(shí)現(xiàn)策略方法稚新,然后實(shí)現(xiàn)類實(shí)現(xiàn),可以用來優(yōu)化if-else語句結(jié)構(gòu)

應(yīng)用場(chǎng)景:ArrayAdapter與SimpleAdapter就是策略模式

15跪腹、狀態(tài)模式

與策略模式類似褂删,但本質(zhì)不同,不同行為有不同狀態(tài)

16冲茸、責(zé)任鏈模式

抽象類持有下一個(gè)引用(引用自身)

應(yīng)用場(chǎng)景:ViewGroup與view事件分發(fā)

17屯阀、觀察者模式

觀察者與主題(被觀察者),主題通知觀察者,主題發(fā)送,觀察者接受并更新

應(yīng)用場(chǎng)景:view的setOnClickListener監(jiān)聽

18榜配、模板方法模式

抽象類與實(shí)現(xiàn)類之間的關(guān)系,包括鉤子方法(空實(shí)現(xiàn)或者返回Boolean)盖袭、抽象方法、具體方法

應(yīng)用場(chǎng)景:view的draw()

19彼宠、迭代器模式

容器接口中包含迭代器接口苍凛,在迭代器實(shí)現(xiàn)類中調(diào)用容器接口

應(yīng)用場(chǎng)景:Map、List兵志、Cursor

20醇蝴、備忘錄模式

三個(gè)類之間的關(guān)系,一個(gè)發(fā)起人創(chuàng)建備忘錄想罕、一個(gè)備忘錄悠栓、一個(gè)負(fù)責(zé)管理備忘錄

應(yīng)用場(chǎng)景:onSaveInstanceState和onRestoreInstanceState

21、訪問者模式

將數(shù)據(jù)結(jié)構(gòu)與數(shù)據(jù)操作分離按价,適用于結(jié)構(gòu)較穩(wěn)定的元素操作上

22惭适、中介者模式

比如房產(chǎn)中介,將網(wǎng)狀結(jié)構(gòu)變?yōu)樾菭罱Y(jié)構(gòu)楼镐,中介只有通知功能癞志,同事之間發(fā)送信息都通過中介

應(yīng)用場(chǎng)景:android鎖屏功能

23、解釋器模式

應(yīng)用場(chǎng)景:AndroidManifest.xml通過PackageManagerService使用了PackageParser這個(gè)類來解釋的

24框产、命令模式

通過Command實(shí)現(xiàn)類控制接受凄杯、用戶調(diào)用命令,接受者執(zhí)行秉宿,實(shí)現(xiàn)了調(diào)用者和接受者之間解耦

應(yīng)用場(chǎng)景:Handler(Handler接受者戒突、Looper調(diào)用者、Message命令類)

未完待續(xù)~

好吧這是一篇很長(zhǎng)的文章描睦。膊存。

鳴謝

https://ke.qq.com/course/341933享學(xué)課堂Mark、king老師

http://www.reibang.com/p/d59c64480ed8

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市隔崎,隨后出現(xiàn)的幾起案子今艺,更是在濱河造成了極大的恐慌,老刑警劉巖爵卒,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件虚缎,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡技潘,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門千康,熙熙樓的掌柜王于貴愁眉苦臉地迎上來享幽,“玉大人,你說我怎么就攤上這事拾弃≈底” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵豪椿,是天一觀的道長(zhǎng)奔坟。 經(jīng)常有香客問我,道長(zhǎng)搭盾,這世上最難降的妖魔是什么咳秉? 我笑而不...
    開封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮鸯隅,結(jié)果婚禮上澜建,老公的妹妹穿的比我還像新娘。我一直安慰自己蝌以,他們只是感情好炕舵,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著跟畅,像睡著了一般咽筋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上徊件,一...
    開封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天奸攻,我揣著相機(jī)與錄音,去河邊找鬼虱痕。 笑死舞箍,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的皆疹。 我是一名探鬼主播疏橄,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了捎迫?” 一聲冷哼從身側(cè)響起晃酒,我...
    開封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎窄绒,沒想到半個(gè)月后贝次,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡彰导,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年蛔翅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片位谋。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡山析,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出掏父,到底是詐尸還是另有隱情笋轨,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布赊淑,位于F島的核電站爵政,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏陶缺。R本人自食惡果不足惜钾挟,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望饱岸。 院中可真熱鬧等龙,春花似錦、人聲如沸伶贰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽黍衙。三九已至泥畅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間琅翻,已是汗流浹背位仁。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留方椎,地道東北人聂抢。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像棠众,于是被迫代替她去往敵國(guó)和親琳疏。 傳聞我的和親對(duì)象是個(gè)殘疾皇子有决,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345