-
-
MVC(Model、View、Controller)參考
image原理:view層發(fā)送指令到controller層,由controller去通知model層更新數(shù)據(jù),model層更新完數(shù)據(jù)以后直接顯示在view層上。
對(duì)于安卓:View-》各類layout文件;Model-》數(shù)據(jù)邏輯操作,包括java bean及其他repository、API等;Controller-》activity等
-
缺點(diǎn):
xml對(duì)view層控制力差,不能直接進(jìn)行動(dòng)態(tài)修改進(jìn)行顯示或隱藏,只能交給controller(activity等)進(jìn)行
view與model層可以相互感知,存在耦合關(guān)系
* MVP(Model、View、Presenter)
image
* 原理:用于操作view層發(fā)出的事件傳遞到presenter層中,presenter層去操作model層,并且將數(shù)據(jù)返回給view層,完全由presenter作為橋梁,通過(guò)接口與view連接
* MVVM(Model、View、ViewModel)
image- 與MVP相似,應(yīng)具體分析優(yōu)劣,使用了谷歌data Binding框架
-
-
Collection框架
- 存儲(chǔ)、復(fù)用對(duì)象。特點(diǎn):
- 集合大小動(dòng)態(tài)可變
- 存儲(chǔ)引用類型數(shù)據(jù)(可以不同類型)
- 提供迭代器對(duì)元素進(jìn)行高效訪問(wèn)
- 六大接口:
- Collection
- Set、List、SortedSet(繼承Collection接口)
- Map、SortedMap
- List:有序可重復(fù),包括
- ArrayList線程不安全,底層數(shù)組實(shí)現(xiàn),容量不足長(zhǎng)度擴(kuò)大一倍。插入數(shù)據(jù)效率低,查找效率高
- LinkedList線程不安全,底層鏈表實(shí)現(xiàn)。插入數(shù)據(jù)位置越靠前效率越高,查找效率較低
- Vector線程安全,底層數(shù)組實(shí)現(xiàn),容量不足長(zhǎng)度擴(kuò)大一倍。java1.5后不推薦
- Set:元素不能重復(fù),相當(dāng)于只存儲(chǔ)了map的key值
- HashSet底層HashMap實(shí)現(xiàn),無(wú)序
- TreeSet底層TreeMap實(shí)現(xiàn)
- Map:
- HashMap
- TreeMap,排序,紅黑樹(shù)
- HashTable
- 遍歷:
- 存儲(chǔ)、復(fù)用對(duì)象。特點(diǎn):
-
hashmap 參考
-
Entry數(shù)組+鏈表組成,每個(gè)數(shù)組元素保存一個(gè)鏈表頭結(jié)點(diǎn)
image
HashMap中每個(gè)元素的HashCode%數(shù)組長(zhǎng)度的值即為其所在鏈表對(duì)應(yīng)的數(shù)組編號(hào)
- 鏈表中結(jié)點(diǎn)保存 key、value、Entry<K,V> next、hashCode
- 實(shí)現(xiàn)Collection的Map接口,不允許重復(fù)鍵,可以空鍵空值
- 存入元素
獲取該元素hashCode對(duì)應(yīng)的鏈表數(shù)組編號(hào),再調(diào)用equals()方法在鏈中遍歷查找正確結(jié)點(diǎn)。
-
該元素next指針指向該鏈表中棧頂鍵值對(duì)對(duì)象,然后將該對(duì)象賦給數(shù)組值
int hashCode = key.hasCode(); int index = hashCode % Entry[].length; value.next = Entry[index]; Entry[index] = element;
- 優(yōu)化
- 隨著map數(shù)據(jù)量增大,某個(gè)鏈表可能會(huì)很長(zhǎng),超過(guò)其負(fù)載因子所代表的容積時(shí)則創(chuàng)建一個(gè)兩倍大小的數(shù)組,將原存儲(chǔ)的對(duì)象重新計(jì)算位置后放入到新的數(shù)組中。
- 減少碰撞:采用不可變對(duì)象做鍵值
- 多線程下條件競(jìng)爭(zhēng),多個(gè)線程寫(xiě)入新的頭結(jié)點(diǎn),造成操作覆蓋
- equals()比hashCode()方法更全面復(fù)雜,hashCode只用生成hashCode進(jìn)行比較,效率更高。因此全部使用equals效率稍低,可以先使用hashCode對(duì)比,若hashCode相同再采用equals
- 碰撞檢測(cè)
- hashCode相同但不equal時(shí),兩個(gè)對(duì)象存儲(chǔ)在統(tǒng)一鏈表中,
- 鍵的hashCode相同時(shí),首先找到對(duì)應(yīng)的鏈表位置,在調(diào)用key.equals()找到鍵在鏈表中的正確結(jié)點(diǎn),從而找到對(duì)應(yīng)的值對(duì)象
- 不可變對(duì)象的好處:
- 適合采用String、Interger、Double這樣的封裝類做鍵,其值是不可變的,并且重寫(xiě)了hashCode()與equals()方法
- 保證存入與獲取時(shí)通過(guò)鍵值計(jì)算的HashCode是不變的,從而保證可以在HashMap中找到正確的對(duì)象
- 線程安全
- 采用自定義對(duì)象作為鍵時(shí),需要保證遵守hashCode()與equals()方法定義規(guī)則以減少碰撞,且對(duì)象插入后不會(huì)再改變(聲明為final)。
- ConcurrentHashMap,相對(duì)HashTable在多線程時(shí)同步性能更好,效率更高,采用鎖分段技術(shù),將數(shù)據(jù)分段存儲(chǔ),每段配一把鎖,可以代替HashTable
- synchronized Map:使用synchronized關(guān)鍵字保證map的操作是線程安全的
-
LinkedHashMap:HashMap子類,采用了雙向鏈表,時(shí)間空間開(kāi)銷增大,但是能保證插入與訪問(wèn)順序
- 節(jié)點(diǎn)中保存:before、(hashCode、key、value、next)、after。
- before、after用于維護(hù)雙向鏈表,指明了插入(或訪問(wèn))的前后順序
- 構(gòu)造函數(shù)中accessOrder置為true,使雙向鏈表按訪問(wèn)先后順序排列,每次put或get時(shí)將當(dāng)前entry放在鏈表尾部。
- 節(jié)點(diǎn)中保存:before、(hashCode、key、value、next)、after。
- hashCode()與equals()方法重寫(xiě)
- hashCode:
- Object類中:根據(jù)內(nèi)存地址計(jì)算hashCode,因此同一個(gè)類的不同對(duì)象會(huì)不一樣
- String重寫(xiě)方法:根據(jù)字符串內(nèi)容計(jì)算,字符串所在堆空間相同,則hashCode相同
- Integer重寫(xiě)方法:數(shù)值相同返回hashCode相同
- equals:
-
Object類中:通過(guò)對(duì)象內(nèi)存地址判斷
public boolean equals(Object obj){ return (this == obj); } -
String重寫(xiě)方法:對(duì)地址與內(nèi)容進(jìn)行比較
public boolean equals(Object anObj){ if (this == anObj){return true;} if (anObj instanceof String){ String anotherStr = (String)anObj; int n = count; if (n == anotherStr.count){ char v1[] = this.value; char v2[] = anotherStr.value; int i = 0;//offset int j = 0;//anotherStr.offset while(n- != 0){ if(v1[i++] != v2[j++]){return false;} } return true; } } return false; }
-
- hashCode:
-
-
HashSet
- 實(shí)現(xiàn)Collection的Set接口,保存“值”。
- 不允許重復(fù)元素(通過(guò)hashCode()與equals()確定)
-
HashTable
- 繼承Dictionary,實(shí)現(xiàn)Map、Cloneable、Serializable接口
- 多線程下synchronized同步,鍵值不能為空
- 多線程下線程競(jìng)爭(zhēng)鎖導(dǎo)致效率低
-
ArrayList
- 內(nèi)部結(jié)構(gòu)為Object[]數(shù)組
- 非線程安全
-
線程、四種線程池區(qū)別;run()與start()區(qū)別 1 2
進(jìn)程:一個(gè)獨(dú)立的運(yùn)行環(huán)境,一個(gè)程序、應(yīng)用。不同進(jìn)程使用不同內(nèi)存空間
-
線程:進(jìn)程中負(fù)責(zé)程序執(zhí)行的單元,是進(jìn)程的子集。同一進(jìn)程的不同線程使用同一塊內(nèi)存
時(shí)間片輪轉(zhuǎn)搶占式調(diào)度:每個(gè)線程執(zhí)行一段時(shí)間后強(qiáng)行暫停執(zhí)行下一個(gè),使每個(gè)任務(wù)輪流執(zhí)行。由于CPU執(zhí)行頻率高,任務(wù)切換非???,因此感覺(jué)是多個(gè)任務(wù)同時(shí)進(jìn)行。
-
線程任務(wù)按實(shí)現(xiàn)的接口劃分,可以繼承Runnable接口(重寫(xiě)run())與Callable接口(重寫(xiě)call()),將任務(wù)提交給其它線程(Thread類或線程池)執(zhí)行
1.new Thread(task).start();
2.FutureTask<V> result = ThreadPoolExecutor.submit(task);
3.new Thread(new FutureTask(V){callable}).start();
-
-
繼承Thread并重寫(xiě)run(),通過(guò)start()開(kāi)啟
Thread thread = new Thread(){run(){...}}; thread.start(); -
實(shí)現(xiàn)Runnable并重寫(xiě)run(),通過(guò)start()開(kāi)啟
Runnable r = new Runnable(){run(){...}}; Thread thread = new Thread(r); thread.start; -
Callable與FutureTask
- Callable接口與Runnable接口類似,但是可以返回值與異常,重寫(xiě)方法call(),任務(wù)返回FutureTask對(duì)象,其中攜帶了操作結(jié)果
- FutureTask實(shí)現(xiàn)了RunnableFuture接口,RunnableFuture接口實(shí)現(xiàn)了Future接口(包括取消操作、判斷是非取消或完成、獲取結(jié)果抽象函數(shù))與Runnable接口,可以在Thread及ExecutorService中執(zhí)行。
-
線程池
-
新建線程池提交任務(wù)
1.ThreadPoolExecutor.execute(task);
2.線程池構(gòu)造函數(shù)重要參數(shù):線程池核心線程數(shù)最大值、線程最大總數(shù)、非核心線程最大閑置時(shí)長(zhǎng)、任務(wù)隊(duì)列、創(chuàng)建線程Factory等
3.當(dāng)有任務(wù)被提交時(shí),若線程數(shù)小于核心線程數(shù),則新建一個(gè)線程執(zhí)行任務(wù)
若線程數(shù)大于核心線程數(shù),則將任務(wù)加入任務(wù)隊(duì)列,隊(duì)列裝滿后新建非核心線程執(zhí)行隊(duì)列任務(wù)
若隊(duì)列也滿,則拋出異常
* 選取四種現(xiàn)成的線程池直接提交任務(wù)ExecutorService threadPool = Executors.new .....ThreadPool(params);
ExecutorService.newCachedThreadPool(2).submit(task);
* 優(yōu)點(diǎn):提高程序執(zhí)行效率、提高資源(CPU、內(nèi)存)利用率
* 缺點(diǎn):占用內(nèi)存空間、線程越多CPU調(diào)度開(kāi)銷越大、程序復(fù)雜
* wait()與sleep()
* wait:線程暫停執(zhí)行,釋放同步鎖,直到被notify()通知喚醒
* sleep:線程休眠,不釋放同步鎖,直到線程休眠時(shí)間結(jié)束或被interupt()打斷
* thread.join()該thread內(nèi)run方法執(zhí)行完成后再進(jìn)行下一步代碼或線程,保證了多線程間的執(zhí)行順序
* thread.yield()線程放棄執(zhí)行,將CPU讓出,等待下次被系統(tǒng)調(diào)度運(yùn)行。
* thread.stop()已過(guò)時(shí),強(qiáng)制性,破壞線程原子邏輯,不提倡使用
* 保證安全停止線程的方法:
stop = false
while(!stop){
synchronized{
....//需要保證運(yùn)行邏輯完整的原子代碼
}
}public void terminate(){stop = true;}
-
-
-
線程池:一塊存放多個(gè)為死亡線程的內(nèi)存空間,由線程池管理器管理調(diào)度,當(dāng)有開(kāi)辟線程的任務(wù)時(shí)即從池中獲取一個(gè)線程執(zhí)行任務(wù),完成后再返回給線程池,從而
1.節(jié)省了反復(fù)創(chuàng)建線程對(duì)象的性能開(kāi)銷。
2.控制最大并發(fā)數(shù),避免大量線程相互搶占系統(tǒng)資源導(dǎo)致阻塞
3.能夠?qū)€程進(jìn)行簡(jiǎn)單的管理、定時(shí)執(zhí)行、間隔執(zhí)行等功能
Executor框架:調(diào)度、執(zhí)行、控制異任務(wù)對(duì)框架。利用Executor框架可以方便的創(chuàng)建線程池,可以控制線程數(shù)量并對(duì)空閑線程進(jìn)行回收利用,避免了無(wú)限制創(chuàng)建線程導(dǎo)致程序內(nèi)存溢出。
Executor接口——》ThreadPoolExecutor實(shí)現(xiàn)類
-
newCachedThreadPool:無(wú)限大小線程池,有任務(wù)添加且無(wú)空閑線程時(shí)可創(chuàng)建新線程,之前構(gòu)造的空閑線程可用時(shí)能過(guò)進(jìn)行重用
對(duì)于較多的短期異步任務(wù)可以提高程序性能
現(xiàn)有線程都不可用時(shí)將創(chuàng)建添加一個(gè)新的線程,并移除超過(guò)60s未被使用的線程。
* newSingleThreadExecutor:池內(nèi)只有一個(gè)線程工作,所有任務(wù)串形執(zhí)行。若該線程因異常而結(jié)束,則會(huì)構(gòu)造一個(gè)新的線程代替。保證所有任務(wù)按提交順序執(zhí)行
* newFixedThreadPool:固定大小的線程池。每接受一個(gè)任務(wù)即創(chuàng)建一個(gè)線程直到線程數(shù)量達(dá)到上限。若其中有線程因異常結(jié)束則創(chuàng)建新的代替
* newScheduledThreadPool:無(wú)限大小的線程池,支持定時(shí)、周期性任務(wù)
* start()與run()
* 繼承Thread類或重寫(xiě)Runnable接口時(shí)在run中重寫(xiě)線程中的操作,對(duì)線程實(shí)例調(diào)用start,從而開(kāi)辟新的線程并執(zhí)行run內(nèi)操作
* 若直接調(diào)用run,并不能開(kāi)辟出新的線程,還是在原線程中執(zhí)行
-
synchronized同步塊、lock
針對(duì)多條線程同時(shí)操作共享數(shù)據(jù)的安全問(wèn)題,采用互斥鎖保證被鎖上的線程在運(yùn)行時(shí)讓其他試圖訪問(wèn)的線程處于等待狀態(tài),直到當(dāng)前線程結(jié)束并釋放鎖。
synchronized保證同一時(shí)刻只有一個(gè)線程可以操作被其修飾的代碼塊或方法,同時(shí)保證當(dāng)前線程上數(shù)據(jù)的變化可以被其他線程看到。
-
synchronized鎖定代碼塊:該對(duì)象在synchronized塊內(nèi)的內(nèi)容在運(yùn)行時(shí)不允許其他線程訪問(wèn),其所在線程結(jié)束后才能執(zhí)行另一個(gè)線程;若不同線程執(zhí)行該類的不同對(duì)象,則鎖定失效
class SynThread implements Runnable{ public void run(){ synchronized(this){....} } } -
synchronized鎖定對(duì)象:其他線程試圖訪問(wèn)該對(duì)象時(shí)會(huì)被阻塞,直到對(duì)象所在的當(dāng)前線程結(jié)束
public void run(){ synchronized(obj){...} } -
synchronized鎖定實(shí)例方法
public synchronized void run(){} synchronized修飾的對(duì)象、方法不能被繼承或?qū)崿F(xiàn)
每個(gè)對(duì)象有一個(gè)鎖,線程拿到鎖則可以對(duì)對(duì)象進(jìn)行操作
-
死鎖可以發(fā)生在不同線程、進(jìn)程,甚至不同機(jī)器之間
- 形成原因:
- 競(jìng)爭(zhēng)不能搶占到的資源 T1、T2分別占據(jù)a、b資源,并等待對(duì)方釋放資源,形成了無(wú)限的等待從而造成死鎖
- 競(jìng)爭(zhēng)可消耗的資源 T1、T2分別需要先接收對(duì)方消息才能發(fā)送消息
- 進(jìn)程推進(jìn)順序不當(dāng) T1、T2都需要a、b資源,正確順序應(yīng)當(dāng)是T1運(yùn)行a、b完成后再進(jìn)行T2線程,但是若運(yùn)行順序不當(dāng)易造成第一種死鎖
- 必要條件:
- 資源只能被一個(gè)線程使用
- 資源未被使用完,不能被搶占,只能由當(dāng)前獲取資源的線程自己釋放(主動(dòng)釋放)
- 線程占用了資源但是又提出了新的資源請(qǐng)求。而該資源已被其他線程占用,導(dǎo)致請(qǐng)求的線程被阻塞,同時(shí)不釋放自己已有的資源
- 循環(huán)等待條件,存在一條占用資源與請(qǐng)求資源的循環(huán)鏈
- 處理方法
- 線程開(kāi)始前一次性申請(qǐng)所有資源
- 加鎖順序,使線程按照一定順序加鎖
- 加上鎖時(shí)限,線程嘗試獲取鎖時(shí),超過(guò)時(shí)限則放棄對(duì)該鎖的請(qǐng)求,并釋放自己占用的鎖
- 死鎖檢測(cè),針對(duì)不能實(shí)現(xiàn)按序加鎖或鎖時(shí)限的情況。記錄線程獲取鎖的情況以及請(qǐng)求記錄,每當(dāng)存在請(qǐng)求失敗的情況時(shí),則遍歷該記錄(鎖的關(guān)系圖)查看是否有死鎖發(fā)生。若發(fā)現(xiàn)死鎖,則釋放所有鎖,回退,并在一段時(shí)間后重試;或給各線程隨機(jī)設(shè)置優(yōu)先級(jí),較低級(jí)的線程回退,其他較高的線程繼續(xù)保持鎖
- 形成原因:
-
內(nèi)存泄漏、溢出、ANR、
- JVM內(nèi)存環(huán)境:
- 堆heap:存放new創(chuàng)建的對(duì)象和數(shù)組(對(duì)象本身),由JVM垃圾回收器管理,被所有線程共享
- 棧stack:后進(jìn)先出,只存放基本類型與對(duì)象的引用(不是對(duì)象)。每個(gè)線程擁有一個(gè)棧,其中內(nèi)存單元為幀frame,存放線程內(nèi)使用到的方法(參數(shù)、局部變量、返回地址等)
- 方法區(qū)method:靜態(tài)區(qū),存放所有class、static變量。被所有線程共享
- 泄漏:程序向系統(tǒng)申請(qǐng)分配內(nèi)存,使用完畢后未釋放,(當(dāng)程序不再需要這個(gè)對(duì)象時(shí)仍保留了這個(gè)對(duì)象的引用)一直占據(jù)該內(nèi)存單元直到程序結(jié)束,使得該內(nèi)存無(wú)法再被使用。大量的泄漏會(huì)導(dǎo)致內(nèi)存溢出,如未注銷的receiver、eventbus等
- 形成原因:
- 棧:方法運(yùn)行結(jié)束時(shí),對(duì)應(yīng)的frame會(huì)從棧中刪除,空間被釋放,線程回到原方法繼續(xù)執(zhí)行,而所有棧都被清空則程序結(jié)束運(yùn)行,很少導(dǎo)致泄漏。
- 堆:存放普通變量,不會(huì)隨著方法結(jié)束而清空。隨著對(duì)象的不停創(chuàng)建而耗盡空間以及長(zhǎng)期持有,若一直不被GC回收(存在于引用鏈上)則造成泄漏。
- 影響:
- 浪費(fèi)內(nèi)存
- 內(nèi)存泄漏導(dǎo)致可用內(nèi)存越來(lái)越少,最終導(dǎo)致oom
- 隨著內(nèi)存減少,GC被頻繁觸發(fā)影響性能造成程序卡頓
- 常見(jiàn)情況:
- context:activity被強(qiáng)引用后,隨著其生命周期短結(jié)束,本該被GC回收的activity對(duì)象因?yàn)樵撘靡恢辈槐换厥眨婊钤谏芷谥?。因此最好采用application.context代替activity.context或及時(shí)清除對(duì)activity的引用
- 內(nèi)部類:內(nèi)部類持有一個(gè)靜態(tài)(static)變量的引用,就需要在銷毀時(shí)將靜態(tài)變量置空
- handler內(nèi)部類存在于activity中,activity結(jié)束后,handler對(duì)象中有message還在循環(huán),handler生命周期沒(méi)有結(jié)束,因此activity無(wú)法被回收
- handler聲明為static靜態(tài)內(nèi)部類,不再持有外部類的引用從而可以釋放activity
- 內(nèi)部類引用外部對(duì)象時(shí)采用弱應(yīng)用
- 解決方法:在對(duì)象生命周期結(jié)束的時(shí)候解除綁定,將引用置為空或使用弱引用。
- 形成原因:
- 溢出oom:程序向系統(tǒng)申請(qǐng)的內(nèi)存空間超過(guò)系統(tǒng)所能分配的
- 導(dǎo)致原因:
- 大量長(zhǎng)期保存資源不釋放的內(nèi)存泄漏問(wèn)題
- 對(duì)象過(guò)大超出內(nèi)存限制,如bitmap、xml等
- static變量過(guò)多
- 加載圖片導(dǎo)致oom解決方法:
- 只加載縮略圖
- 讀取時(shí)適當(dāng)壓縮
- 使用軟引用對(duì)bitmap進(jìn)行引用,及時(shí)recycle,并對(duì)經(jīng)常需要加載的圖片進(jìn)行緩存避免反復(fù)加載
- 及時(shí)銷毀不需要的bitmap對(duì)象
- 導(dǎo)致原因:
-
ANR(application not responding)
- 導(dǎo)致原因:
- 主線程太多耗時(shí)操作
- CPU滿負(fù)荷,導(dǎo)致IO阻塞
- 解決方法:
- 開(kāi)辟子線程進(jìn)行耗時(shí)操作或IO操作
- 排查內(nèi)存泄漏、增大VM內(nèi)存等
- activity onCreate和onResume中盡量避免耗時(shí)操作
- BroadCastReceiver onReceive盡量避免耗時(shí)操作,交給IntentService處理
- 導(dǎo)致原因:
- JVM內(nèi)存環(huán)境:
Java類加載機(jī)制
-
Java內(nèi)存模型
- 可見(jiàn)性:線程間,一個(gè)線程修改的狀態(tài)對(duì)另一個(gè)線程數(shù)可見(jiàn)的,可以使用volatile、synchronized、final修飾變量使其具有可見(jiàn)性,直接在內(nèi)存中被修改,不允許其在線程內(nèi)緩存與重排序
- 原子性:操作不可分割,如a=0。非原子操作,如a++會(huì)存在線程安全問(wèn)題。使用同步技術(shù)如synchronized、lock將其封為一個(gè)原子操作。
- 有序性:持有同一對(duì)象鎖的兩個(gè)同步塊只能串形執(zhí)行。通過(guò)volatile、synchronized保證
-
Java同步機(jī)制:
- JVM中臨界區(qū)內(nèi)資源可被共享,同一時(shí)間內(nèi)只能被一個(gè)線程訪問(wèn)
- 同步機(jī)制保證了每次一個(gè)線程需要訪問(wèn)臨界區(qū)時(shí)首先檢查區(qū)內(nèi)是否正有線程訪問(wèn),有則將線程掛起等待區(qū)內(nèi)線程執(zhí)行完
-
- 一種稍弱的同步機(jī)制,將變量的更新操作通知到其它線程,保證線程間操作有序性的關(guān)鍵字。聲明的變量被共享,其他線程讀取時(shí)獲取其被操作后最新的值
- 訪問(wèn)volatile變量時(shí)不會(huì)進(jìn)行加鎖操作,不會(huì)使執(zhí)行線程阻塞,比sychronized更加輕型
- 非volatile對(duì)象被操作時(shí),由操作線程拷貝從內(nèi)存將其拷貝到cpu上,可能隨著處理線程的cpu不同而拷貝到不同cpu cache上,造成操作的不可見(jiàn)
- volatile對(duì)象每次直接從內(nèi)存中讀取,不經(jīng)過(guò)CPU cache,修改后立即同步到內(nèi)存,因此下一個(gè)進(jìn)行操作的線程即對(duì)此操作可見(jiàn)
- 讀取性能與普通變量幾乎相同,寫(xiě)入稍慢
lock
final
-
Java反射:java程序?qū)υ谶\(yùn)行時(shí)才知道名稱的類進(jìn)行加載,獲取到它的完整定義與成員
- 運(yùn)行時(shí)判斷一個(gè)對(duì)象所屬類
- 運(yùn)行時(shí)構(gòu)造任意類的對(duì)象
- 運(yùn)行時(shí)判斷一個(gè)類的成員變量和方法
- 運(yùn)行時(shí)調(diào)用對(duì)象的方法
- 動(dòng)態(tài)代理
- java.lang.Class類,類被加載后,jvm產(chǎn)生一個(gè)Class對(duì)象,并通過(guò)這個(gè)class對(duì)象獲取到其對(duì)應(yīng)的方法、成員等信息
-
Java裝箱拆箱
- 裝箱:基本數(shù)據(jù)類型轉(zhuǎn)為封裝類,如Integer a = 1(而不用Integer a = new Integer(1))、(Array<Integer>) list.add(3);
- 調(diào)用Integer.valueOf(int)
- 拆箱:封裝類轉(zhuǎn)換為基本數(shù)據(jù)類型,如int n = Integer i
- 調(diào)用Integer.intValue
- Integer在[-128,127]內(nèi)數(shù)值相同則保存在同一對(duì)象中
- Boolean值保存為類靜態(tài)常量中,值相同則對(duì)象相同
- 裝箱:基本數(shù)據(jù)類型轉(zhuǎn)為封裝類,如Integer a = 1(而不用Integer a = new Integer(1))、(Array<Integer>) list.add(3);
-
Java封裝、繼承、多態(tài)
- 封裝:面向?qū)ο筇卣髦?,類封裝了數(shù)據(jù)及操作的邏輯實(shí)體,私有不能被外界訪問(wèn)。為內(nèi)部數(shù)據(jù)提供不同級(jí)別的保護(hù),防止無(wú)意改變對(duì)象私有部分
- 繼承:某個(gè)類型對(duì)象獲取另一個(gè)類型對(duì)象屬性的方法,使用現(xiàn)有類的所有功能,并且在不重新編寫(xiě)原類的前提下進(jìn)行擴(kuò)展,實(shí)現(xiàn)從一般到特殊的過(guò)程。包括繼承和組合
- 多態(tài):一個(gè)類對(duì)象的相同方法在不同情形下有不同的表現(xiàn)形式,使不同內(nèi)部結(jié)構(gòu)的對(duì)象共享相同的外部接口,讓父對(duì)象根據(jù)賦值的子對(duì)象特性進(jìn)行運(yùn)作。必要條件:
- 繼承
- 重寫(xiě)
- 父類引用指向子類對(duì)象
-
Java內(nèi)部類
- 特點(diǎn):
- 提供了更好的封裝,只有外部類可以訪問(wèn)內(nèi)部類
- 內(nèi)部類可以獨(dú)立于外部類實(shí)現(xiàn)接口
- 外部類不能直接訪問(wèn)非靜態(tài)內(nèi)部類,非靜態(tài)內(nèi)部類可以訪問(wèn)外部類屬性與方法:非靜態(tài)內(nèi)部類依賴于外部類對(duì)象,因此保存有外部類對(duì)象的引用,從而可以訪問(wèn)外部類的成員。外部類需要訪問(wèn)非靜態(tài)內(nèi)部類必須顯示創(chuàng)建內(nèi)部類對(duì)象
- 非靜態(tài)內(nèi)部類中不能定義靜態(tài)方法變量等
- 編譯時(shí)內(nèi)部類編譯成一個(gè)單獨(dú)的class文件
- 成員內(nèi)部類
- 靜態(tài)內(nèi)部類:用static修飾內(nèi)部類,則這個(gè)內(nèi)部類屬于外部類類本身
- 局部?jī)?nèi)部類
- 匿名內(nèi)部類:只使用一次的內(nèi)部類,如setOnClickListener(new OnClickListener(){onClick(){}})
- 特點(diǎn):
-
for,foreach
- for: for(int i=0 ; i<length ; I++)
- foreach: for(Integer i : integers)對(duì)集合采用了迭代器效率更高,對(duì)數(shù)組采用for循環(huán)
- 遍歷過(guò)程中若有其它線程對(duì)對(duì)象進(jìn)行修改,for會(huì)導(dǎo)致不可知的錯(cuò)誤,而foreach可以拋出錯(cuò)誤信息
范性、類擦除機(jī)制
面試復(fù)習(xí)(二) Java篇
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
相關(guān)閱讀更多精彩內(nèi)容
- Java8張圖 11、字符串不變性 12、equals()方法、hashCode()方法的區(qū)別 13、...
- 從三月份找實(shí)習(xí)到現(xiàn)在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂(lè)視家的研發(fā)崗...
- 一:java概述: 1,JDK:Java Development Kit,java的開(kāi)發(fā)和運(yùn)行環(huán)境,java的開(kāi)發(fā)...
- 冬天是思念的季節(jié)。 我喜歡冬天,盡管她寒冷,干燥,陰沉,時(shí)有雨雪,間或有狂風(fēng),一旦出門(mén)在外,總是畏首畏尾,縮頭縮腦...
- 豆同學(xué)住院已經(jīng)10天了,隨著他的腹痛完全消失,人變得有精神了;同時(shí)也越來(lái)越有胃口吃飯菜,只是吃的飯菜還需要避免油膩...



