java相關(guān):面試中關(guān)于Java你所需知道的的一切
一:架構(gòu)方面
1媳危、模塊化組件化開發(fā)架構(gòu)
一開始使用比較簡(jiǎn)單的架構(gòu) 禀苦,界面->邏輯層->工具包層既荚,后面改為分業(yè)務(wù)模塊->工具包贴唇,但是業(yè)務(wù)模塊之間存在大量耦合〔笮澹現(xiàn)在將業(yè)務(wù)模塊再具體劃分飞袋,比如購物流程模塊,地址選擇管理模塊豌熄,消息模塊授嘀。自己寫的router,沒有用注解锣险,沒有依賴注入蹄皱,寫了大量的映射和接口注冊(cè)。借鑒阿里的Arouter[Alibaba-ARouter] 新版本解讀與控制反轉(zhuǎn)在移動(dòng)端的應(yīng)用
Arouter:自定義注解
采用arr方式解決重復(fù)依賴
采用新的網(wǎng)絡(luò)請(qǐng)求框架Retrofit+OkHttp芯肤,新的圖片及下載框架,okhttp巷折,規(guī)范了接口定義以及數(shù)據(jù)加密等。
當(dāng)然崖咨,我們還做了很多的新的嘗試锻拘,RecycleView替換了ListView,狀態(tài)欄Immersive Mode設(shè)計(jì)击蹲,組件化開發(fā)的嘗試署拟,App功能動(dòng)態(tài)化配置,通用自定義控件設(shè)計(jì)以及國際化設(shè)配等歌豺。
ARouter的優(yōu)勢(shì):
編譯器處理注解產(chǎn)生映射文件推穷,運(yùn)行期加載映射文件實(shí)現(xiàn)路由
Bootstrapping、Extensibility以及Simple & Enough
編譯期間:頁面自動(dòng)注冊(cè)—注解&注解處理器
運(yùn)行期間:動(dòng)態(tài)加載—–分組管理类咧,按需加載
全局?jǐn)r截器
依賴注入
運(yùn)行期動(dòng)態(tài)修改路由
降級(jí)問題
2馒铃、hybrid架構(gòu)
① NativeUI組件,header組件痕惋、消息類組件
② 通訊錄区宇、系統(tǒng)、設(shè)備信息讀取接口
③ H5與Native的互相跳轉(zhuǎn)值戳,比如H5如何跳到一個(gè)Native頁面议谷,H5如何新開Webview做動(dòng)畫跳到另一個(gè)H5頁面
4、數(shù)據(jù)請(qǐng)求堕虹,數(shù)據(jù)操作的接口柿隙,工具包之類
android中通信方式:
1、傳統(tǒng)的JavascriptInterface鲫凶,setJavaScriptEnabled呀小心xss攻擊禀崖,4.2已修復(fù)
2、JSbridge螟炫,定義一套協(xié)議
3波附、代碼重構(gòu)的經(jīng)驗(yàn)
首先講述自己的工程架構(gòu)演變,由普通依賴到模塊化組件化,路由結(jié)構(gòu)掸屡,通信原理封寞,怎樣解耦。然后問面試官對(duì)中小型公司自己這一套改進(jìn)有沒有什么建議仅财,引用RXjava這類開源框架狈究。提到自己對(duì)知識(shí)的渴望,然而在小公司人員不足和業(yè)務(wù)量不龐大的情況體驗(yàn)不到它的好處盏求,特別想進(jìn)大的平臺(tái)加深自己對(duì)整個(gè)架構(gòu)的優(yōu)點(diǎn)的深入理解抖锥。
4、AOP OOP
面向切面(從左到右的關(guān)系碎罚,將那些與業(yè)務(wù)無關(guān)磅废,卻為業(yè)務(wù)模塊所共同調(diào)用的邏輯或責(zé)任封裝到一個(gè)可重用模塊,并將其名為“Aspect”)荆烈。Android中應(yīng)用:網(wǎng)絡(luò)請(qǐng)求拯勉,圖片操作,數(shù)據(jù)解析憔购,文件操作宫峦,Log,格式轉(zhuǎn)換等共用型Util包玫鸟。
面向?qū)ο螅鹤⒅厣舷聦佣范簦庋b、繼承和多態(tài)性等概念來建立一種對(duì)象層次結(jié)構(gòu)鞋邑,允許你定義從上到下的關(guān)系,但并不適合定義從左到右的關(guān)系
二:性能優(yōu)化和內(nèi)存優(yōu)化具體經(jīng)驗(yàn)
Runtime.getRuntime().maxMemory()最大可分配內(nèi)存
Runtime.getRuntime().freeMemory()當(dāng)前空閑內(nèi)存
Runtime.getRuntime().totalMemory()當(dāng)前占用內(nèi)存
內(nèi)存檢測(cè)工具M(jìn)emoMonitor账蓉,android device monitor
優(yōu)化:
數(shù)據(jù)結(jié)構(gòu)的優(yōu)化(1枚碗、StringBuilder拼接;2铸本、SparseArray(2個(gè)數(shù)組肮雨,int型的Key數(shù)組,value數(shù)組)、ArrayMap(hash值的Key數(shù)組箱玷,keyvalue成對(duì)的數(shù)組)(添加怨规、刪除、查找數(shù)據(jù)的時(shí)候都是先使用二分查找法得到相應(yīng)的index)代替HashMap锡足,HashMap初始就會(huì)創(chuàng)建容量為16的數(shù)組波丰,而且每次都是以2倍的容量遞增,SparseArray舶得、ArrayMap掰烟;3、內(nèi)存抖動(dòng);4纫骑、使用parcelable代替serializebal,serializebal會(huì)產(chǎn)生大量臨時(shí)變量引起GC)
對(duì)象復(fù)用:列表布局里單Item的復(fù)用蝎亚,避免在ondraw里進(jìn)行對(duì)象的創(chuàng)建
避免內(nèi)存泄露:內(nèi)存泄漏會(huì)導(dǎo)致heap可用內(nèi)存越來越少,這時(shí)當(dāng)有一個(gè)稍大的內(nèi)存占用先馆,很可能會(huì)造成OOM发框,還有一點(diǎn)它會(huì)讓GC頻繁的觸發(fā)造成內(nèi)存抖動(dòng)。造成內(nèi)存泄漏的一些點(diǎn):?jiǎn)卫褂昧薱ontext(使用applicationcontext)煤墙,匿名內(nèi)部類梅惯,handler,static變量,資源未關(guān)閉(io流番捂,cursor使用了一定要及時(shí)關(guān)閉)个唧,asyntask,耗時(shí)操作可以考慮使用service
OOM優(yōu)化:大部分是圖片造成的设预。使用軟引用弱引用徙歼;臨死bitmap的及時(shí)回收;某些大內(nèi)存分配時(shí)可以使用try/catch鳖枕,即使失敗了也不會(huì)崩潰魄梯;加載bitmap時(shí)注意(縮放比例、解碼格式ARGB_4444宾符、局部加載)酿秸,LUR cache
三:用到的開源框架原理
okhttp原理:
首先使用建造者模式構(gòu)建request,然后經(jīng)過一系列攔截器(包括跟服務(wù)器橋接的響應(yīng)BridgeInterapter,CacheInterapter,ConnectInterapter,Callserver),攔截器連成了一條鏈InterappetChain.底層用了okio連接魏烫,socket辣苏。異步請(qǐng)求做了一個(gè)線程池的封裝。
多路復(fù)用機(jī)制(nextconnection從connection池里獲取到的話哄褒,就復(fù)用稀蟋,獲取不到才create),重連機(jī)制(判斷是否能onresponce呐赡,獲取不到則recovery,循環(huán))
支持HTTP2/SPDY黑科技
socket自動(dòng)選擇最好路線退客,并支持自動(dòng)重連
擁有自動(dòng)維護(hù)的socket連接池,減少握手次數(shù)
擁有隊(duì)列線程池链嘀,輕松寫并發(fā)
擁有Interceptors輕松處理請(qǐng)求與響應(yīng)(比如透明GZIP壓縮,LOGGING)
實(shí)現(xiàn)基于Headers的緩存策略
volley原理萌狂,
glide原理
glide .with(context):所有request請(qǐng)求是通過requestmanagerrechiver這個(gè)類把requestmanager綁定到activity或fragment類。創(chuàng)建了一個(gè)fragment把requestmanager傳給fragmengt怀泊,與activity生命周期綁定
.load(url) : 創(chuàng)建DrawableTypeRequest茫藏,添加一系列條件初始化
.into里面將imageview與lifecycle生命周期關(guān)聯(lián)了起來,里面的核心是一個(gè)引擎類Engine,里面有個(gè)Load霹琼,先從緩存中讀取刷允,Engine中包含LruCache緩存及一個(gè)當(dāng)前正在使用的active資源Cache(弱引用)冤留,Cache優(yōu)先級(jí)LruCache>activeCache,從LruCache取出使用了則會(huì)放到activeCache树灶,緩存沒有則通過線程池去獲取圖片纤怒,Engine在初始化時(shí)要傳入兩個(gè)ExecutorService,即會(huì)有兩個(gè)線程池天通,一個(gè)用來從DiskCache獲取resource泊窘,另一個(gè)用來從Source中獲取(通常是下載)像寒。先進(jìn)入DiskCacheService中執(zhí)行獲取烘豹,如果沒找到則進(jìn)入SourceState,進(jìn)到SourceService中執(zhí)行下載诺祸。
Glide的Target:
負(fù)責(zé)圖片加載的回調(diào)中
4.4以前是Bitmap復(fù)用必須長寬相等才可以復(fù)用
4.4及以后是Size>=所需就可以復(fù)用携悯,只不過需要調(diào)用reconfigure來調(diào)整尺寸
Glide用AttributeStategy和SizeStrategy來實(shí)現(xiàn)兩種策略
圖片池在收到傳來的Bitmap之后,通過長寬或者Size來從KeyPool中獲取Key(對(duì)象復(fù)用到了極致筷笨,連Key都用到了Pool)憔鬼,然后再每個(gè)Key對(duì)應(yīng)一個(gè)雙向鏈表結(jié)構(gòu)來存儲(chǔ)。每個(gè)Key下可能有很多個(gè)待用Bitmap
取出后要減少圖片池中記錄的當(dāng)前Size等胃夏,并對(duì)Bitmap進(jìn)行eraseColor(Color.TRANSPAENT)操作確敝峄颍可用
butterknife原理
四:Framework層常用模塊原理
AMS和WMS原理
audioflinger原理,
整個(gè)音頻系統(tǒng)的核心與難點(diǎn)仰禀,啟到承上(為上層提供訪問接口)啟下(通過HAL來管理音頻設(shè)備)的作用照雁。
audiotrack原理,
播放聲音答恶,2種模式饺蚊,AudioTrack中有MODE_STATIC和MODE_STREAM兩種分類。STREAM的意思是由用戶在應(yīng)用程序通過write方式把數(shù)據(jù)一次一次得寫到audiotrack中悬嗓。這個(gè)和我們?cè)趕ocket中發(fā)送數(shù)據(jù)一樣污呼,應(yīng)用層從某個(gè)地方獲取數(shù)據(jù),例如通過編解碼得到PCM數(shù)據(jù)烫扼,然后write到audiotrack。
這種方式的壞處就是總是在JAVA層和Native層交互碍庵,效率損失較大映企。
而STATIC的意思是一開始創(chuàng)建的時(shí)候,就把音頻數(shù)據(jù)放到一個(gè)固定的buffer静浴,然后直接傳給audiotrack堰氓,后續(xù)就不用一次次得write了。AudioTrack會(huì)自己播放這個(gè)buffer中的數(shù)據(jù)苹享。
這種方法對(duì)于鈴聲等內(nèi)存占用較小双絮,延時(shí)要求較高的聲音來說很適用浴麻。
vold框架原理,
1,有一個(gè)netlinkmanager接收來自Linux內(nèi)核的uevent消息囤攀,例如sd卡的插拔會(huì)引起kernel向NM發(fā)送uevent消息,
2软免,netlinkmanager將這些消息轉(zhuǎn)發(fā)給volumeManager,volumeManager做一些操作后將消息通過CommandListener發(fā)送給MountService.MountService收到消息后做進(jìn)一步處理。比如volumeManager----disk insert-----MountService----Mount----Vold,表示掛載這個(gè)SD卡
4焚挠,CommandListener內(nèi)部封裝了一個(gè)socket用于跨進(jìn)程通信膏萧,在vold進(jìn)程中屬于服務(wù)端,接收來自mountservice的控制命令蝌衔,同時(shí)volumeManager和netlinkmanager又通過它發(fā)送消息給MountService
dhcp協(xié)議
binder原理:
傳統(tǒng)·IPC·:需要做兩次拷貝:用戶空間->內(nèi)核空間->用戶空間
binder:由Binder驅(qū)動(dòng)負(fù)責(zé)管理數(shù)據(jù)接收緩存,驅(qū)動(dòng)會(huì)根據(jù)發(fā)送數(shù)據(jù)包的大小榛泛,使用最佳匹配算法從緩存池中找到一塊大小合適的空間,將數(shù)據(jù)從發(fā)送緩存區(qū)復(fù)制過來,mmap()分配的內(nèi)存是映射在接收方用戶空間里的.為了實(shí)現(xiàn)用戶空間到用戶空間的拷貝噩斟,mmap()分配的內(nèi)存除了映射進(jìn)了接收方進(jìn)程里曹锨,還映射進(jìn)了內(nèi)核空間。所以調(diào)用copy_from_user()將數(shù)據(jù)拷貝進(jìn)內(nèi)核空間也相當(dāng)于拷貝進(jìn)了接收方的用戶空間剃允,這就是Binder只需一次拷貝的‘秘密’沛简。
五:android重要知識(shí)點(diǎn)
Android開發(fā)--如何減小Apk文件的大小
靜態(tài)編譯和動(dòng)態(tài)編譯
靜態(tài) include $(BUILD_STATIC_JAVA_LIBRARY)
動(dòng)態(tài) include $(BUILD_JAVA_LIBRARY)
a、可以在apk的Android.mk中去添加動(dòng)態(tài)jar包的依賴硅急,使用的時(shí)候jar包的類可以直接調(diào)用
b覆享、apk編譯的時(shí)候如果不在android.mk中做動(dòng)態(tài)jar包的依賴的話,可以在使用的時(shí)候去動(dòng)態(tài)尋找system/framework/SkyFramework的jar包营袜,去load此jar包撒顿,在去找jar包中的 ? class;這種方法?apk中可以直接調(diào)用接口中自己定義的方法荚板,編譯時(shí)不需要去做android.mk的依賴凤壁。 實(shí)現(xiàn)的地方直接繼承接口即可,打包到動(dòng)態(tài)jar包中跪另。
這樣可以實(shí)現(xiàn)分離拧抖,接口的定義和實(shí)現(xiàn)做到分離,在開發(fā)階段非常有用免绿,不同部門直接可以并行進(jìn)行唧席。
網(wǎng)絡(luò)編程,服務(wù)器端編程
安卓中Fragment應(yīng)用嘲驾,相比Activity的好處
Fragment可以使你能夠?qū)ctivity分離成多個(gè)可重用的組件淌哟,每個(gè)都有它自己的生命周期和UI。
Fragment可以輕松得創(chuàng)建動(dòng)態(tài)靈活的UI設(shè)計(jì)辽故,可以適應(yīng)于不同的屏幕尺寸徒仓。從手機(jī)到平板電腦。
Fragment是一個(gè)獨(dú)立的模塊,緊緊地與activity綁定在一起誊垢〉舫冢可以運(yùn)行中動(dòng)態(tài)地移除症见、加入、交換等殃饿。
Fragment提供一個(gè)新的方式讓你在不同的安卓設(shè)備上統(tǒng)一你的UI谋作。
Fragment 解決Activity間的切換不流暢,輕量切換壁晒。
Fragment 替代TabActivity做導(dǎo)航瓷们,性能更好。
Fragment 在4.2.版本中新增嵌套fragment使用方法秒咐,能夠生成更好的界面效果谬晕。
Fragment做局部?jī)?nèi)容更新更方便,原來為了到達(dá)這一點(diǎn)要把多個(gè)布局放到一個(gè)activity里面携取,現(xiàn)在可以用多Fragment來代替攒钳,只有在需要的時(shí)候才加載Fragment,提高性能雷滋。
可以從startActivityForResult中接收到返回結(jié)果,但是View不能不撑。
recyclerview的復(fù)用原理
熱修復(fù)原理
android7.0原理--簽名機(jī)制:
android 7.0中引入了APK Signature Scheme V2(Full APK Signature),而V1(jar Signature) 來自JDK晤斩;
V1:僅驗(yàn)證未解壓的文件內(nèi)容焕檬,這樣APK 簽署后可進(jìn)行許多修改 ,可以移動(dòng)甚至重新壓縮文件澳泵;
V2:驗(yàn)證壓縮文件的所有字節(jié)实愚,而不是單個(gè) ZIP 條目,因此兔辅,在簽名后無法再更改(包括 zipalign)腊敲。正因如此,現(xiàn)在在編譯過程中维苔,我們將壓縮碰辅、調(diào)整和簽署合并成一步完成。好處顯而易見介时,更安全而且新的簽名可縮短在設(shè)備上進(jìn)行驗(yàn)證的時(shí)間(不需要費(fèi)時(shí)地解壓縮然后驗(yàn)證)没宾,從而加快應(yīng)用安裝速度。如有任何自定義任務(wù)篡改 APK 文件或?qū)ζ溥M(jìn)行后處理(無論以任何方式)沸柔,那么V2 簽名會(huì)有作廢的風(fēng)險(xiǎn)循衰,從而導(dǎo)致您的 APK 與 Android 7.0 及更高版本不兼容。
六:android重要知識(shí)點(diǎn)
java類加載機(jī)制
類加載的過程包括了加載(查找并加載類的二進(jìn)制數(shù)據(jù))勉失、驗(yàn)證(確保被加載的類的正確性:確保Class文件的字節(jié)流中包含的信息符合當(dāng)前虛擬機(jī)的要求羹蚣,并且不會(huì)危害虛擬機(jī)自身的安全)原探、準(zhǔn)備(為類的靜態(tài)變量分配內(nèi)存乱凿,并將其初始化為默認(rèn)值,public static int value = 3,這是設(shè)為0)、解析(把類中的符號(hào)引用轉(zhuǎn)換為直接引用)、初始化(類的靜態(tài)變量賦予正確的初始值砂缩,JVM負(fù)責(zé)對(duì)類進(jìn)行初始化沟启,主要對(duì)類變量進(jìn)行初始化)五個(gè)階段。
解析階段則不一定段审,它在某些情況下可以在初始化階段之后開始全蝶,這是為了支持Java語言的運(yùn)行時(shí)綁定(也成為動(dòng)態(tài)綁定或晚期綁定)
類加載器:雙親委派模型,如果存在父類加載器寺枉,就委派給父類加載器加載抑淫,如果不存在父類加載器,就檢查是否是由啟動(dòng)類加載器加載的類姥闪,通過調(diào)用本地方法始苇,如果父類加載器和啟動(dòng)類加載器都不能完成加載任務(wù),才調(diào)用自身的加載功能筐喳。
意義:系統(tǒng)類防止內(nèi)存中出現(xiàn)多份同樣的字節(jié)碼催式,-保證Java程序安全穩(wěn)定運(yùn)行
java編譯過程
分析和輸入到符號(hào)表
注解處理
語義分析和生成class字節(jié)碼文件
GC
final用法,反射原理
反射:先講反射機(jī)制避归,反射就是程序運(yùn)行期間JVM會(huì)對(duì)任意一個(gè)類洞悉它的屬性和方法荣月,對(duì)任意一個(gè)對(duì)象都能夠訪問它的屬性和方法。依靠此機(jī)制梳毙,可以動(dòng)態(tài)的創(chuàng)建一個(gè)類的對(duì)象和調(diào)用對(duì)象的方法哺窄。
其次就是反射相關(guān)的API,只講一些常用的顿天,比如獲取一個(gè)Class對(duì)象堂氯。Class.forName(完整類名)。通過Class對(duì)象獲取類的構(gòu)造方法牌废,class.getConstructor咽白。根據(jù)class對(duì)象獲取類的方法,getMethod和getMethods鸟缕。使用class對(duì)象創(chuàng)建一個(gè)對(duì)象晶框,class.newInstance等。
最后可以說一下反射的優(yōu)點(diǎn)和缺點(diǎn)懂从,優(yōu)點(diǎn)就是增加靈活性授段,可以在運(yùn)行時(shí)動(dòng)態(tài)獲取對(duì)象實(shí)例。缺點(diǎn)是反射的效率很低番甩,而且會(huì)破壞封裝侵贵,通過反射可以訪問類的私有方法,不安全缘薛。
注解原理
io,nio區(qū)別和原理窍育,NIO中select的實(shí)現(xiàn)機(jī)制
Java IO是面向流的卡睦,這意味著我們需要每次從流中讀取一個(gè)或多個(gè)字節(jié),直到讀取完所有字節(jié)漱抓;NIO是面向緩沖的表锻,也就是說會(huì)把數(shù)據(jù)讀取到一個(gè)緩沖區(qū)中,然后對(duì)緩沖區(qū)中的數(shù)據(jù)進(jìn)行相應(yīng)處理乞娄。
Java IO是阻塞IO瞬逊,而NIO是非阻塞IO。
Java NIO中存在一個(gè)稱為選擇器(selector)的東西仪或,它允許你把多個(gè)通道(channel)注冊(cè)到一個(gè)選擇器上确镊,然后使用一個(gè)線程來監(jiān)視這些通道:若這些通道里有某個(gè)準(zhǔn)備好可以開始進(jìn)行讀或?qū)懖僮髁耍瑒t開始對(duì)相應(yīng)的通道進(jìn)行讀寫范删。而在等待某通道變?yōu)榭勺x/寫期間骚腥,請(qǐng)求對(duì)通道進(jìn)行讀寫操作的線程可以去干別的事情。
多線程同步的幾個(gè)方式及區(qū)別
1瓶逃、synchronized (托管給JVM執(zhí)行的),2束铭、重入鎖(retrandlock,讀寫ReentrantReadWriteLock)3、volatile關(guān)鍵字厢绝,阻塞隊(duì)列(linkedblockingqueen)契沫,是java代碼自己實(shí)現(xiàn)的,4、局部變量(ThreadLocal昔汉,提到Looper.prepare)5懈万、使用同步容器(vector,hashtable,ConcurrentHashMap)靶病,6会通、CountDownLatch
樂觀鎖和悲觀鎖的區(qū)別
悲觀鎖,就是很悲觀娄周,每次去拿數(shù)據(jù)的時(shí)候都認(rèn)為別人會(huì)修改涕侈,所以每次在拿數(shù)據(jù)的時(shí)候都會(huì)上鎖,這樣別人想拿這個(gè)數(shù)據(jù)就會(huì)block直到它拿到鎖煤辨。傳統(tǒng)的關(guān)系型數(shù)據(jù)庫里邊就用到了很多這種鎖機(jī)制裳涛,比如行鎖,表鎖等众辨,讀鎖端三,寫鎖等,都是在做操作之前先上鎖鹃彻。
樂觀鎖郊闯,就是很樂觀,每次去拿數(shù)據(jù)的時(shí)候都認(rèn)為別人不會(huì)修改,所以不會(huì)上鎖团赁,但是在更新的時(shí)候會(huì)判斷一下在此期間別人有沒有去更新這個(gè)數(shù)據(jù)旋奢,可以使用版本號(hào)等機(jī)制。樂觀鎖適用于多讀的應(yīng)用類型然痊,這樣可以提高吞吐量,像數(shù)據(jù)庫如果提供類似于write_condition機(jī)制的其實(shí)都是提供的樂觀鎖屉符。
synchronized是基于悲觀鎖剧浸,比較適用于大量線程頻繁請(qǐng)求,lock是樂觀鎖矗钟,適用于不是很頻繁的
ReentrantLock非中斷鎖(一直等待)和中斷鎖(lock.lockInterruptibly())唆香,得到中斷響應(yīng)則中斷,還提供公平鎖及非公平鎖吨艇。
stringbuffer和stringbuilder區(qū)別
stringbuffer是線程安全躬它,適合多線程操作字符串,stringbuilder是非線程安全的东涡,適合單線程大量操作字符串冯吓,在單線程中的性能比StringBuffer高
Java重寫hashCode(),equals()函數(shù)的時(shí)機(jī)
雖然 a 與 b不是同一個(gè)對(duì)象疮跑,但是你希望無論使用 a 還是 b 都可以從map中取出相同的 value组贺,也就是你會(huì)認(rèn)為 a 與 b 的內(nèi)容是相同的,就是當(dāng)把他們作為索引值祖娘,或者在 set 中不會(huì)重復(fù)出現(xiàn)失尖,這些情況適用于重寫他們。重寫equals一定要重寫Hashcode渐苏,這是java規(guī)定的掀潮。如果不滿足這個(gè)條件則map, set等的處理會(huì)出現(xiàn)錯(cuò)誤的。
get()和post()區(qū)別
語義的區(qū)別琼富,設(shè)計(jì)不同仪吧,get是為請(qǐng)求,post是提交改變服務(wù)器狀態(tài)
1. GET使用URL或Cookie傳參鞠眉。而POST將數(shù)據(jù)放在BODY中邑商。
2. GET的URL會(huì)有長度上的限制,則POST的數(shù)據(jù)則可以非常大凡蚜。
3. POST比GET安全人断,因?yàn)閿?shù)據(jù)在地址欄上不可見。
成員變量的類型
靜態(tài)變量朝蜘,實(shí)例變量恶迈,final修飾的常量
七:數(shù)據(jù)結(jié)構(gòu)算法相關(guān)
如何判斷一個(gè)鏈表中存在環(huán)
1遍歷做標(biāo)記,2:便利把指針反轉(zhuǎn),如果走到開始就有環(huán),3:雙指針 一個(gè)一次走一步,一個(gè)一次走兩步
各排序暇仲、冒泡排序步做、二分查找思想原理
二叉樹
問1000壇酒,里面有1壇毒酒奈附,需要多少只老鼠才能判斷出毒酒是哪壇全度?
都轉(zhuǎn)為二進(jìn)制 2的10次方為1024,10只老鼠
Linux中查看內(nèi)存使用狀況命令斥滤?查看網(wǎng)絡(luò)狀況将鸵?
cat/proc/meminfo? free