Android面試知識(shí)整理-android基礎(chǔ)知識(shí)
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老師