2017年據(jù)說是找工作的寒冬逞壁,作為一個(gè)Android開發(fā),下面的一些問題可能在面試的時(shí)候遇到哦:
1鉴裹、java 內(nèi)部類有哪些分類?都有什么特點(diǎn)
內(nèi)部類可以分為四種:1妇智、靜態(tài)內(nèi)部類:最簡(jiǎn)單的內(nèi)部類形式齐蔽,類定義時(shí)加上static關(guān)鍵字杠巡,不能和外部類有相同的名字剑勾,被編譯成一個(gè)完全獨(dú)立的.class文件埃撵,名稱為OuterClass$InnerClass.class的形式。只可以訪問外部類的靜態(tài)成員和靜態(tài)方法虽另,包括了私有的靜態(tài)成員和方法暂刘。2:成員內(nèi)部類:成員內(nèi)部類也是定義在另一個(gè)類中,但是定義時(shí)不用static修飾捂刺,成員內(nèi)部類和靜態(tài)內(nèi)部類可以類比為非靜態(tài)的成員變量和靜態(tài)的成員變量谣拣。成員內(nèi)部類就像一個(gè)實(shí)例變量。它可以訪問它的外部類的所有成員變量和方法族展,不管是靜態(tài)的還是非靜態(tài)的都可以森缠。3:局部內(nèi)部類:局部內(nèi)部類定義在方法中,比方法的范圍還小仪缸。是內(nèi)部類中最少用到的一種類型辅鲸。像局部變量一樣,不能被public, protected, private和static修飾腹殿。只能訪問方法中定義的final類型的局部變量。局部內(nèi)部類在方法中定義例书,所以只能在方法中使用锣尉,即只能在方法當(dāng)中生成局部內(nèi)部類的實(shí)例并且調(diào)用其方法。4:匿名內(nèi)部類:匿名內(nèi)部類就是沒有名字的局部內(nèi)部類决采,不使用關(guān)鍵字class, extends, implements, 沒有構(gòu)造方法自沧。匿名內(nèi)部類隱式地繼承了一個(gè)父類或者實(shí)現(xiàn)了一個(gè)接口。匿名內(nèi)部類使用得比較多,通常是作為一個(gè)方法參數(shù)拇厢。
2爱谁、Json支持哪些數(shù)據(jù)類型?
Number :雙精度浮點(diǎn)格式
String:字符型
Boolean:true 或 false
Array:值的有序序列
Value:它可以是一個(gè)字符串孝偎,一個(gè)數(shù)字访敌,真的還是假(true/false),空(null?)等
Object:無序集合鍵值對(duì)
Whitespace:可以使用任何一對(duì)中的令牌
null:empty
3衣盾、volatile關(guān)鍵字寺旺?
用volatile修飾的變量,線程在每次使用變量的時(shí)候势决,都會(huì)讀取變量修改后的最的值阻塑。volatile修飾的變量不允許線程內(nèi)部緩存和重排序,即直接修改內(nèi)存果复。所以對(duì)其他線程是可見的陈莽。但是這里需要注意一個(gè)問題,volatile只能讓被他修飾內(nèi)容具有可見性虽抄,但不能保證它具有原子性走搁。比如 volatile int a = 0;之后有一個(gè)操作 a++极颓;這個(gè)變量a具有可見性朱盐,但是a++ 依然是一個(gè)非原子操作,也就是這個(gè)操作同樣存在線程安全問題菠隆。當(dāng)對(duì)非volatile變量進(jìn)行讀寫的時(shí)候兵琳,每個(gè)線程先從內(nèi)存拷貝變量到CPU緩存中。如果計(jì)算機(jī)有多個(gè)CPU骇径,每個(gè)線程可能在不同的CPU上被處理躯肌,這意味著每個(gè)線程可以拷貝到不同的CPU cache中。而聲明變量是volatile的破衔,JVM保證了每次讀變量都從內(nèi)存中讀清女,跳過CPU cache這一步。
4晰筛、java中synchronized的用法嫡丙?
當(dāng)它用來修飾一個(gè)方法或者一個(gè)代碼塊的時(shí)候,能夠保證在同一時(shí)刻最多只有一個(gè)線程執(zhí)行該段代碼读第。
一曙博、當(dāng)兩個(gè)并發(fā)線程訪問同一個(gè)對(duì)象object中的這個(gè)synchronized(this)同步代碼塊時(shí),一個(gè)時(shí)間內(nèi)只能有一個(gè)線程得到執(zhí)行怜瞒。另一個(gè)線程必須等待當(dāng)前線程執(zhí)行完這個(gè)代碼塊以后才能執(zhí)行該代碼塊父泳。
二、然而,當(dāng)一個(gè)線程訪問object的一個(gè)synchronized(this)同步代碼塊時(shí)惠窄,另一個(gè)線程仍然可以訪問該object中的非synchronized(this)同步代碼塊蒸眠。
三、尤其關(guān)鍵的是杆融,當(dāng)一個(gè)線程訪問object的一個(gè)synchronized(this)同步代碼塊時(shí)楞卡,其他線程對(duì)object中所有其它synchronized(this)同步代碼塊的訪問將被阻塞。
四擒贸、第三同樣適用其它同步代碼塊臀晃。也就是說,當(dāng)一個(gè)線程訪問object的一個(gè)synchronized(this)同步代碼塊時(shí)介劫,它就獲得了這個(gè)object的對(duì)象鎖徽惋。結(jié)果,其它線程對(duì)該object對(duì)象所有同步代碼部分的訪問都被暫時(shí)阻塞座韵。
五险绘、以上規(guī)則對(duì)其它對(duì)象鎖同樣適用.
5、簡(jiǎn)述http協(xié)議誉碴?
http(超文本傳輸協(xié)議)是一個(gè)基于請(qǐng)求與響應(yīng)模式的宦棺、無狀態(tài)的、應(yīng)用層的協(xié)議黔帕,炒蹋基于TCP的連接方式,HTTP1.1版本中給出一種持續(xù)連接的機(jī)制成黄,絕大多數(shù)的Web開發(fā)呐芥,都是構(gòu)建在HTTP協(xié)議之上的Web應(yīng)用。
HTTP協(xié)議的主要特點(diǎn)可概括如下:
a.支持客戶/服務(wù)器模式奋岁。
b.簡(jiǎn)單快速:客戶向服務(wù)器請(qǐng)求服務(wù)時(shí)思瘟,只需傳送請(qǐng)求方法和路徑。請(qǐng)求方法常用的有GET闻伶、HEAD滨攻、POST。每種方法規(guī)定了客戶與服務(wù)器聯(lián)系的類型不同蓝翰。由于HTTP協(xié)議簡(jiǎn)單光绕,使得HTTP服務(wù)器的程序規(guī)模小,因而通信速度很快畜份。
c.靈活:HTTP允許傳輸任意類型的數(shù)據(jù)對(duì)象奇钞。正在傳輸?shù)念愋陀蒀ontent-Type加以標(biāo)記。
d.無連接:無連接的含義是限制每次連接只處理一個(gè)請(qǐng)求漂坏。服務(wù)器處理完客戶的請(qǐng)求,并收到客戶的應(yīng)答后,即斷開連接顶别。采用這種方式可以節(jié)省傳輸時(shí)間谷徙。
e.無狀態(tài):HTTP協(xié)議是無狀態(tài)協(xié)議。無狀態(tài)是指協(xié)議對(duì)于事務(wù)處理沒有記憶能力驯绎。缺少狀態(tài)意味著如果后續(xù)處理需要前面的信息完慧,則它必須重傳,這樣可能導(dǎo)致每次連接傳送的數(shù)據(jù)量增大剩失。另一方面屈尼,在服務(wù)器不需要先前信息時(shí)它的應(yīng)答就較快。
6拴孤、使用AlarmManage做倒計(jì)時(shí)或計(jì)數(shù)器脾歧?
AlarmManager的使用機(jī)制有的稱呼為全局定時(shí)器,有的稱呼為鬧鐘演熟,其實(shí)它的作用和Timer有點(diǎn)相似鞭执。都有兩種相似的用法:(1)在指定時(shí)長后執(zhí)行某項(xiàng)操作(2)周期性的執(zhí)行某項(xiàng)操作 。AlarmManager對(duì)象配合Intent使用芒粹,可以定時(shí)的開啟一個(gè)Activity,發(fā)送一個(gè)BroadCast,或者開啟一個(gè)Service.
Intent intent=newIntent(xxxx.this, xxx.class);
intent.setAction("repeating");
PendingIntent sender=PendingIntent
.getBroadcast(xxx.this,0, intent,0);
//開始時(shí)間
longfirstime=SystemClock.elapsedRealtime();
AlarmManager am=(AlarmManager)getSystemService(ALARM_SERVICE);
//5秒一個(gè)周期兄纺,不停的發(fā)送廣播
am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP
, firstime,5*1000, sender);
7、Android實(shí)現(xiàn)異步化漆?
a:繼承Thread類 b:實(shí)現(xiàn)Runnable接口? c:AsyncTask d : Handler.
8估脆、View的specMode?
EXACTLY:一般是設(shè)置了明確的值或者是MATCH_PARENT
AT_MOST:表示子布局限制在一個(gè)最大值內(nèi)座云,一般為WARP_CONTENT
UNSPECIFIED:表示子布局想要多大就多大疙赠,很少使用
9、 activity在屏幕旋轉(zhuǎn)時(shí)的生命周期
答:不設(shè)置Activity的android:configChanges時(shí)疙教,切屏?xí)匦抡{(diào)用各個(gè)生命周期棺聊,切橫屏?xí)r會(huì)執(zhí)行一次,切豎屏?xí)r會(huì)執(zhí)行兩次贞谓;設(shè)置Activity的android:configChanges="orientation"時(shí)限佩,切屏還是會(huì)重新調(diào)用各個(gè)生命周期,切橫裸弦、豎屏?xí)r只會(huì)執(zhí)行一次祟同;設(shè)置Activity的android:configChanges="orientation|keyboardHidden"時(shí),切屏不會(huì)重新調(diào)用各個(gè)生命周期理疙,只會(huì)執(zhí)行onConfigurationChanged方法
10晕城、 描述一下android的系統(tǒng)架構(gòu)
android系統(tǒng)架構(gòu)分從下往上為linux 內(nèi)核層、運(yùn)行庫窖贤、應(yīng)用程序框架層砖顷、和應(yīng)用程序?qū)印?/p>
linuxkernel:負(fù)責(zé)硬件的驅(qū)動(dòng)程序贰锁、網(wǎng)絡(luò)、電源滤蝠、系統(tǒng)安全以及內(nèi)存管理等功能豌熄。
libraries和 android runtime:libraries:即c/c++函數(shù)庫部分,大多數(shù)都是開放源代碼的函數(shù)庫物咳,例如webkit(引擎)锣险,該函數(shù)庫負(fù)責(zé) android網(wǎng)頁瀏覽器的運(yùn)行,例如標(biāo)準(zhǔn)的c函數(shù)庫libc览闰、openssl芯肤、sqlite等,當(dāng)然也包括支持游戲開發(fā)2dsgl和 3dopengles压鉴,在多媒體方面有mediaframework框架來支持各種影音和圖形文件的播放與顯示崖咨,例如mpeg4、h.264晴弃、mp3掩幢、 aac、amr上鞠、jpg和png等眾多的多媒體文件格式际邻。android的runtime負(fù)責(zé)解釋和執(zhí)行生成的dalvik格式的字節(jié)碼。
applicationframework(應(yīng)用軟件架構(gòu))芍阎,java應(yīng)用程序開發(fā)人員主要是使用該層封裝好的api進(jìn)行快速開發(fā)世曾。
applications:該層是java的應(yīng)用程序?qū)樱琣ndroid內(nèi)置的googlemaps谴咸、e-mail轮听、即時(shí)通信工具、瀏覽器岭佳、mp3播放器等處于該層血巍,java開發(fā)人員開發(fā)的程序也處于該層,而且和內(nèi)置的應(yīng)用程序具有平等的位置珊随,可以調(diào)用內(nèi)置的應(yīng)用程序述寡,也可以替換內(nèi)置的應(yīng)用程序。
上面的四個(gè)層次叶洞,下層為上層服務(wù)鲫凶,上層需要下層的支持,調(diào)用下層的服務(wù)衩辟,這種嚴(yán)格分層的方式帶來的極大的穩(wěn)定性螟炫、靈活性和可擴(kuò)展性,使得不同層的開發(fā)人員可以按照規(guī)范專心特定層的開發(fā)艺晴。
android應(yīng)用程序使用框架的api并在框架下運(yùn)行昼钻,這就帶來了程序開發(fā)的高度一致性掸屡,另一方面也告訴我們,要想寫出優(yōu)質(zhì)高效的程序就必須對(duì)整個(gè) applicationframework進(jìn)行非常深入的理解然评。精通applicationframework折晦,你就可以真正的理解android的設(shè)計(jì)和運(yùn)行機(jī)制,也就更能夠駕馭整個(gè)應(yīng)用層的開發(fā)沾瓦。
11、一個(gè)".java"源文件中是否可以包括多個(gè)類(不是內(nèi)部類)谦炒?有什么限制贯莺?
可以有多個(gè)類,但只能有一個(gè)public的類宁改,并且public的類名必須與文件的主文件名相同缕探。
包含多個(gè)類的Java源文件編譯之后會(huì)生成多個(gè).class文件
12、Java如何跳出當(dāng)前的多重嵌套循環(huán)还蹲?
在Java中爹耗,要想跳出多重循環(huán),可以在外面的循環(huán)語句前定義一個(gè)標(biāo)號(hào)谜喊,然后在里層循環(huán)體的代碼中使用帶有標(biāo)號(hào)的break 語句潭兽,即可跳出外層循環(huán)。例如斗遏,
outer:
for(inti=0;i<10;i++)
{
for(intj=0;j<10;j++)
{
System.out.println(“i=”+ i + “,j=” + j);
if(j== 5) break ouer;
}
}
13山卦、垃圾回收考慮幾種回收機(jī)制。
對(duì)于一個(gè)垃圾回收器的設(shè)計(jì)算法來說诵次,大致有如下可供選擇的設(shè)計(jì):
A.串行回收(Serial)和并行回收(Parallel):串行回收就是不管系統(tǒng)有多少個(gè)CPU账蓉,始終只用一個(gè)CPU來執(zhí)行垃圾回收操作;而并行回收就是把整個(gè)回收工作拆分成多部分逾一,每個(gè)部分由一個(gè)CPU負(fù)責(zé)铸本,從而讓多個(gè)CPU并行回收,并行回收的執(zhí)行效率很高遵堵,但復(fù)雜度增加箱玷,另外也有其他一些副作用,比如內(nèi)存碎片會(huì)增加鄙早。
B.并發(fā)執(zhí)行(Concurrent)和應(yīng)用程序停止(Stop-the-world):汪茧。Stop-the-world的垃圾回收方式在執(zhí)行垃圾回收的同時(shí)會(huì)導(dǎo)致應(yīng)用程序的暫停。并發(fā)執(zhí)行的垃圾回收雖然不會(huì)導(dǎo)致應(yīng)用程序的暫停限番,但由于并發(fā)執(zhí)行垃圾回收需要解決和應(yīng)用程序的執(zhí)行沖突(應(yīng)用程序可能會(huì)在垃圾回收的過稱中修改對(duì)象)舱污,因此并發(fā)執(zhí)行垃圾回收的系統(tǒng)開銷比Stop-the-world更好,而且執(zhí)行時(shí)也需要更多的堆內(nèi)存弥虐。
C.壓縮(Compacting)和不壓縮(Non-compacting)和復(fù)制(Copying):為了減少內(nèi)存碎片扩灯,支持壓縮的垃圾回收器會(huì)把所有的活對(duì)象搬遷到一起媚赖,然后將之前占用的內(nèi)存全部回收。不壓縮式的垃圾回收器只是回收內(nèi)存珠插,這樣回收回來的內(nèi)存不可能是連續(xù)的惧磺,因此將會(huì)有較多的內(nèi)存碎片。較之壓縮式的垃圾回收捻撑,不壓縮式的垃圾回收回收內(nèi)存快了磨隘,而分配內(nèi)存時(shí)就會(huì)更慢,而且無法解決內(nèi)存碎片的問題顾患。復(fù)制式的垃圾回收會(huì)將所有可達(dá)對(duì)象復(fù)制到另一塊相同的內(nèi)存中番捂,這種方式的優(yōu)點(diǎn)是垃圾及回收過程不會(huì)產(chǎn)生內(nèi)存碎片,但缺點(diǎn)也很明顯江解,需要拷貝數(shù)據(jù)和額外的內(nèi)存设预。
14、sleep() 和 wait() 有什么區(qū)別?
對(duì)于sleep()方法犁河,我們首先要知道該方法是屬于Thread類中的鳖枕。而wait()方法,則是屬于Object類中的桨螺。
sleep()方法導(dǎo)致了程序暫停執(zhí)行指定的時(shí)間宾符,讓出cpu給其他線程,但是他的監(jiān)控狀態(tài)依然保持者彭谁,當(dāng)指定的時(shí)間到了又會(huì)自動(dòng)恢復(fù)運(yùn)行狀態(tài)吸奴。
在調(diào)用sleep()方法的過程中,線程不會(huì)釋放對(duì)象鎖缠局。
而當(dāng)調(diào)用wait()方法的時(shí)候则奥,線程會(huì)放棄對(duì)象鎖,進(jìn)入等待此對(duì)象的等待鎖定池狭园,只有針對(duì)此對(duì)象調(diào)用notify()方法后本線程才進(jìn)入對(duì)象鎖定池準(zhǔn)備
獲取對(duì)象鎖進(jìn)入運(yùn)行狀態(tài)
15读处、簡(jiǎn)述synchronized和java.util.concurrent.locks.Lock的異同?
ReentrantLock 擁有Synchronized相同的并發(fā)性和內(nèi)存語義唱矛,此外還多了 鎖投票罚舱,定時(shí)鎖等候和中斷鎖等候,線程A和B都要獲取對(duì)象O的鎖定绎谦,假設(shè)A獲取了對(duì)象O鎖管闷,B將等待A釋放對(duì)O的鎖定,如果使用 synchronized 窃肠,如果A不釋放包个,B將一直等下去,不能被中斷如果 使用ReentrantLock冤留,如果A不釋放碧囊,可以使B在等待了足夠長的時(shí)間以后树灶,中斷等待,而干別的事情糯而。
synchronized是在JVM層面上實(shí)現(xiàn)的天通,不但可以通過一些監(jiān)控工具監(jiān)控synchronized的鎖定,而且在代碼執(zhí)行時(shí)出現(xiàn)異常熄驼,JVM會(huì)自動(dòng)釋放鎖定像寒,但是使用Lock則不行,lock是通過代碼實(shí)現(xiàn)的瓜贾,要保證鎖定一定會(huì)被釋放萝映,就必須將unLock()放到finally{}中
在資源競(jìng)爭(zhēng)不是很激烈的情況下,Synchronized的性能要優(yōu)于ReetrantLock阐虚,但是在資源競(jìng)爭(zhēng)很激烈的情況下,Synchronized的性能會(huì)下降幾十倍蚌卤,但是ReetrantLock的性能能維持常態(tài)
Atomic:和上面的類似实束,不激烈情況下,性能比synchronized略遜逊彭,而激烈的時(shí)候咸灿,也能維持常態(tài)。激烈的時(shí)候侮叮,Atomic的性能會(huì)優(yōu)于ReentrantLock一倍左右避矢。但是其有一個(gè)缺點(diǎn),就是只能同步一個(gè)值囊榜,一段代碼中只能出現(xiàn)一個(gè)Atomic的變量审胸,多于一個(gè)同步無效。因?yàn)樗荒茉诙鄠€(gè)Atomic之間同步卸勺。
16砂沛、View, SurfaceView, GLSurfaceView有什么區(qū)別?
答:View是最基礎(chǔ)的曙求,必須在UI主線程內(nèi)更新畫面碍庵,速度較慢。
SurfaceView 是View的子類悟狱,使用了雙緩機(jī)制静浴,在新的線程中更新畫面所以刷新界面速度比View快。
SurfaceView一般會(huì)與SurfaceHolder結(jié)合使用挤渐,調(diào)用SurfaceView的getHolder()方法即可獲取SurfaceView關(guān)聯(lián)的SurfaceHolder苹享,SurfaceHolder用于向與之關(guān)聯(lián)的SurfaceView上繪圖,
SurfaceHolder提供了如下方法來獲取Canvas對(duì)象:
- CanvaslockCanvas():鎖定整個(gè)SurfaceView對(duì)象挣菲,獲取該Surface上的Canvas富稻。
- CanvaslockCanvas(Rect dirty):鎖定SurfaceView上Rect劃分的區(qū)域掷邦,獲取該Surface上的Canvas。
當(dāng)對(duì)同一個(gè)SurfaceView調(diào)用上面兩個(gè)方法時(shí)椭赋,兩個(gè)方法所返回的是同一個(gè)Canvas對(duì)象抚岗。但當(dāng)程序調(diào)用第二個(gè)方法獲取指定區(qū)域的Canvas時(shí),SurfaceView將只對(duì)Rect所“圈”出來的區(qū)域進(jìn)行更新哪怔,通過這種方式可以提高畫面的更新速度宣蔚。
當(dāng)通過lockCanvas()獲取指定了SurfaceView上的Canvas之后,接下來程序就可調(diào)用Canvas進(jìn)行繪圖了认境,Canvas繪圖完成后通過如下方法來釋放繪圖胚委、提交所繪制的圖形:
-unlockCanvasAndPost(canvas);
GLSurfaceView 是SurfaceView的子類,OpenGL專用的叉信。
17亩冬、Java 中的內(nèi)存分配
靜態(tài)儲(chǔ)存區(qū):編譯時(shí)就分配好,在程序整個(gè)運(yùn)行期間都存在硼身。它主要存放靜態(tài)數(shù)據(jù)和常量硅急;
棧區(qū):當(dāng)方法執(zhí)行時(shí),會(huì)在棧區(qū)內(nèi)存中創(chuàng)建方法體內(nèi)部的局部變量佳遂,方法結(jié)束后自動(dòng)釋放內(nèi)存营袜;
堆區(qū):通常存放 new 出來的對(duì)象。由 Java 垃圾回收器回收
18丑罪、Java中四種引用
強(qiáng)引用(StrongReference):強(qiáng)引用就是指在程序代碼之中普遍存在的荚板,只要某個(gè)對(duì)象有強(qiáng)引用與之關(guān)聯(lián),JVM必定不會(huì)回收這個(gè)對(duì)象吩屹,即使在內(nèi)存不足的情況下跪另,JVM寧愿拋出OutOfMemory錯(cuò)誤也不會(huì)回收這種對(duì)象
軟引用(SoftReference):軟引用是用來描述一些有用但并不是必需的對(duì)象,在Java中用java.lang.ref.SoftReference類來表示煤搜。對(duì)于軟引用關(guān)聯(lián)著的對(duì)象罚斗,只有在內(nèi)存不足的時(shí)候JVM才會(huì)回收該對(duì)象。因此宅楞,這一點(diǎn)可以很好地用來解決OOM的問題针姿,并且這個(gè)特性很適合用來實(shí)現(xiàn)緩存:比如網(wǎng)頁緩存、圖片緩存等厌衙。
弱引用(WeakReference):弱引用也是用來描述非必需對(duì)象的距淫,當(dāng)JVM進(jìn)行垃圾回收時(shí),無論內(nèi)存是否充足婶希,都會(huì)回收被弱引用關(guān)聯(lián)的對(duì)象榕暇。在java中,用java.lang.ref.WeakReference類來表示。
虛引用(PhantomReference):虛引用和前面的軟引用彤枢、弱引用不同狰晚,它并不影響對(duì)象的生命周期。在java中java.lang.ref.PhantomReference類表示缴啡。如果一個(gè)對(duì)象與虛引用關(guān)聯(lián)壁晒,則跟沒有引用與之關(guān)聯(lián)一樣,在任何時(shí)候都可能被垃圾回收器回收业栅。要注意的是秒咐,虛引用必須和引用隊(duì)列關(guān)聯(lián)使用,當(dāng)垃圾回收器準(zhǔn)備回收一個(gè)對(duì)象時(shí)碘裕,如果發(fā)現(xiàn)它還有虛引用携取,就會(huì)把這個(gè)虛引用加入到與之 關(guān)聯(lián)的引用隊(duì)列中。程序可以通過判斷引用隊(duì)列中是否已經(jīng)加入了虛引用帮孔,來了解被引用的對(duì)象是否將要被垃圾回收雷滋。如果程序發(fā)現(xiàn)某個(gè)虛引用已經(jīng)被加入到引用隊(duì)列,那么就可以在所引用的對(duì)象的內(nèi)存被回收之前采取必要的行動(dòng)文兢。
對(duì)于強(qiáng)引用惊豺,我們平時(shí)在編寫代碼時(shí)經(jīng)常會(huì)用到。而對(duì)于其他三種類型的引用禽作,使用得最多的就是軟引用和弱引用,這2種既有相似之處又有區(qū)別揩页。它們都是用來描述非必需對(duì)象的旷偿,但是被軟引用關(guān)聯(lián)的對(duì)象只有在內(nèi)存不足時(shí)才會(huì)被回收,而被弱引用關(guān)聯(lián)的對(duì)象在JVM進(jìn)行垃圾回收時(shí)總會(huì)被回收爆侣。針對(duì)上面的特性萍程,軟引用適合用來進(jìn)行緩存,當(dāng)內(nèi)存不夠時(shí)能讓JVM回收內(nèi)存兔仰,弱引用能用來在回調(diào)函數(shù)中防止內(nèi)存泄露茫负。因?yàn)榛卣{(diào)函數(shù)往往是匿名內(nèi)部類,隱式保存有對(duì)外部類的引用乎赴,所以如果回調(diào)函數(shù)是在另一個(gè)線程里面被回調(diào)忍法,而這時(shí)如果需要回收外部類,那么就會(huì)內(nèi)存泄露榕吼,因?yàn)槟涿麅?nèi)部類保存有對(duì)外部類的強(qiáng)引用饿序。
19、activity的四種啟動(dòng)模式
standard:默認(rèn)模式羹蚣,可以不用寫配置原探。在這個(gè)模式下,都會(huì)默認(rèn)創(chuàng)建一個(gè)新的實(shí)例。因此咽弦,在這種模式下徒蟆,可以有多個(gè)相同的實(shí)例,也允許多個(gè)相同Activity疊加
singleTop:可以有多個(gè)實(shí)例型型,但是不允許多個(gè)相同Activity疊加段审。即,如果Activity在棧頂?shù)臅r(shí)候输莺,啟動(dòng)相同的Activity戚哎,不會(huì)創(chuàng)建新的實(shí)例,而會(huì)調(diào)用其onNewIntent方法嫂用。
singleTask:只有一個(gè)實(shí)例型凳。在同一個(gè)應(yīng)用程序中啟動(dòng)他的時(shí)候,若Activity不存在嘱函,則會(huì)在當(dāng)前task創(chuàng)建一個(gè)新的實(shí)例甘畅,若存在,則會(huì)把task中在其之上的其它Activity destory掉并調(diào)用它的onNewIntent方法往弓。如果是在別的應(yīng)用程序中啟動(dòng)它疏唾,則會(huì)新建一個(gè)task,并在該task中啟動(dòng)這個(gè)Activity函似,singleTask允許別的Activity與其在一個(gè)task中共存槐脏,也就是說,如果我在這個(gè)singleTask的實(shí)例中再打開新的Activity撇寞,這個(gè)新的Activity還是會(huì)在singleTask的實(shí)例的task中顿天。
singleInstance:只有一個(gè)實(shí)例,并且這個(gè)實(shí)例獨(dú)立運(yùn)行在一個(gè)task中蔑担,這個(gè)task只有這個(gè)實(shí)例牌废,不允許有別的Activity存在
20、java中String啤握,StringBuilder, StringBuffer的區(qū)別
String類中使用字符數(shù)組保存字符串鸟缕,因?yàn)橛小癴inal”修飾符,所以string對(duì)象是不可變的排抬。StringBuilder與StringBuffer都繼承AbstractStringBuilder類懂从,在AbstractStringBuilder中也是使用字符數(shù)組保存字符串,這兩種對(duì)象都是可變的蹲蒲。
String中的對(duì)象是不可變的莫绣,也就可以理解為常量,顯然線程安全悠鞍;StringBuffer對(duì)方法加了同步鎖或者對(duì)調(diào)用的方法加了同步鎖对室,所以是線程安全的模燥;
21:HashMap, LinkedHashMap, TreeMap,區(qū)別
Map主要用于存儲(chǔ)健值對(duì)掩宜,根據(jù)鍵得到值蔫骂,因此不允許鍵重復(fù)(重復(fù)了覆蓋了),但允許值重復(fù)
Hashmap 是一個(gè)最常用的Map,它根據(jù)鍵的HashCode 值存儲(chǔ)數(shù)據(jù),根據(jù)鍵可以直接獲取它的值,具有很快的訪問速度牺汤,遍歷時(shí)辽旋,取得數(shù)據(jù)的順序是完全隨機(jī)的。HashMap最多只允許一條記錄的鍵為Null;允許多條記錄的值為 Null;HashMap不支持線程的同步
Hashtable與 HashMap類似,它繼承自Dictionary類檐迟,不同的是:它不允許記錄的鍵或者值為空;它支持線程的同步补胚,即任一時(shí)刻只有一個(gè)線程能寫Hashtable,因此也導(dǎo)致了 Hashtable在寫入時(shí)會(huì)比較慢。
LinkedHashMap保存了記錄的插入順序追迟,在用Iterator遍歷LinkedHashMap時(shí)溶其,先得到的記錄肯定是先插入的.也可以在構(gòu)造時(shí)用帶參數(shù),按照應(yīng)用次數(shù)排序敦间。在遍歷的時(shí)候會(huì)比HashMap慢瓶逃,不過有種情況例外,當(dāng)HashMap容量很大廓块,實(shí)際數(shù)據(jù)較少時(shí)厢绝,遍歷起來可能會(huì)比LinkedHashMap慢,因?yàn)?b>LinkedHashMap的遍歷速度只和實(shí)際數(shù)據(jù)有關(guān)带猴,和容量無關(guān)昔汉,而HashMap的遍歷速度和他的容量有關(guān)
TreeMap實(shí)現(xiàn)SortMap接口,能夠把它保存的記錄根據(jù)鍵排序,默認(rèn)是按鍵值的升序排序拴清,也可以指定排序的比較器靶病,當(dāng)用Iterator 遍歷TreeMap時(shí),得到的記錄是排過序的贷掖。
一般情況下,我們用的最多的是HashMap,HashMap里面存入的鍵值對(duì)在取出的時(shí)候是隨機(jī)的,它根據(jù)鍵的HashCode值存儲(chǔ)數(shù)據(jù),根據(jù)鍵可以直接獲取它的值渴语,具有很快的訪問速度。在Map 中插入、刪除和定位元素躬厌,HashMap 是最好的選擇滩褥。
TreeMap取出來的是排序后的鍵值對(duì)。但如果您要按自然順序或自定義順序遍歷鍵调违,那么TreeMap會(huì)更好窟哺。
LinkedHashMap 是HashMap的一個(gè)子類,如果需要輸出的順序和輸入的相同,那么用LinkedHashMap可以實(shí)現(xiàn),它還可以按讀取順序來排列技肩,像連接池中可以應(yīng)用且轨。
22、TCP和UDP的區(qū)別
TCP/IP協(xié)議是一個(gè)協(xié)議簇。里面包括很多協(xié)議的旋奢。UDP只是其中的一個(gè)泳挥。之所以命名為TCP/IP協(xié)議,因?yàn)門CP,IP協(xié)議是兩個(gè)很重要的協(xié)議至朗,就用他兩命名了屉符。
一個(gè)TCP協(xié)議連接其實(shí)就是在物理線路上創(chuàng)建的一條“虛擬信道”。這條“虛擬信道”建立后锹引,在TCP協(xié)議發(fā)出FIN包之前(兩個(gè)終端都會(huì)向?qū)Ψ桨l(fā)送一個(gè)FIN包)矗钟,是不會(huì)釋放的。正因?yàn)檫@一點(diǎn)嫌变,TCP協(xié)議被稱為面向連接的協(xié)議吨艇!
UDP協(xié)議,一樣會(huì)在物理線路上創(chuàng)建一條“虛擬信道”初澎,否則UDP協(xié)議無法傳輸數(shù)據(jù)秸应!但是,當(dāng)UDP協(xié)議傳完數(shù)據(jù)后碑宴,這條“虛擬信道”就被立即注銷了软啼!因此,稱UDP是不面向連接的協(xié)議延柠!
主要區(qū)別:
基于連接與無連接祸挪;
對(duì)系統(tǒng)資源的要求(TCP較多,UDP少)贞间;
UDP程序結(jié)構(gòu)較簡(jiǎn)單贿条;
流模式與數(shù)據(jù)報(bào)模式 ;
TCP保證數(shù)據(jù)正確性增热,UDP可能丟包整以,TCP保證數(shù)據(jù)順序,UDP不保證峻仇。
23公黑、http session機(jī)制
http是無狀態(tài)的協(xié)議,客戶每次讀取web頁面時(shí)摄咆,服務(wù)器都打開新的會(huì)話凡蚜,而且服務(wù)器也不會(huì)自動(dòng)維護(hù)客戶的上下文信息,那么要怎么才能實(shí)現(xiàn)會(huì)話跟蹤呢吭从?session就是一種保存上下文信息的機(jī)制朝蜘,它是針對(duì)每一個(gè)用戶的,變量的值保存在服務(wù)器端涩金,通過SessionID來區(qū)分不同的客戶,session是以cookie或URL重寫為基礎(chǔ)的谱醇,默認(rèn)使用cookie來實(shí)現(xiàn)暇仲,系統(tǒng)會(huì)創(chuàng)造一個(gè)名為JSESSIONID的輸出返回給客戶端Cookie保存。
保存session id的幾種方式
A.保存session id的方式可以采用cookie枣抱,這樣在交互過程中瀏覽器可以自動(dòng)的按照規(guī)則把這個(gè)標(biāo)識(shí)發(fā)送給服務(wù)器熔吗。
B.由于cookie可以被人為的禁止,必須有其它的機(jī)制以便在cookie被禁止時(shí)仍然能夠把session id傳遞回服務(wù)器佳晶,經(jīng)常采用的一種技術(shù)叫做URL重寫桅狠,就是把session id附加在URL路徑的后面,附加的方式也有兩種轿秧,一種是作為URL路徑的附加信息中跌,另一種是作為查詢字符串附加在URL后面。網(wǎng)絡(luò)在整個(gè)交互過程中始終保持狀態(tài)菇篡,就必須在每個(gè)客戶端可能請(qǐng)求的路徑后面都包含這個(gè)session id漩符。
C.另一種技術(shù)叫做表單隱藏字段。就是服務(wù)器會(huì)自動(dòng)修改表單驱还,添加一個(gè)隱藏字段嗜暴,以便在表單提交時(shí)能夠把session id傳遞回服務(wù)器。
24议蟆、動(dòng)態(tài)廣播訂閱和靜態(tài)廣播訂閱的區(qū)別
靜態(tài)訂閱廣播又叫:常駐型廣播闷沥,當(dāng)你的應(yīng)用程序關(guān)閉了,如果有廣播信息來咐容,你寫的廣播接收器同樣的能接受到舆逃,他的注冊(cè)方式就是在你的應(yīng)用程序中的AndroidManifast.xml進(jìn)行訂閱的。
動(dòng)態(tài)訂閱廣播又叫:非常駐型廣播戳粒,當(dāng)應(yīng)用程序結(jié)束了路狮,廣播自然就沒有了,比如你在activity中的onCreate或者onResume中訂閱廣播蔚约,同時(shí)你必須在onDestory或者onPause中取消廣播訂閱奄妨。不然會(huì)報(bào)異常,這樣你的廣播接收器就一個(gè)非常駐型的了苹祟。
這里面還有一個(gè)細(xì)節(jié)那就是這兩種訂閱方式砸抛,在發(fā)送廣播的時(shí)候需要注意的是:動(dòng)態(tài)注冊(cè)的時(shí)候使用的是隱式intent方式的,所以在發(fā)送廣播的時(shí)候需要使用隱式Intent去發(fā)送苔咪,不然是廣播接收者是接收不到廣播的锰悼,這一點(diǎn)要注意柳骄。但是靜態(tài)訂閱的時(shí)候团赏,因?yàn)樵贏ndroidMainfest.xml中訂閱的,所以在發(fā)送廣播的時(shí)候使用顯示Intent和隱式Intent都可以(當(dāng)然這個(gè)只針對(duì)于我們自己定義的廣播接收者)耐薯,所以以防萬一舔清,我們一般都采用隱式Intent去發(fā)送廣播
動(dòng)態(tài)廣播比靜態(tài)廣播具有更高的優(yōu)先級(jí)
25丝里、Android handler機(jī)制
基本流程:
首先Looper.prepare()在本線程中保存一個(gè)Looper實(shí)例,然后該實(shí)例中保存一個(gè)MessageQueue對(duì)象体谒;因?yàn)長ooper.prepare()在一個(gè)線程中只能調(diào)用一次杯聚,所以MessageQueue在一個(gè)線程中只會(huì)存在一個(gè)。
2抒痒、Looper.loop()會(huì)讓當(dāng)前線程進(jìn)入一個(gè)無限循環(huán)幌绍,不端從MessageQueue的實(shí)例中讀取消息,然后回調(diào)msg.target.dispatchMessage(msg)方法故响。因?yàn)檫@里采用的是無限循環(huán)傀广,所以可能會(huì)有個(gè)疑問:該循環(huán)會(huì)不會(huì)特別消耗CPU資源?其實(shí)并不會(huì)彩届,如果messageQueue有消息伪冰,自然是繼續(xù)取消息;如果已經(jīng)沒有消息了樟蠕,此時(shí)該線程便會(huì)阻塞在該next()方法的nativePollOnce()方法中贮聂,主線程便會(huì)釋放CPU資源進(jìn)入休眠狀態(tài),直到下個(gè)消息到達(dá)或者有事務(wù)發(fā)生時(shí)寨辩,才通過往pipe管道寫端寫入數(shù)據(jù)來喚醒主線程工作
3吓懈、Handler的構(gòu)造方法,會(huì)首先得到當(dāng)前線程中保存的Looper實(shí)例捣染,進(jìn)而與Looper實(shí)例中的MessageQueue想關(guān)聯(lián)骄瓣。
4、Handler的sendMessage方法耍攘,會(huì)給msg的target賦值為handler自身榕栏,然后加入MessageQueue中。
5蕾各、在構(gòu)造Handler實(shí)例時(shí)扒磁,我們會(huì)重寫handleMessage方法,也就是msg.target.dispatchMessage(msg)最終調(diào)用的方法式曲。
在Activity中妨托,我們并沒有顯示的調(diào)用Looper.prepare()和Looper.loop()方法,為啥Handler可以成功創(chuàng)建呢吝羞,這是因?yàn)樵贏ctivity的啟動(dòng)代碼中兰伤,已經(jīng)在當(dāng)前UI線程調(diào)用了Looper.prepare()和Looper.loop()方法。
26钧排、AIDL原理
AIDL (Android Interface Definition Language) 是一種IDL 語言敦腔,用于生成可以在Android設(shè)備上兩個(gè)進(jìn)程之間進(jìn)行進(jìn)程間通信(interprocess communication, IPC)的代碼。如果在一個(gè)進(jìn)程中(例如Activity)要調(diào)用另一個(gè)進(jìn)程中(例如Service)對(duì)象的操作恨溜,就可以使用AIDL生成可序列化的參數(shù)符衔。AIDL IPC機(jī)制是面向接口的找前,像COM或Corba一樣,但是更加輕量級(jí)判族。它是使用代理類在客戶端和實(shí)現(xiàn)端傳遞數(shù)據(jù)躺盛。
27、Android 下res和assert有什么區(qū)別
相同點(diǎn):.兩者目錄下的文件在打包后會(huì)原封不動(dòng)的保存在apk包中形帮,不會(huì)被編譯成二進(jìn)制槽惫。
不同點(diǎn):res/raw中的文件會(huì)被映射到R.Java文件中,訪問的時(shí)候直接使用資源id即R.id.filename辩撑;assets文件夾下的文件不會(huì)被映射到R.java中躯枢,訪問的時(shí)候需要AssetManager類。
raw是Resources (res)的子目錄槐臀,Android會(huì)自動(dòng)的為這目錄中的所有資源文件生成一個(gè)ID锄蹂,這個(gè)ID會(huì)被存儲(chǔ)在R類當(dāng)中,作為一個(gè)文件的引用水慨。這意味著這個(gè)資源 文件可以很容易的被Android的類和方法訪問到得糜,甚至在Android XML文件中你也可以@raw/的形式引用到它。在Android中晰洒,使用ID是訪問一個(gè)文件最快捷的方式朝抖。MP3和Ogg文件放在這個(gè)目錄下是比較合適 的
assets目錄更像一個(gè)附錄類型的目錄,Android不會(huì)為這個(gè)目錄中的文件生成ID并保存在R類當(dāng)中谍珊,因此它與 Android中的一些類和方法兼容度更低治宣。同時(shí),由于你需要一個(gè)字符串路徑來獲取這個(gè)目錄下的文件描述符砌滞,訪問的速度會(huì)更慢侮邀。但是把一些文件放在這個(gè)目 錄下會(huì)使一些操作更加方便,比方說拷貝一個(gè)數(shù)據(jù)庫文件到系統(tǒng)內(nèi)存中贝润。要注意的是绊茧,你無法在Android XML文件中引用到assets目錄下的文件,只能通過AssetManager來訪問這些文件打掘。數(shù)據(jù)庫文件和游戲數(shù)據(jù)等放在這個(gè)目錄下是比較合適的华畏。
28、頁面卡頓原因分析及分析工具以及解決方法
界面卡頓影響的頁面 :ListView尊蚁、ScrollView亡笑、有動(dòng)畫的頁面等
分析步驟:打開調(diào)試開發(fā)者選項(xiàng),GPU呈現(xiàn)模式分析:如果藍(lán)色部分比較高横朋,說明是UI線程性能問題仑乌;紅色部分比較高,應(yīng)該是DrawList比較復(fù)雜,這部分可能跟藍(lán)色部分相關(guān)绝骚。目前還沒想到藍(lán)色部分不高,紅色部分搞的案例祠够;黃色部分高压汪,也許是GPU太忙,也許是CPU太忙古瓤。 GPU太忙止剖,說明DrawList太多,CPU太忙落君,說明要么主線程性能有問題穿香,要么GPU太忙,來不及通知主線程绎速∑せ瘢總的來說,三部分是相關(guān)的纹冤。藍(lán)色部分的高洒宝,可以直接導(dǎo)致紅色和黃色部分的高,所以萌京,重點(diǎn)還是分析藍(lán)色部分的高雁歌。
分析主線程性能:兩種類型的影響因素:全局級(jí)別的影響因素;比如CPU性能低知残、內(nèi)存不足靠瞎,頻繁GC。 頁面級(jí)別的影響因素求妹;頁面的 measure比較耗時(shí)頁面的乏盐、 layout比較耗時(shí)、頁面的 draw比較耗時(shí)制恍。
如果所有頁面都慢丑勤,判定是全局級(jí)別因素,如果只有某個(gè)頁面慢吧趣,判定是頁面級(jí)別的原因
頁面級(jí)別的影響因素一般原因:有自定義控件法竞,measure, layout, draw效率比較低;View 結(jié)構(gòu)比較復(fù)雜或者不合理强挫,導(dǎo)致 measure, layout效率比較低岔霸;頁面結(jié)構(gòu)設(shè)計(jì)復(fù)雜或者不合理,導(dǎo)致draw效率比較低俯渤,過度繪制
頁面級(jí)別影響因素的分析工具及方法:
自定義控件效率低下:用 method tracing可以發(fā)現(xiàn)呆细,Android Studio:? Android Monitor-->start method tracing,結(jié)果用Exclusive Time排序
Android systrace? ? Method Profiling
29、Json數(shù)據(jù)的解析
android的json解析部分都在包org.json下八匠,主要有以下幾個(gè)類:
JSONObject:可以看作是一個(gè)json對(duì)象,這是系統(tǒng)中有關(guān)JSON定義的基本單元絮爷,其包含一對(duì)(Key/Value)數(shù)值
JSONArray:它代表一組有序的數(shù)值
解析Json的例子:
/ 假設(shè)現(xiàn)在要?jiǎng)?chuàng)建這樣一個(gè)json文本
//??{
//??????"phone"?:?["12345678",?"87654321"],?//?數(shù)組
//??????"name"?:?"yuanzhifei89",?//?字符串
//??????"age"?:?100,?//?數(shù)值
//??????"address"?:?{?"country"?:?"china",?"province"?:?"jiangsu"?},?//?對(duì)象
//??????"married"?:?false?//?布爾值
//??}
try{
//?首先最外層是{}趴酣,是創(chuàng)建一個(gè)對(duì)象
JSONObject?person?=newJSONObject();
//?第一個(gè)鍵phone的值是數(shù)組,所以需要?jiǎng)?chuàng)建數(shù)組對(duì)象
JSONArray?phone?=newJSONArray();
phone.put("12345678").put("87654321");
person.put("phone",?phone);
person.put("name","yuanzhifei89");
person.put("age",100);
//?鍵address的值是對(duì)象坑夯,所以又要?jiǎng)?chuàng)建一個(gè)對(duì)象
JSONObject?address?=newJSONObject();
address.put("country","china");
address.put("province","jiangsu");
person.put("address",?address);
person.put("married",false);
}catch(JSONException?ex)?{
//?鍵為null或使用json不支持的數(shù)字格式(NaN,?infinities)
thrownewRuntimeException(ex);
}
30岖寞、怎么做出一個(gè)dialog樣式的activity
android自帶theme如下:
?android:theme="@android:style/Theme.Dialog"?? 將一個(gè)Activity顯示為對(duì)話框模式
?android:theme="@android:style/Theme.NoTitleBar"? 不顯示應(yīng)用程序標(biāo)題欄
?android:theme="@android:style/Theme.NoTitleBar.Fullscreen"? 不顯示應(yīng)用程序標(biāo)題欄,并全屏
?android:theme="Theme.Light"? 背景為白色
?android:theme="Theme.Light.NoTitleBar"? 白色背景并無標(biāo)題欄
?android:theme="Theme.Light.NoTitleBar.Fullscreen"? 白色背景柜蜈,無標(biāo)題欄仗谆,全屏
?android:theme="Theme.Black"? 背景黑色
?android:theme="Theme.Black.NoTitleBar"? 黑色背景并無標(biāo)題欄
?android:theme="Theme.Black.NoTitleBar.Fullscreen"??? 黑色背景,無標(biāo)題欄淑履,全屏
?android:theme="Theme.Wallpaper"? 用系統(tǒng)桌面為應(yīng)用程序背景
?android:theme="Theme.Wallpaper.NoTitleBar"? 用系統(tǒng)桌面為應(yīng)用程序背景隶垮,且無標(biāo)題欄
?android:theme="Theme.Wallpaper.NoTitleBar.Fullscreen"? 用系統(tǒng)桌面為應(yīng)用程序背景,無標(biāo)題欄秘噪,全屏
?android:theme="Translucent"
?android:theme="Theme.Translucent.NoTitleBar"
?android:theme="Theme.Translucent.NoTitleBar.Fullscreen"
?android:theme="Theme.Panel"
?android:theme="Theme.Light.Panel"
其實(shí)狸吞,只要在manifest.xml文件中把中設(shè)置為android:theme = "@android:style/Theme.Dialog"即可
31、點(diǎn)擊短信里的鏈接進(jìn)入APP
詳情請(qǐng)看:http://blog.csdn.net/books1958/article/details/49948555
32指煎、POST和GET的區(qū)別
GET在瀏覽器回退時(shí)是無害的捷绒,而POST會(huì)再次提交請(qǐng)求。 GET產(chǎn)生的URL地址可以被Bookmark贯要,而POST不可以暖侨。 GET請(qǐng)求會(huì)被瀏覽器主動(dòng)cache,而POST不會(huì)崇渗,除非手動(dòng)設(shè)置字逗。 GET請(qǐng)求只能進(jìn)行url編碼,而POST支持多種編碼方式宅广。 GET請(qǐng)求參數(shù)會(huì)被完整保留在瀏覽器歷史記錄里葫掉,而POST中的參數(shù)不會(huì)被保留。 GET請(qǐng)求在URL中傳送的參數(shù)是有長度限制的跟狱,而POST么有俭厚。 對(duì)參數(shù)的數(shù)據(jù)類型,GET只接受ASCII字符驶臊,而POST沒有限制挪挤。 GET比POST更不安全,因?yàn)閰?shù)直接暴露在URL上关翎,所以不能用來傳遞敏感信息扛门。 GET參數(shù)通過URL傳遞,POST放在Request body中纵寝。
其實(shí)GET和POST本質(zhì)上就是TCP鏈接论寨,并無差別。但是由于HTTP的規(guī)定和瀏覽器/服務(wù)器的限制,導(dǎo)致他們?cè)趹?yīng)用過程中體現(xiàn)出一些不同葬凳。
GET和POST還有一個(gè)重大區(qū)別绰垂,簡(jiǎn)單的說:GET產(chǎn)生一個(gè)TCP數(shù)據(jù)包;POST產(chǎn)生兩個(gè)TCP數(shù)據(jù)包。
對(duì)于GET方式的請(qǐng)求火焰,瀏覽器會(huì)把http header和data一并發(fā)送出去劲装,服務(wù)器響應(yīng)200(返回?cái)?shù)據(jù));
而對(duì)于POST,瀏覽器先發(fā)送header荐健,服務(wù)器響應(yīng)100 continue,瀏覽器再發(fā)送data琳袄,服務(wù)器響應(yīng)200 ok(返回?cái)?shù)據(jù))江场。
也就是說,GET只需要汽車跑一趟就把貨送到了窖逗,而POST得跑兩趟址否,第一趟,先去和服務(wù)器打個(gè)招呼“嗨碎紊,我等下要送一批貨來佑附,你們打開門迎接我”,然后再回頭把貨送過去仗考。
并不是所有瀏覽器都會(huì)在POST中發(fā)送兩次包音同,F(xiàn)irefox就只發(fā)送一次。
33秃嗜、Android中asserts目錄和raw目錄的區(qū)別
34权均、java的一些基礎(chǔ)面試題
未完待續(xù)~~~~~~