? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?JAVA部分:
1.equals與==的區(qū)別:
==是判斷兩個(gè)變量或?qū)嵗遣皇侵赶蛲粋€(gè)內(nèi)存空間equals是判斷兩個(gè)變量或?qū)嵗赶虻膬?nèi)存空間的值是不是相同薛窥。
2. Hashcode的作用播揪,與equal有什么區(qū)別
為了鑒定2個(gè)對(duì)象是否相等的鳞溉,java集合中有l(wèi)ist和set兩類辅肾,其中set不允許元素重復(fù)實(shí)現(xiàn),那個(gè)這個(gè)不允許重復(fù)實(shí)現(xiàn)的方法,如果用equal去比較的話,如果存在1000個(gè)元素汹粤,你new一個(gè)新的元素出來,需要去調(diào)用1000次equal去逐個(gè)和他們比較是否是同一個(gè)對(duì)象田晚,這樣會(huì)大大降低效率嘱兼。hashcode實(shí)際上是返回對(duì)象的存儲(chǔ)地址,如果這個(gè)位置上沒有元素贤徒,就把元素直接存儲(chǔ)在上面芹壕,如果這個(gè)位置上已經(jīng)存在元素汇四,這個(gè)時(shí)候才去調(diào)用equal方法與新元素進(jìn)行比較,相同的話就不存了踢涌,散列到其他地址上通孽。
3. String、StringBuffer與StringBuilder的區(qū)別
String類型和StringBuffer類型的主要性能區(qū)別其實(shí)在于String是不可變的對(duì)象斯嚎,StringBuffer和StringBuilder底層是char[]數(shù)組實(shí)現(xiàn)的利虫。StringBuffer是線程安全的挨厚,而StringBuilder是線程不安全的堡僻。
4. Override和Overload的含義去區(qū)別
Overload顧名思義是重新加載,它可以表現(xiàn)類的多態(tài)性,疫剃。函數(shù)里面可以有相同的函數(shù)名钉疫,但是參數(shù)名、返回值巢价、類型不能相同牲阁;或者說可以改變參數(shù)、類型壤躲、返回值但是函數(shù)名字依然不變城菊。Override顧名思義就是ride(重寫)的意思,在子類繼承父類的時(shí)候子類中可以定義某方法與其父類有相同的名稱和參數(shù)碉克,當(dāng)子類在調(diào)用這一函數(shù)時(shí)自動(dòng)調(diào)用子類的方法凌唬,而父類相當(dāng)于被覆蓋(重寫)了。
5.抽象類和接口的區(qū)別
一個(gè)類只能繼承單個(gè)類漏麦,但是可以實(shí)現(xiàn)多個(gè)接口接口強(qiáng)調(diào)特定功能的實(shí)現(xiàn)客税,而抽象類強(qiáng)調(diào)所屬關(guān)系抽象類中的所有方法并不一定要是抽象的,你可以選擇在抽象類中實(shí)現(xiàn)一些基本的方法撕贞。而接口要求所有的方法都必須是抽象的更耻。
6.wait()和sleep()的區(qū)別
(1)sleep來自Thread類,wait來自O(shè)bject類
(2)調(diào)用sleep()方法的過程中捏膨,線程不會(huì)釋放對(duì)象鎖秧均。而 調(diào)用wait方法線程會(huì)釋放對(duì)象鎖
(3)sleep睡眠后不出讓系統(tǒng)資源,wait讓出系統(tǒng)資源其他線程可以占用CPU
(4)sleep(milliseconds)需要指定一個(gè)睡眠時(shí)間号涯,時(shí)間一到會(huì)自動(dòng)喚醒
6.JAVA多態(tài)的實(shí)現(xiàn)原理
抽象的來講目胡,多態(tài)的意思就是同一消息可以根據(jù)發(fā)送對(duì)象的不同而采用多種不同的行為方式。(發(fā)送消息就是函數(shù)調(diào)用)實(shí)現(xiàn)的原理是動(dòng)態(tài)綁定诚隙,程序調(diào)用的方法在運(yùn)行期才動(dòng)態(tài)綁定.
7.怎么判斷一個(gè)對(duì)象是否需要收集讶隐?
(1)引用計(jì)數(shù)(最簡(jiǎn)單古老的方法):將資源(可以是對(duì)象、內(nèi)存或磁盤空間等等)的被引用次數(shù)保存起來久又,當(dāng)被引用次數(shù)變?yōu)榱銜r(shí)就將其釋放
(2)對(duì)象引用遍歷(現(xiàn)在大多數(shù)jvm使用的方法):對(duì)象引用遍歷從一組對(duì)象開始巫延,沿著整個(gè)對(duì)象圖上的每條鏈接效五,遞歸確定可到達(dá)的對(duì)象。如果某對(duì)象不能從這些根對(duì)象的一個(gè)到達(dá)炉峰,則將它作為垃圾收集.
8.Java的四種引用的區(qū)別
(1)強(qiáng)引用:如果一個(gè)對(duì)象具有強(qiáng)引用畏妖,它就不會(huì)被垃圾回收器回收。即使當(dāng)前內(nèi)存空間不足疼阔,JVM也不會(huì)回收它戒劫,而是拋出OutOfMemoryError錯(cuò)誤,使程序異常終止婆廊。如果想中斷強(qiáng)引用和某個(gè)對(duì)象之間的關(guān)聯(lián)迅细,可以顯式地將引用賦值為null,這樣一來的話淘邻,JVM在合適的時(shí)間就會(huì)回收該對(duì)象
(2)軟引用:在使用軟引用時(shí)茵典,如果內(nèi)存的空間足夠,軟引用就能繼續(xù)被使用宾舅,而不會(huì)被垃圾回收器回收统阿,只有在內(nèi)存不足時(shí),軟引用才會(huì)被垃圾回收器回收筹我。
(3)弱引用:具有弱引用的對(duì)象擁有的生命周期更短暫扶平。因?yàn)楫?dāng)JVM進(jìn)行垃圾回收,一旦發(fā)現(xiàn)弱引用對(duì)象蔬蕊,無論當(dāng)前內(nèi)存空間是否充足结澄,都會(huì)將弱引用回收。不過由于垃圾回收器是一個(gè)優(yōu)先級(jí)較低的線程袁串,所以并不一定能迅速發(fā)現(xiàn)弱引用對(duì)象
(4)虛引用:顧名思義概而,就是形同虛設(shè),如果一個(gè)對(duì)象僅持有虛引用囱修,那么它相當(dāng)于沒有引用赎瑰,在任何時(shí)候都可能被垃圾回收器回收。
9.ArrayList破镰、LinkedList餐曼、Vector的區(qū)別
(1)ArrayList和Vector底層是采用數(shù)組方式存儲(chǔ)數(shù)據(jù),Vector由于使用了synchronized方法(線程安全)所以性能上比ArrayList要差
(2)LinkedList使用雙向鏈表實(shí)現(xiàn)存儲(chǔ)鲜漩,隨機(jī)存取比較慢
(3)HashMap的底層源碼實(shí)現(xiàn):當(dāng)我們往HashMap中put元素的時(shí)候源譬,先根據(jù)key的hashCode重新計(jì)算hash值,根據(jù)hash值得到這個(gè)元素在數(shù)組中的位置(即下標(biāo))孕似,如果數(shù)組該位置上已經(jīng)存放有其他元素了踩娘,那么在這個(gè)位置上的元素將以鏈表的形式存放,新加入的放在鏈頭喉祭,最先加入的放在鏈尾养渴。如果數(shù)組該位置上沒有元素雷绢,就直接將該元素放到此數(shù)組中的該位置上。
10.HashMap和 HashTable 的區(qū)別
HashTable比較老理卑,是基于Dictionary類實(shí)現(xiàn)的翘紊,HashTable則是基于Map接口實(shí)現(xiàn)的。HashTable是線程安全的藐唠,HashMap則是線程不安全的帆疟。HashMap可以讓你將空值作為一個(gè)表的條目的key或value。
11.什么是線程池宇立,線程池的作用是什么
線程池就是開辟一塊內(nèi)存空間踪宠,里面存放了眾多(未死亡)的線程,池中線程執(zhí)行調(diào)度由池管理器來處理泄伪。當(dāng)有線程任務(wù)時(shí)殴蓬,從池中取一個(gè),執(zhí)行完成后線程對(duì)象歸池蟋滴,這樣可以避免反復(fù)創(chuàng)建線程對(duì)象所帶來的性能開銷,節(jié)省了系統(tǒng)的資源痘绎。
java線程池的作用:a.重用存在的線程津函,減少對(duì)象創(chuàng)建、消亡的開銷孤页,性能佳尔苦。b.可有效控制最大并發(fā)線程數(shù),提高系統(tǒng)資源的使用率行施,同時(shí)避免過多資源競(jìng)爭(zhēng)允坚,避免堵塞。c.提供定時(shí)執(zhí)行蛾号、定期執(zhí)行稠项、單線程、并發(fā)數(shù)控制等功能鲜结。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Android部分
1.繪制Activity生命周期流程圖
2.內(nèi)存不足時(shí)系統(tǒng)會(huì)殺掉后臺(tái)的Activity展运,若需要進(jìn)行一些臨時(shí)狀態(tài)的保存,在哪個(gè)方法進(jìn)行精刷?
Activity的onSaveInstanceState()和onRestoreInstanceState()并不是生命周期方法拗胜,它們不同于onCreate()、onPause()等生命周期方法怒允,它們并不一定會(huì)被觸發(fā)埂软。當(dāng)應(yīng)用遇到意外情況(如:內(nèi)存不足、用戶直接按Home鍵)由系統(tǒng)銷毀一個(gè)Activity纫事,onSaveInstanceState()會(huì)被調(diào)用勘畔。但是當(dāng)用戶主動(dòng)去銷毀一個(gè)Activity時(shí)迷殿,例如在應(yīng)用中按返回鍵,onSaveInstanceState()就不會(huì)被調(diào)用咖杂。除非該activity是被用戶主動(dòng)銷毀的庆寺,通常onSaveInstanceState()只適合用于保存一些臨時(shí)性的狀態(tài),而onPause()適合用于數(shù)據(jù)的持久化保存诉字。
3.onSaveInstanceState()被執(zhí)行的場(chǎng)景有哪些:
系統(tǒng)不知道你按下HOME后要運(yùn)行多少其他的程序懦尝,自然也不知道activity A是否會(huì)被銷毀,因此系統(tǒng)都會(huì)調(diào)用onSaveInstanceState()壤圃,讓用戶有機(jī)會(huì)保存某些非永久性的數(shù)據(jù)陵霉。以下幾種情況的分析都遵循該原則
1.當(dāng)用戶按下HOME鍵時(shí)
2.長(zhǎng)按HOME鍵,選擇運(yùn)行其他的程序時(shí)
3.鎖屏?xí)r
4.從activity A中啟動(dòng)一個(gè)新的activity時(shí)
5.屏幕方向切換時(shí)
4.介紹Activity的幾中啟動(dòng)模式
(1)standard
(2)SingleTop
(3)SingleTask
(4)SingleInstance
5.注冊(cè)Service需要注意什么
Service還是運(yùn)行在主線程當(dāng)中的伍绳,所以如果需要執(zhí)行一些復(fù)雜的邏輯操作踊挠,最好在服務(wù)的內(nèi)部手動(dòng)創(chuàng)建子線程進(jìn)行處理,否則會(huì)出現(xiàn)UI線程被阻塞的問題
6.Service與Activity怎么實(shí)現(xiàn)通信
方法一:
1.添加一個(gè)繼承Binder的內(nèi)部類冲杀,并添加相應(yīng)的邏輯方法
2.重寫Service的onBind方法效床,返回我們剛剛定義的那個(gè)內(nèi)部類實(shí)例
方法二:
通過BroadCast(廣播)的形式 當(dāng)我們的進(jìn)度發(fā)生變化的時(shí)候我們發(fā)送一條廣播,然后在Activity的注冊(cè)廣播接收器权谁,接收到廣播之后更新視圖.
7.IntentService與Service的區(qū)別
IntentService是Service的子類剩檀,是一個(gè)異步的,會(huì)自動(dòng)停止的服務(wù)旺芽,很好解決了傳統(tǒng)的Service中處理完耗時(shí)操作忘記停止并銷毀Service的問題.
IntentService會(huì)創(chuàng)建獨(dú)立的worker線程來處理所有的Intent請(qǐng)求沪猴;會(huì)創(chuàng)建獨(dú)立的worker線程來處理onHandleIntent()方法實(shí)現(xiàn)的代碼,無需處理多線程問題采章;所有請(qǐng)求處理完成后运嗜,IntentService會(huì)自動(dòng)停止,無需調(diào)用stopSelf()方法停止Service悯舟;為Service的onBind()提供默認(rèn)實(shí)現(xiàn)担租,返回null;為Service的onStartCommand提供默認(rèn)實(shí)現(xiàn)图谷,將請(qǐng)求Intent添加到隊(duì)列中翩活;
IntentService不會(huì)阻塞UI線程,而普通Serveice會(huì)導(dǎo)致ANR異常
Intentservice若未執(zhí)行完成上一次的任務(wù)便贵,將不會(huì)新開一個(gè)線程菠镇,是等待之前的任務(wù)完成后,再執(zhí)行新的任務(wù)承璃,等任務(wù)完成后再次調(diào)用stopSelf().
8.介紹Handle的機(jī)制
·Handler通過調(diào)用sendmessage方法把消息放在消息隊(duì)列MessageQueue中利耍,Looper負(fù)責(zé)把消息從消息隊(duì)列中取出來,重新再交給Handler進(jìn)行處理,三者形成一個(gè)循環(huán)
·通過構(gòu)建一個(gè)消息隊(duì)列隘梨,把所有的Message進(jìn)行統(tǒng)一的管理程癌,當(dāng)Message不用了,并不作為垃圾回收轴猎,而是放入消息隊(duì)列中嵌莉,供下次handler創(chuàng)建消息時(shí)候使用,提高了消息對(duì)象的復(fù)用捻脖,減少系統(tǒng)垃圾回收的次數(shù)
·每一個(gè)線程锐峭,都會(huì)單獨(dú)對(duì)應(yīng)的一個(gè)looper,這個(gè)looper通過ThreadLocal來創(chuàng)建可婶,保證每個(gè)線程只創(chuàng)建一個(gè)looper沿癞,looper初始化后就會(huì)調(diào)用looper.loop創(chuàng)建一個(gè)MessageQueue,這個(gè)方法在UI線程初始化的時(shí)候就會(huì)完成矛渴,我們不需要手動(dòng)創(chuàng)建.
9.ListView卡頓的原因與性能優(yōu)化椎扬,越多越好
(1)重用converView:通過復(fù)用converview來減少不必要的view的創(chuàng)建,另外Infalte操作會(huì)把xml文件實(shí)例化成相應(yīng)的View實(shí)例具温,屬于IO操作蚕涤,是耗時(shí)操作。
(2)減少findViewById()操作:將xml文件中的元素封裝成viewholder靜態(tài)類桂躏,通過converview的setTag和getTag方法將view與相應(yīng)的holder對(duì)象綁定在一起钻趋,避免不必要的findviewbyid操作
(3)避免在getView方法中做耗時(shí)的操作:例如加載本地Image需要載入內(nèi)存以及解析Bitmap,都是比較耗時(shí)的操作剂习,如果用戶快速滑動(dòng)listview,會(huì)因?yàn)間etview邏輯過于復(fù)雜耗時(shí)而造成滑動(dòng)卡頓現(xiàn)象较沪。用戶滑動(dòng)時(shí)候不要加載圖片鳞绕,待滑動(dòng)完成再加載,可以使用這個(gè)第三方庫(kù)glide
(4)Item的布局層次結(jié)構(gòu)盡量簡(jiǎn)單尸曼,避免布局太深或者不必要的重繪
(5)盡量能保證Adapter的hasStableIds()返回true這樣在notifyDataSetChanged()的時(shí)候们何,如果item內(nèi)容并沒有變化,ListView將不會(huì)重新繪制這個(gè)View控轿,達(dá)到優(yōu)化的目的
(6)在一些場(chǎng)景中冤竹,ScollView內(nèi)會(huì)包含多個(gè)ListView,可以把listview的高度寫死固定下來茬射。由于ScollView在快速滑動(dòng)過程中需要大量計(jì)算每一個(gè)listview的高度鹦蠕,阻塞了UI線程導(dǎo)致卡頓現(xiàn)象出現(xiàn),如果我們每一個(gè)item的高度都是均勻的在抛,可以通過計(jì)算把listview的高度確定下來钟病,避免卡頓現(xiàn)象出現(xiàn).
(7)使用RecycleView代替listview:每個(gè)item內(nèi)容的變動(dòng),listview都需要去調(diào)用notifyDataSetChanged來更新全部的item,太浪費(fèi)性能了肠阱。RecycleView可以實(shí)現(xiàn)當(dāng)個(gè)item的局部刷新票唆,并且引入了增加和刪除的動(dòng)態(tài)效果,在性能上和定制上都有很大的改善
(8)ListView中元素避免半透明:半透明繪制需要大量乘法計(jì)算屹徘,在滑動(dòng)時(shí)不停重繪會(huì)造成大量的計(jì)算走趋,在比較差的機(jī)子上會(huì)比較卡。在設(shè)計(jì)上能不半透明就不不半透明噪伊。實(shí)在要弄就把在滑動(dòng)的時(shí)候把半透明設(shè)置成不透明簿煌,滑動(dòng)完再重新設(shè)置成半透明。
(9)盡量開啟硬件加速:硬件加速提升巨大酥宴,避免使用一些不支持的函數(shù)導(dǎo)致含淚關(guān)閉某個(gè)地方的硬件加速啦吧。當(dāng)然這一條不只是對(duì)ListView。
10.如何使用JNI
JAVA中聲明native方法如private native String printJNI(String inputStr);
使用javah工具生成.h頭文件這時(shí)候頭文件中就會(huì)自動(dòng)生成對(duì)應(yīng)的函數(shù)JNIEXPORT jstring JNICALL Java_com_wenming_HelloWorld_printJNI
實(shí)現(xiàn)JNI原生函數(shù)源文件拙寡,新建HelloWorld.c文件授滓,對(duì)剛才自動(dòng)生成的函數(shù)進(jìn)行具體的邏輯書寫,例如返回一個(gè)java叫做HelloWorld的字符串等
編譯生成動(dòng)態(tài)鏈接so文件**
Java中調(diào)用Sysytem.load方法把剛才的so庫(kù)加載進(jìn)來肆糕,就可以調(diào)用native方法了.
11.什么OOM般堆?
OOM全稱是Out Of Merrory,Android系統(tǒng)的每一個(gè)應(yīng)用程序都設(shè)置一個(gè)硬性的Dalvik Heap Size最大限制閾值诚啃,如果申請(qǐng)的內(nèi)存資源超過這個(gè)限制淮摔,系統(tǒng)就會(huì)拋出OOM錯(cuò)誤.
12.內(nèi)存泄漏有哪些場(chǎng)景以及解決方法
(1)類的靜態(tài)變量持有大數(shù)據(jù)對(duì)象,靜態(tài)變量長(zhǎng)期維持到大數(shù)據(jù)對(duì)象的引用,阻止垃圾回收始赎。
(2)非靜態(tài)內(nèi)部類存在靜態(tài)實(shí)例.非靜態(tài)內(nèi)部類會(huì)維持一個(gè)到外部類實(shí)例的引用和橙,如果非靜態(tài)內(nèi)部類的實(shí)例是靜態(tài)的造垛,就會(huì)間接長(zhǎng)期維持著外部類的引用魔招,阻止被回收掉。
(3)資源對(duì)象未關(guān)閉資源性對(duì)象比如(Cursor五辽,F(xiàn)ile文件等)往往都用了一些緩沖办斑,我們?cè)诓皇褂玫臅r(shí)候,應(yīng)該及時(shí)關(guān)閉它們杆逗, 以便它們的緩沖及時(shí)回收內(nèi)存乡翅。解決辦法:比如SQLiteCursor, 如果我們沒有關(guān)閉它罪郊,系統(tǒng)在回收它時(shí)也會(huì)關(guān)閉它蠕蚜,但是這樣的效率太低了。 因此對(duì)于資源性對(duì)象在不使用的時(shí)候排龄,應(yīng)該調(diào)用它的close()函數(shù)波势,將其關(guān)閉掉翎朱,然后才置為null.在我們的程序退出時(shí)一定要確保我們的資源性對(duì)象已經(jīng)關(guān)閉。
(4)Handler內(nèi)存泄漏Handler作為內(nèi)部類存在于Activity中尺铣,但是Handler生命周期與Activity生命周期往往并不是相同的拴曲,比如當(dāng)Handler對(duì)象有Message在排隊(duì),則無法釋放凛忿,進(jìn)而導(dǎo)致本該釋放的Acitivity也沒有辦法進(jìn)行回收澈灼。解決辦法:聲明handler為static類,這樣內(nèi)部類就不再持有外部類的引用了店溢,就不會(huì)阻塞Activity的釋放
12.如何避免OOM問題的出現(xiàn)
(1)使用更加輕量的數(shù)據(jù)結(jié)構(gòu).例如叁熔,我們可以考慮使用ArrayMap/SparseArray而不是HashMap等傳統(tǒng)數(shù)據(jù)結(jié)構(gòu)。通常的HashMap的實(shí)現(xiàn)方式更加消耗內(nèi)存床牧,因?yàn)樗枰粋€(gè)額外的實(shí)例對(duì)象來記錄Mapping操作荣回。
(2)避免在Android里面使用Enum
(3)減小Bitmap對(duì)象的內(nèi)存占用.Bitmap是一個(gè)極容易消耗內(nèi)存的大胖子,減小創(chuàng)建出來的Bitmap的內(nèi)存占用可謂是重中之重.
(4)Bitmap對(duì)象的復(fù)用.縮小Bitmap的同時(shí)戈咳,也需要提高BitMap對(duì)象的復(fù)用率心软,避免頻繁創(chuàng)建BitMap對(duì)象.
(5)使用更小的圖片.在涉及給到資源圖片時(shí),我們需要特別留意這張圖片是否存在可以壓縮的空間著蛙,是否可以使用更小的圖片删铃。盡量使用更小的圖片不僅可以減少內(nèi)存的使用,還能避免出現(xiàn)大量的InflationException踏堡。
(6)StringBuilder在有些時(shí)候猎唁,代碼中會(huì)需要使用到大量的字符串拼接的操作,這種時(shí)候有必要考慮使用StringBuilder來替代頻繁的“+”顷蟆。
(7)避免在onDraw方法里面執(zhí)行對(duì)象的創(chuàng)建.類似onDraw等頻繁調(diào)用的方法诫隅,一定需要注意避免在這里做創(chuàng)建對(duì)象的操作,因?yàn)樗麜?huì)迅速增加內(nèi)存的使用帐偎,而且很容易引起頻繁的gc阎肝,甚至是內(nèi)存抖動(dòng)。
(8)避免對(duì)象的內(nèi)存泄露.
13.什么是ANR?是由于什么原因引起的肮街?
ANR全稱Application Not Responding,意思就是程序未響應(yīng)判导。如果一個(gè)應(yīng)用無法響應(yīng)用戶的輸入嫉父,系統(tǒng)就會(huì)彈出一個(gè)ANR對(duì)話框,用戶可以自行選擇繼續(xù)等待亦或者是停止當(dāng)前程序眼刃。一旦出現(xiàn)下面兩種情況绕辖,則彈出ANR對(duì)話框
·應(yīng)用在5秒內(nèi)未響應(yīng)用戶的輸入事件(如按鍵或者觸摸)
·BroadcastReceiver未在10秒內(nèi)完成相關(guān)的處理
原因:
(1)主線程中存在耗時(shí)的計(jì)算
(2)主線程被IO操作(從4.0之后網(wǎng)絡(luò)IO不允許在主線程中)阻塞。
(3)主線程中錯(cuò)誤的操作擂红,比如Thread.wait或者Thread.sleep等
如何避免ANR問題:
(1)使用AsyncTask處理耗時(shí)IO操作仪际。
(2)使用Handler處理子線程結(jié)果,而不是使用Thread.wait()或者Thread.sleep()來阻塞主線程。
(3)Activity的onCreate和onResume回調(diào)中盡量避免耗時(shí)的代碼
(4)BroadcastReceiver中onReceive方法的操作時(shí)間在10秒之內(nèi)
14.數(shù)據(jù)持久化的四種方式有哪些树碱?
(1)文件存儲(chǔ):通過java.io.FileInputStream和java.io.FileOutputStream這兩個(gè)類來實(shí)現(xiàn)對(duì)文件的讀寫肯适,java.io.File類則用來構(gòu)造一個(gè)具體指向某個(gè)文件或者文件夾的對(duì)象。
(2)SharedPreferences:SharedPreferences是一種輕量級(jí)的數(shù)據(jù)存儲(chǔ)機(jī)制成榜,他將一些簡(jiǎn)單的數(shù)據(jù)類型的數(shù)據(jù)框舔,包括boolean類型,int類型赎婚,float類型刘绣,long類型以及String類型的數(shù)據(jù),以鍵值對(duì)的形式存儲(chǔ)在應(yīng)用程序的私有Preferences目錄(/data/data/<包名>/shared_prefs/)中挣输,這種Preferences機(jī)制廣泛應(yīng)用于存儲(chǔ)應(yīng)用程序中的配置信息纬凤。
(3)SQLite數(shù)據(jù)庫(kù):當(dāng)應(yīng)用程序需要處理的數(shù)據(jù)量比較大時(shí),為了更加合理地存儲(chǔ)撩嚼、管理停士、查詢數(shù)據(jù),我們往往使用關(guān)系數(shù)據(jù)庫(kù)來存儲(chǔ)數(shù)據(jù)绢馍。Android系統(tǒng)的很多用戶數(shù)據(jù)向瓷,如聯(lián)系人信息,通話記錄舰涌,短信息等猖任,都是存儲(chǔ)在SQLite數(shù)據(jù)庫(kù)當(dāng)中的,所以利用操作SQLite數(shù)據(jù)庫(kù)的API可以同樣方便的訪問和修改這些數(shù)據(jù)瓷耙。
(4)ContentProvider:主要用于在不同的應(yīng)用程序之間實(shí)現(xiàn)數(shù)據(jù)共享的功能朱躺,不同于sharepreference和文件存儲(chǔ)中的兩種全局可讀寫操作模式,內(nèi)容提供其可以選擇只對(duì)哪一部分?jǐn)?shù)據(jù)進(jìn)行共享搁痛,從而保證我們程序中的隱私數(shù)據(jù)不會(huì)有泄漏的風(fēng)險(xiǎn).