最新整理的面試題
點我
需要繼續(xù)學(xué)習(xí)的
- Android中為啥會65535的限制,解釋下原因.
http://blog.csdn.net/u011733020/article/details/71481395 - 解釋下Android Lint的工作機(jī)制原理
- PathClassloader和DexClassloader的區(qū)別
- 算法實現(xiàn)下如果統(tǒng)計出Activity中的view樹的深度.
- okHttp的工作原理以及緩存機(jī)制
- blockingqueue的實現(xiàn)原理,里面有幾把鎖.
Android面試題
- JVM垃圾回收機(jī)制。
http://blog.csdn.net/xiajian2010/article/details/17376453
http://m.itdecent.cn/p/8fa373ceb552?hmsr=toutiao.io&utm_medium=toutiao.io&utm_source=toutiao.io
http://www.blogjava.net/fancydeepin/archive/2013/09/29/jvm_heep.html
Android 中的Dalvik和ART是什么,有啥區(qū)別?
http://m.itdecent.cn/p/58f817d176b7
Dalvik VM 和JVM的區(qū)別
https://www.zhihu.com/question/20207106
2 Activity的啟動模式
http://droidyue.com/blog/2015/08/16/dive-into-android-activity-launchmode/index.html http://blog.csdn.net/zhangjg_blog/article/details/10923643
3 service和線程的關(guān)系 怎么讓一個service不死掉,一直運(yùn)行,service生命周期 service和Intentservice的區(qū)別
http://blog.csdn.net/guolin_blog/article/details/11952435
Service兩種啟動方式的區(qū)別
http://m.itdecent.cn/p/2fb6eb14fdec
IntentService有以下特點:
(1) 它創(chuàng)建了一個獨立的工作線程來處理所有的通過onStartCommand()傳遞給服務(wù)的intents。
(2) 創(chuàng)建了一個工作隊列,來逐個發(fā)送intent給onHandleIntent()。
(3) 不需要主動調(diào)用stopSelft()來結(jié)束服務(wù)。因為,在所有的intent被處理完后,系統(tǒng)會自動關(guān)閉服務(wù)。
(4) 默認(rèn)實現(xiàn)的onBind()返回null
(5) 默認(rèn)實現(xiàn)的onStartCommand()的目的是將intent插入到工作隊列中
4 Activity生命周期
http://peiquan.blog.51cto.com/7518552/1277373
http://blog.csdn.net/johnsonblog/article/details/7838108
5 handler AsyncTask可能導(dǎo)致內(nèi)存泄漏 context可能導(dǎo)致的內(nèi)存泄露
http://droidyue.com/blog/2015/04/12/avoid-memory-leaks-on-context-in-android/index.html
http://droidyue.com/blog/2014/11/08/bad-smell-of-asynctask-in-android/
http://gold.xitu.io/entry/56d64b9e816dfa005943a55c
6 自定義view
http://blog.csdn.net/guolin_blog/article/details/12921889
自定義view四個構(gòu)造函數(shù)詳解
http://blog.csdn.net/zhao123h/article/details/52210732
7 設(shè)計模式
8 工作中遇到一次最大困難時什么 你最后是怎么解決的 如果讓你再來一次你是否能夠解決的更好
9 listview里面的item怎么優(yōu)化,如果item的layout不同你要怎么優(yōu)化 listview 多type 復(fù)用 convertview 的解決方法
http://www.eoeandroid.com/thread-246995-1-1.html?_dsign=8fb6add2
10 職業(yè)規(guī)劃
11 JAVA 中堆和棧的區(qū)別
http://droidyue.com/blog/2014/12/07/differences-between-stack-and-heap-in-java/index.html
12 HandlerThread
http://blog.csdn.net/feiduclear_up/article/details/46840523
13 緩存Cache
http://blog.csdn.net/g uolin_blog/article/details/28863651
14 Touch事件傳遞機(jī)制
http://www.open-open.com/lib/view/open1422428386548.html
15 解決屏幕適配
http://blog.csdn.net/lmj623565791/article/details/49990941
16 handler Asynctask內(nèi)部原理分析
http://blog.csdn.net/lmj623565791/article/details/38377229
http://blog.csdn.net/lmj623565791/article/details/38614699
17 動畫
http://blog.csdn.net/guolin_blog/article/details/43536355
18.recyclerView 和 listview 的區(qū)別
RecyclerView的ViewHolder規(guī)范化
RecyclerView可以實現(xiàn)線性布局效果,網(wǎng)格布局效果,瀑布流布局效果
ListView具有setEmptyView() addHeaderView() addFooterView()
RecyclerView支持局部刷新
RecyclerView輕松實現(xiàn)item動畫效果
RecyclerView沒有setOnItemClickListener() setOnItemLongClickListener() 而是實現(xiàn)了RecyclerView.OnItemTouchListener()
RecyclerView自定義分割線
19.View的繪制流程
從ViewRoot的performTraversals()方法開始依次調(diào)用perfromMeasure、performLayout和performDraw這三個方法。這三個方法分別完成頂級View的measure、layout和draw三大流程,其中perfromMeasure會調(diào)用measure,measure又會調(diào)用onMeasure,在onMeasure方法中則會對所有子元素進(jìn)行measure,這個時候measure流程就從父容器傳遞到子元素中了,這樣就完成了一次measure過程,接著子元素會重復(fù)父容器的measure,如此反復(fù)就完成了整個View樹的遍歷.
同理,performLayout和performDraw也分別完成perfromMeasure類似的流程。通過這三大流程,分別遍歷整棵View樹,就實現(xiàn)了Measure,Layout,Draw這一過程,View就繪制出來了。
HTTP和HTTPS的區(qū)別:
1、HTTP協(xié)議使用默認(rèn)80端口,HTTPS協(xié)議使用443端口
2、HTTPS協(xié)議需要到CA申請證書,一般免費(fèi)的證書較少,需要交費(fèi)
3、HTTP信息是明文傳輸,HTTPS使用具有安全性的SSL加密傳輸信息
http1和http2的區(qū)別:
1.http2可以同時發(fā)多個請求
2.http2會壓縮,體積小
3.http2服務(wù)器會推送
AsyncTask
1、設(shè)置當(dāng)前AsyncTask的狀態(tài)為RUNNING,上面的switch也可以看出,每個異步任務(wù)在完成前只能執(zhí)行一次。
2、執(zhí)行了onPreExecute(),當(dāng)前依然在UI線程,所以我們可以在其中做一些準(zhǔn)備工作。
3、將我們傳入的參數(shù)賦值給了mWorker.mParams ,mWorker為一個Callable的子類,且在內(nèi)部的call()方法中,調(diào)用了doInBackground(mParams),然后得到的返回值作為postResult的參數(shù)進(jìn)行執(zhí)行;postResult中通過sHandler發(fā)送消息,最終sHandler的handleMessage中完成onPostExecute的調(diào)用。
4、exec.execute(mFuture),mFuture為真正的執(zhí)行任務(wù)的單元,將mWorker進(jìn)行封裝,然后由sDefaultExecutor交給線程池進(jìn)行執(zhí)行。
如果現(xiàn)在大家去面試,被問到AsyncTask的缺陷,可以分為兩個部分說,在3.0以前,最大支持128個線程的并發(fā),10個任務(wù)的等待。在3.0以后,無論有多少任務(wù),都會在其內(nèi)部單線程執(zhí)行;
Handler源碼分析總結(jié)
1、首先Looper.prepare()在本線程中保存一個Looper實例,然后該實例中保存一個MessageQueue對象;因為Looper.prepare()在一個線程中只能調(diào)用一次,所以MessageQueue在一個線程中只會存在一個。
2、Looper.loop()會讓當(dāng)前線程進(jìn)入一個無限循環(huán),不端從MessageQueue的實例中讀取消息,然后回msg.target.dispatchMessage(msg)方法。
3、Handler的構(gòu)造方法,會首先得到當(dāng)前線程中保存的Looper實例,進(jìn)而與Looper實例中的MessageQueue想關(guān)聯(lián)。
4、Handler的sendMessage方法,會給msg的target賦值為handler自身,然后加入MessageQueue中。
5、在構(gòu)造Handler實例時,我們會重寫handleMessage方法,也就是msg.target.dispatchMessage(msg)最終調(diào)用的方法。
好了,總結(jié)完成,大家可能還會問,那么在Activity中,我們并沒有顯示的調(diào)用Looper.prepare()和Looper.loop()方法,為啥Handler可以成功創(chuàng)建呢,這是因為在Activity的啟動代碼中,已經(jīng)在當(dāng)前UI線程調(diào)用了Looper.prepare()和Looper.loop()方法。
webView
Android webView與js的交互
http://droidyue.com/blog/2014/09/20/interaction-between-java-and-javascript-in-android/index.html
Android性能優(yōu)化
布局優(yōu)化、繪制優(yōu)化、內(nèi)存泄露優(yōu)化、響應(yīng)速度優(yōu)化、ListView優(yōu)化、線程優(yōu)化以及一些性能優(yōu)化的建議。
布局優(yōu)化:盡量減少布局文件的層級,刪除布局中無用的控件和層級。<merge> <incude> <ViewStub>提供按需加載的功能
繪制優(yōu)化:onDraw()方法中不要創(chuàng)建新的局部對象,不要做耗時的任務(wù) GPU過度繪制 HierarchyView來檢測 開發(fā)者選項 顯示開發(fā)者過度繪制選項
內(nèi)存泄露優(yōu)化:context、handler、bitmap、單例模式、內(nèi)部類、靜態(tài)變量、資源對象沒有關(guān)閉
響應(yīng)速度優(yōu)化和ANR日志分析:避免在主線程中做耗時操作,系統(tǒng)會在/data/anr目錄下創(chuàng)建一個文件traces.txt
避免創(chuàng)建過多的對象
不要過多使用枚舉,枚舉占用的內(nèi)存空間要比整型大
常量請使用static final 來修飾
使用一些Android特有的數(shù)據(jù)結(jié)構(gòu),比如SparseArray和Pair等,他們都具有更好的性能
適當(dāng)使用軟引用和弱引用
采用內(nèi)存緩存和磁盤緩存
盡量采用靜態(tài)內(nèi)部類,這樣可以避免潛在的由于內(nèi)部類而導(dǎo)致的內(nèi)存泄露
http://m.itdecent.cn/p/be05874965d4
簡單參考:主要是怎么來通過tools來進(jìn)行性能優(yōu)化
http://blog.csdn.net/yanbober/article/details/48394201
ViewStub 和 merge 的區(qū)別
在動態(tài)加載布局時,使用 ViewStub 的性能要比使用設(shè)置 View 的可見性高。因為雖然把 View 的初始可見 View.GONE,使其不可見,但是在 Inflate 布局的時候 View 仍然會被 Inflate,也就是說仍然會創(chuàng)建對象,會被實例化,會被設(shè)置屬性。也就是說,會耗費(fèi)內(nèi)存等資源。
內(nèi)存泄露檢測框架-leakcanary原理分析
https://juejin.im/entry/5928f6360ce463006b120c3c
自定義BaseAdapter
http://blog.csdn.net/lmj623565791/article/details/38902805
RelativeLayout和LinearLayout性能分析
http://m.itdecent.cn/p/8a7d059da746
1.RelativeLayout會讓子View調(diào)用2次onMeasure,LinearLayout 在有weight時,也會調(diào)用子View2次onMeasure
2.RelativeLayout的子View如果高度和RelativeLayout不同,則會引發(fā)效率問題,當(dāng)子View很復(fù)雜時,這個問題會更加嚴(yán)重。如果可以,盡量使用padding代替margin。
3.在不影響層級深度的情況下,使用LinearLayout和FrameLayout而不是RelativeLayout。
為什么Google給開發(fā)者默認(rèn)新建了個RelativeLayout,而自己卻在DecorView中用了個LinearLayout。因為DecorView的層級深度是已知而且固定的,上面一個標(biāo)題欄,下面一個內(nèi)容欄。采用RelativeLayout并不會降低層級深度,所以此時在根節(jié)點上用LinearLayout是效率最高的。而之所以給開發(fā)者默認(rèn)新建了個RelativeLayout是希望開發(fā)者能采用盡量少的View層級來表達(dá)布局以實現(xiàn)性能最優(yōu),因為復(fù)雜的View嵌套對性能的影響會更大一些。
19.MVP模式講解
http://blog.csdn.net/lmj623565791/article/details/46596109
BaseActivity
友盟統(tǒng)計的一些方法
bindKnife
initView initData
addFragment removeFragment
Toolbar的定制
入場出場動畫
BaseFragment
抽象getlayoutId() initView() initData()
在onAttach()中獲取activity的實例
android onSaveInstanceState方法
http://blog.sina.com.cn/s/blog_618199e60101g1k5.html
hashcode() 和 equals()
http://www.cnblogs.com/skywang12345/p/3324958.html
國內(nèi)一線互聯(lián)網(wǎng)公司內(nèi)部面試題庫
https://github.com/JackyAndroid/AndroidInterview-Q-A/blob/master/README-CN.md#%E6%8E%A5%E5%8F%A3%E7%9A%84%E6%84%8F%E4%B9%89-%E7%99%BE%E5%BA%A6
橫豎屏切換 Activity生命周期的變化
1、不設(shè)置Activity的android:configChanges時,切屏?xí)匦抡{(diào)用各個生命周期,切橫屏?xí)r會執(zhí)行一次,切豎屏?xí)r會執(zhí)行兩次
2、設(shè)置Activity的android:configChanges="orientation"時,切屏還是會重新調(diào)用各個生命周期,切橫、豎屏?xí)r只會執(zhí)行一次
3、設(shè)置Activity的android:configChanges="orientation|keyboardHidden"時,切屏不會重新調(diào)用各個生命周期,只會執(zhí)行onConfigurationChanged方法
Retrofit、Glide、okHttp源碼分析
Retrofit :http://m.itdecent.cn/p/45cb536be2f4
Retrofit.build()
new OkHttpClient()
create callbackExecutor(include main thread handler)
create CallAdapterFactory List
創(chuàng)建默認(rèn)的defaultCallAdapterFactory(callbackExecutor)
create ConverterFactory List
new Retrofit
Retrofit.create() 使用動態(tài)代理
create ServiceMethod使用緩存來獲取ServiceMethod
create CallAdapter ExecutorCallAdapterFactory
create responseConverter
parseMethodAnnotation
new OkHttpCall()
adapter(okHttpCall)
ExecutorCallbackCall(Call<>) callAdapter.adapter(OkHttpCall<>)
ExecutorCallbackCall.equeue(new Callback<>)
okHttpCall.equeue(new Callback){
handler.post(new Runnable(){
callback.onResponse
})
}
requestConvertor
okhttp3.Request = okhttpCall.toRequest()
responseConvertor
Retrofit.Response = okhttpcall.toResponse()
Observable<> callAdapter.adapter(OkHttpCall<>)
Glide :http://blog.csdn.net/guolin_blog/article/details/53759439
線程池 Java內(nèi)存管理 多態(tài)
java內(nèi)存管理 :http://www.cnblogs.com/vamei/archive/2013/04/28/3048353.html
進(jìn)程和線程的關(guān)系
Thread和Runnable的區(qū)別
http://www.cnblogs.com/yangdy/p/5274455.html
線程死鎖
http://blog.csdn.net/abc006250/article/details/8007233
http://blog.csdn.net/ns_code/article/details/17200937
設(shè)計模式
單例
http://blog.csdn.net/jason0539/article/details/23297037
強(qiáng)引用 軟引用 弱引用 虛引用
http://blog.csdn.net/mazhimazh/article/details/19752475
線程安全
HTTP
http://52android.blog.51cto.com/2554429/496621/
http://blog.csdn.net/coder_pig/article/details/46312153
http://www.cnblogs.com/hanyonglu/archive/2012/02/19/2357842.html
HTTP header
http://www.cnblogs.com/nylcy/p/5474613.html
java線程面試題
http://www.cnblogs.com/dolphin0520/p/3958019.html
http://blog.csdn.net/jackfrued/article/details/44921941
圖片處理
http://blog.csdn.net/guolin_blog/article/details/9316683
緩存
http://blog.csdn.net/guolin_blog/article/details/28863651
http://blog.csdn.net/guolin_blog/article/details/9316683
webview
http://m.itdecent.cn/p/3c94ae673e2a
Android多渠道打包
http://tech.meituan.com/android-apk-v2-signature-scheme.html
從頭到尾總結(jié)一下:
1.Touch事件分發(fā)中只有兩個主角:ViewGroup和View。ViewGroup包含onInterceptTouchEvent、dispatchTouchEvent、onTouchEvent三個相關(guān)事件。View包含dispatchTouchEvent、onTouchEvent兩個相關(guān)事件。其中ViewGroup又繼承于View。
2.ViewGroup和View組成了一個樹狀結(jié)構(gòu),根節(jié)點為Activity內(nèi)部包含的一個ViwGroup。
3.觸摸事件由Action_Down、Action_Move、Aciton_UP組成,其中一次完整的觸摸事件中,Down和Up都只有一個,Move有若干個,可以為0個。
4.當(dāng)Acitivty接收到Touch事件時,將遍歷子View進(jìn)行Down事件的分發(fā)。ViewGroup的遍歷可以看成是遞歸的。分發(fā)的目的是為了找到真正要處理本次完整觸摸事件的View,這個View會在onTouchEvent結(jié)果返回true。
5.當(dāng)某個子View返回true時,會中止Down事件的分發(fā),同時在ViewGroup中記錄該子View。接下去的Move和Up事件將由該子View直接進(jìn)行處理。由于子View是保存在ViewGroup中的,多層ViewGroup的節(jié)點結(jié)構(gòu)時,上級ViewGroup保存的會是真實處理事件的View所在的ViewGroup對象:如ViewGroup0-ViewGroup1-TextView的結(jié)構(gòu)中,TextView返回了true,它將被保存在ViewGroup1中,而ViewGroup1也會返回true,被保存在ViewGroup0中。當(dāng)Move和UP事件來時,會先從ViewGroup0傳遞至ViewGroup1,再由ViewGroup1傳遞至TextView。
6.當(dāng)ViewGroup中所有子View都不捕獲Down事件時,將觸發(fā)ViewGroup自身的onTouch事件。觸發(fā)的方式是調(diào)用super.dispatchTouchEvent函數(shù),即父類View的dispatchTouchEvent方法。在所有子View都不處理的情況下,觸發(fā)Acitivity的onTouchEvent方法。
7.onInterceptTouchEvent有兩個作用:1.攔截Down事件的分發(fā)。2.中止Up和Move事件向目標(biāo)View傳遞,使得目標(biāo)View所在的ViewGroup捕獲Up和Move事件。
問:Android中為什么主線程不會因為Looper.loop()里的死循環(huán)卡死?
答:線程是一段可執(zhí)行的代碼,當(dāng)可執(zhí)行代碼執(zhí)行完成后,線程生命周期便終止,線程退出。對于主線程,我們是絕不希望運(yùn)行一段時間后自己就退出,那么如何保證能一直存活呢?簡單做法就是可執(zhí)行代碼是能一直執(zhí)行下去的,死循環(huán)便能保證不會被退出,例如,Binder線程也是采用死循環(huán)的方法,通過循環(huán)方式不斷與Binder驅(qū)動進(jìn)行讀寫操作,當(dāng)然并非簡單地死循環(huán),無消息時會休眠。真正會卡死主線程的操作是在回調(diào)方法中onCreate()、onStart()、onResume等操作時間過長,導(dǎo)致掉幀,甚至發(fā)生ANR,Looper.loop()本身不會導(dǎo)致應(yīng)用卡死。
dispatchTouchEvent源碼分析總結(jié)
觸摸控件(View)首先執(zhí)行dispatchTouchEvent方法。
在dispatchTouchEvent方法中先執(zhí)行onTouch方法,后執(zhí)行onClick方法(onClick方法在onTouchEvent中執(zhí)行,下面會分析)。
如果控件(View)的onTouch返回false或者mOnTouchListener為null(控件沒有設(shè)置setOnTouchListener方法)或者控件不是enable的情況下會調(diào)運(yùn)onTouchEvent,dispatchTouchEvent返回值與onTouchEvent返回一樣。
如果控件不是enable的設(shè)置了onTouch方法也不會執(zhí)行,只能通過重寫控件的onTouchEvent方法處理(上面已經(jīng)處理分析了),dispatchTouchEvent返回值與onTouchEvent返回一樣。
如果控件(View)是enable且onTouch返回true情況下,dispatchTouchEvent直接返回true,不會調(diào)用onTouchEvent方法。
Volley源碼分析總結(jié)
1. 當(dāng)一個RequestQueue被成功申請后會開啟一個CacheDispatcher和4個默認(rèn)的NetworkDispatcher。
2. CacheDispatcher緩存調(diào)度器最為第一層緩沖,開始工作后阻塞的從緩存序列mCacheQueue中取得請求;對于已經(jīng)取消的請求,標(biāo)記為跳過并結(jié)束這個請求;新的或者過期的請求,直接放入mNetworkQueue中由N個NetworkDispatcher進(jìn)行處理;已獲得緩存信息(網(wǎng)絡(luò)應(yīng)答)卻沒有過期的請求,由Request的parseNetworkResponse進(jìn)行解析,從而確定此應(yīng)答是否成功。然后將請求和應(yīng)答交由Delivery分發(fā)者進(jìn)行處理,如果需要更新緩存那么該請求還會被放入mNetworkQueue中。
3. 將請求Request add到RequestQueue后對于不需要緩存的請求(需要額外設(shè)置,默認(rèn)是需要緩存)直接丟入mNetworkQueue交給N個NetworkDispatcher處理;對于需要緩存的,新的請求加到mCacheQueue中給CacheDispatcher處理;需要緩存,但是緩存列表中已經(jīng)存在了相同URL的請求,放在mWaitingQueue中做暫時處理,等待之前請求完畢后,再重新添加到mCacheQueue中。
4. 網(wǎng)絡(luò)請求調(diào)度器NetworkDispatcher作為網(wǎng)絡(luò)請求真實發(fā)生的地方,對消息交給BasicNetwork進(jìn)行處理,同樣的,請求和結(jié)果都交由Delivery分發(fā)者進(jìn)行處理。
5. Delivery分發(fā)者實際上已經(jīng)是對網(wǎng)絡(luò)請求處理的最后一層了,在Delivery對請求處理之前,Request已經(jīng)對網(wǎng)絡(luò)應(yīng)答進(jìn)行過解析,此時應(yīng)答成功與否已經(jīng)設(shè)定;而后Delivery根據(jù)請求所獲得的應(yīng)答情況做不同處理;若應(yīng)答成功,則觸發(fā)deliverResponse方法,最終會觸發(fā)開發(fā)者為Request設(shè)定的Listener;若應(yīng)答失敗,則觸發(fā)deliverError方法,最終會觸發(fā)開發(fā)者為Request設(shè)定的ErrorListener;處理完后,一個Request的生命周期就結(jié)束了,Delivery會調(diào)用Request的finish操作,將其從mRequestQueue中移除,與此同時,如果等待列表中存在相同URL的請求,則會將剩余的層級請求全部丟入mCacheQueue交由CacheDispatcher進(jìn)行處理。
接口抽象類的區(qū)別
接口中所有的方法隱含的都是抽象的。而抽象類則可以同時包含抽象和非抽象的方法。
類可以實現(xiàn)很多個接口,但是只能繼承一個抽象類
類如果要實現(xiàn)一個接口,它必須要實現(xiàn)接口聲明的所有方法。但是,類可以不實現(xiàn)抽象類聲明的所有方法,當(dāng)然,在這種情況下,類也必須得聲明成是抽象的。
抽象類可以在不提供接口方法實現(xiàn)的情況下實現(xiàn)接口。
Java接口中聲明的變量默認(rèn)都是final的。抽象類可以包含非final的變量。
Java接口中的成員函數(shù)默認(rèn)是public的。抽象類的成員函數(shù)可以是private,protected或者是public。
接口是絕對抽象的,不可以被實例化。抽象類也不可以被實例化,但是,如果它包含main方法的話是可以被調(diào)用的。
16.什么是死鎖(deadlock)?
兩個進(jìn)程都在等待對方執(zhí)行完畢才能繼續(xù)往下執(zhí)行的時候就發(fā)生了死鎖。結(jié)果就是兩個進(jìn)程都陷入了無限的等待中。
17.如何確保N個線程可以訪問N個資源同時又不導(dǎo)致死鎖?
使用多線程的時候,一種非常簡單的避免死鎖的方式就是:指定獲取鎖的順序,并強(qiáng)制線程按照指定的順序獲取鎖。因此,如果所有的線程都是以同樣的順序加鎖和釋放鎖,就不會出現(xiàn)死鎖了。
Array和ArrayList的不同點:
Array可以包含基本類型和對象類型,ArrayList只能包含對象類型。
Array大小是固定的,ArrayList的大小是動態(tài)變化的。
ArrayList提供了更多的方法和特性,比如:addAll(),removeAll(),iterator()等等。
對于基本類型數(shù)據(jù),集合使用自動裝箱來減少編碼工作量。但是,當(dāng)處理固定大小的基本數(shù)據(jù)類型的時候,這種方式相對比較慢。
20.什么是迭代器(Iterator)?
Iterator接口提供了很多對集合元素進(jìn)行迭代的方法。每一個集合類都包含了可以返回迭代器實例的
迭代方法。迭代器可以在迭代的過程中刪除底層集合的元素。
克隆(cloning)或者是序列化(serialization)的語義和含義是跟具體的實現(xiàn)相關(guān)的。因此,應(yīng)該由集合類的具體實現(xiàn)來決定如何被克隆或者是序列化。
21.Iterator和ListIterator的區(qū)別是什么?
下面列出了他們的區(qū)別:
Iterator可用來遍歷Set和List集合,但是ListIterator只能用來遍歷List。
Iterator對集合只能是前向遍歷,ListIterator既可以前向也可以后向。
ListIterator實現(xiàn)了Iterator接口,并包含其他的功能,比如:增加元素,替換元素,獲取前一個和后一個元素的索引,等等。
Comparable和Comparator接口是干什么的?列出它們的區(qū)別。
Java提供了只包含一個compareTo()方法的Comparable接口。這個方法可以個給兩個對象排序。具體來說,它返回負(fù)數(shù),0,正數(shù)來表明輸入對象小于,等于,大于已經(jīng)存在的對象。
Java提供了包含compare()和equals()兩個方法的Comparator接口。compare()方法用來給兩個輸入?yún)?shù)排序,返回負(fù)數(shù),0,正數(shù)表明第一個參數(shù)是小于,等于,大于第二個參數(shù)。equals()方法需要一個對象作為參數(shù),它用來決定輸入?yún)?shù)是否和comparator相等。只有當(dāng)輸入?yún)?shù)也是一個comparator并且輸入?yún)?shù)和當(dāng)前comparator的排序結(jié)果是相同的時候,這個方法才返回true。
thread runnable
數(shù)據(jù)結(jié)構(gòu)與算法
list map set 以及實現(xiàn)類的原理
HashMap : http://www.cnblogs.com/ITtangtang/p/3948406.html
LinkedList : http://www.cnblogs.com/ITtangtang/p/3948610.html
ArrayList : http://www.cnblogs.com/ITtangtang/p/3948555.html
ConcurrentHashMap : http://www.cnblogs.com/dolphin0520/p/3932905.html
List Map Set 的區(qū)別
http://developer.51cto.com/art/201309/410205_all.htm
快速排序 :
http://www.cnblogs.com/MOBIN/p/4681369.html
二分查找:
http://blog.csdn.net/lovesummerforever/article/details/24588989
數(shù)組去重:
http://www.gjnote.com/archives/459.html
面經(jīng)
http://www.toutiao.com/a6436541491175620865/?tt_from=weixin&utm_campaign=client_share&app=news_article&utm_source=weixin&iid=11427333975&utm_medium=toutiao_ios&wxshare_count=1
美團(tuán)面試
http://m.itdecent.cn/p/ab4d0c6e9481