1?說說JVM垃圾回收機制。
http://blog.csdn.net/xiajian2010/article/details/17376453
http://www.lxweimin.com/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是什么,有啥區別?
http://www.lxweimin.com/p/58f817d176b7
Dalvik VM 和JVM的區別
https://www.zhihu.com/question/20207106
http://gudong.name/2017/04/14/jvm_vs_dalvik.html
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和線程的關系??怎么讓一個service不死掉,一直運行,service生命周期 service和Intentservice的區別
Service設置成START_STICKY,kill 后會被重啟(等待5秒左右),重傳Intent,保持與重啟前一樣
通過 startForeground將進程設置為前臺進程,做前臺服務,優先級和前臺應用一個級別,除非在系統內存非常缺,否則此進程不會被 kill
雙進程Service:讓2個進程互相保護,其中一個Service被清理后,另外沒被清理的進程可以立即重啟進程
QQ黑科技:在應用退到后臺后,另起一個只有 1 像素的頁面停留在桌面上,讓自己保持前臺狀態,保護自己不被后臺清理工具殺死
在已經root的設備下,修改相應的權限文件,將App偽裝成系統級的應用(Android4.0系列的一個漏洞,已經確認可行)
Android系統中當前進程(Process)fork出來的子進程,被系統認為是兩個不同的進程。當父進程被殺死的時候,子進程仍然可以存活,并不受影響。鑒于目前提到的在Android-Service層做雙守護都會失敗,我們可以fork出c進程,多進程守護。死循環在那檢查是否還存在,具體的思路如下(Android5.0以下可行)
用C編寫守護進程(即子進程),守護進程做的事情就是循環檢查目標進程是否存在,不存在則啟動它。
在NDK環境中將1中編寫的C代碼編譯打包成可執行文件(BUILD_EXECUTABLE)。
主進程啟動時將守護進程放入私有目錄下,賦予可執行權限,啟動它即可。
聯系廠商,加入白名單
Service兩種啟動方式的區別
http://www.lxweimin.com/p/2fb6eb14fdec
IntentService有以下特點:
(1)??它創建了一個獨立的工作線程來處理所有的通過onStartCommand()傳遞給服務的intents。
(2)??創建了一個工作隊列,來逐個發送intent給onHandleIntent()。
(3)??不需要主動調用stopSelft()來結束服務。因為,在所有的intent被處理完后,系統會自動關閉服務。
(4)??默認實現的onBind()返回null
(5)??默認實現的onStartCommand()的目的是將intent插入到工作隊列中?
4?Activity生命周期
http://peiquan.blog.51cto.com/7518552/1277373
http://blog.csdn.net/johnsonblog/article/details/7838108
5?handler AsyncTask可能導致內存泄漏 context可能導致的內存泄露
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
Handler Message obtain()對象池原理
http://www.lxweimin.com/p/e271ee639b68
6?自定義view?
http://blog.csdn.net/guolin_blog/article/details/12921889
自定義view四個構造函數詳解
http://blog.csdn.net/zhao123h/article/details/52210732
7?設計模式?
8?工作中遇到一次最大困難時什么??你最后是怎么解決的????如果讓你再來一次你是否能夠解決的更好
9?listview里面的item怎么優化,如果item的layout不同你要怎么優化??listview?多type?復用?convertview?的解決方法
http://www.eoeandroid.com/thread-246995-1-1.html?_dsign=8fb6add2
10?職業規劃
11?JAVA?中堆和棧的區別
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/guolin_blog/article/details/28863651
14?Touch事件傳遞機制
http://www.open-open.com/lib/view/open1422428386548.html
15?解決屏幕適配
http://blog.csdn.net/lmj623565791/article/details/49990941
16 handler Asynctask內部原理分析
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 的區別
RecyclerView的ViewHolder規范化
RecyclerView可以實現線性布局效果,網格布局效果,瀑布流布局效果
ListView具有setEmptyView() addHeaderView() addFooterView()
http://blog.csdn.net/lmj623565791/article/details/51854533
RecyclerView支持局部刷新
listview實現局部刷新https://juejin.im/entry/581bdee6570c35006094a30e
RecyclerView輕松實現item動畫效果
RecyclerView沒有setOnItemClickListener() setOnItemLongClickListener() 而是實現了RecyclerView.OnItemTouchListener()
http://www.voidcn.com/blog/liaoinstan/article/p-5785579.html
RecyclerView自定義分割線
19.View的繪制流程
?? ?從ViewRoot的performTraversals()方法開始依次調用perfromMeasure、performLayout和performDraw這三個方法。這三個方法分別完成頂級View的measure、layout和draw三大流程,其中perfromMeasure會調用measure,measure又會調用onMeasure,在onMeasure方法中則會對所有子元素進行measure,這個時候measure流程就從父容器傳遞到子元素中了,這樣就完成了一次measure過程,接著子元素會重復父容器的measure,如此反復就完成了整個View樹的遍歷.
?? ?同理,performLayout和performDraw也分別完成perfromMeasure類似的流程。通過這三大流程,分別遍歷整棵View樹,就實現了Measure,Layout,Draw這一過程,View就繪制出來了。
AsyncTask
1、設置當前AsyncTask的狀態為RUNNING,上面的switch也可以看出,每個異步任務在完成前只能執行一次。
2、執行了onPreExecute(),當前依然在UI線程,所以我們可以在其中做一些準備工作。
3、將我們傳入的參數賦值給了mWorker.mParams ,mWorker為一個Callable的子類,且在內部的call()方法中,調用了doInBackground(mParams),然后得到的返回值作為postResult的參數進行執行;postResult中通過sHandler發送消息,最終sHandler的handleMessage中完成onPostExecute的調用。
4、exec.execute(mFuture),mFuture為真正的執行任務的單元,將mWorker進行封裝,然后由sDefaultExecutor交給線程池進行執行。
如果現在大家去面試,被問到AsyncTask的缺陷,可以分為兩個部分說,在3.0以前,最大支持128個線程的并發,10個任務的等待。在3.0以后,無論有多少任務,都會在其內部單線程執行;
Handler源碼分析總結
1、首先Looper.prepare()在本線程中保存一個Looper實例,然后該實例中保存一個MessageQueue對象;因為Looper.prepare()在一個線程中只能調用一次,所以MessageQueue在一個線程中只會存在一個。
2、Looper.loop()會讓當前線程進入一個無限循環,不端從MessageQueue的實例中讀取消息,然后回msg.target.dispatchMessage(msg)方法。
3、Handler的構造方法,會首先得到當前線程中保存的Looper實例,進而與Looper實例中的MessageQueue想關聯。
4、Handler的sendMessage方法,會給msg的target賦值為handler自身,然后加入MessageQueue中。
5、在構造Handler實例時,我們會重寫handleMessage方法,也就是msg.target.dispatchMessage(msg)最終調用的方法。
webView
Android webView優化
Android webView與js的交互
http://droidyue.com/blog/2014/09/20/interaction-between-java-and-javascript-in-android/index.html
Android性能優化
布局優化、繪制優化、內存泄露優化、響應速度優化、ListView優化、線程優化以及一些性能優化的建議。
布局優化:盡量減少布局文件的層級,刪除布局中無用的控件和層級。合理利用這幾大布局,包括Constraintlayout, 提供按需加載的功能
繪制優化:onDraw()方法中不要創建新的局部對象,不要做耗時的任務 GPU過度繪制?HierarchyView來檢測 開發者選項 顯示開發者過度繪制選項
內存泄露優化:context、handler、bitmap、單例模式、內部類、靜態變量、資源對象沒有關閉
Apk包大小的優化 : webp,tinypng 開啟資源壓縮,自動刪除無用的資源,代碼混淆
圖片大小的優化 : 對圖片針對屏幕的尺寸做相應的壓縮處理
響應速度優化和ANR日志分析:避免在主線程中做耗時操作,系統會在/data/anr目錄下創建一個文件traces.txt
線程優化 :?
避免創建過多的對象
不要過多使用枚舉,枚舉占用的內存空間要比整型大
常量請使用static final 來修飾
使用一些Android特有的數據結構,比如SparseArray和Pair等,他們都具有更好的性能
適當使用軟引用和弱引用
采用內存緩存和磁盤緩存
盡量采用靜態內部類,這樣可以避免潛在的由于內部類而導致的內存泄露
https://academy.realm.io/cn/posts/droidcon-farber-improving-android-app-performance/
http://www.lxweimin.com/p/be05874965d4
https://mp.weixin.qq.com/s/SmW2ljasKSXC1zlwTLY-iQ
簡單參考:主要是怎么來通過tools來進行性能優化
http://blog.csdn.net/yanbober/article/details/48394201
ViewStub 和 merge 的區別
在動態加載布局時,使用 ViewStub 的性能要比使用設置 View 的可見性高。因為雖然把 View 的初始可見 View.GONE,使其不可見,但是在 Inflate 布局的時候 View 仍然會被 Inflate,也就是說仍然會創建對象,會被實例化,會被設置屬性。也就是說,會耗費內存等資源。
內存泄露檢測框架-leakcanary原理分析
https://juejin.im/entry/5928f6360ce463006b120c3c
自定義BaseAdapter
http://blog.csdn.net/lmj623565791/article/details/38902805
RelativeLayout和LinearLayout性能分析
http://www.lxweimin.com/p/8a7d059da746
1.RelativeLayout會讓子View調用2次onMeasure,LinearLayout 在有weight時,也會調用子View2次onMeasure
2.RelativeLayout的子View如果高度和RelativeLayout不同,則會引發效率問題,當子View很復雜時,這個問題會更加嚴重。如果可以,盡量使用padding代替margin。
3.在不影響層級深度的情況下,使用LinearLayout和FrameLayout而不是RelativeLayout。
為什么Google給開發者默認新建了個RelativeLayout,而自己卻在DecorView中用了個LinearLayout。因為DecorView的層級深度是已知而且固定的,上面一個標題欄,下面一個內容欄。采用RelativeLayout并不會降低層級深度,所以此時在根節點上用LinearLayout是效率最高的。而之所以給開發者默認新建了個RelativeLayout是希望開發者能采用盡量少的View層級來表達布局以實現性能最優,因為復雜的View嵌套對性能的影響會更大一些。
19.MVP模式講解
http://blog.csdn.net/lmj623565791/article/details/46596109
20.多進程通信方法,Binder實現機制
android?onSaveInstanceState方法
http://blog.sina.com.cn/s/blog_618199e60101g1k5.html
hashcode() 和 equals()?
http://www.cnblogs.com/skywang12345/p/3324958.html
Android中為啥會65535的限制,解釋下原因.
http://blog.csdn.net/u011733020/article/details/71481395
橫豎屏切換 Activity生命周期的變化
1、不設置Activity的android:configChanges時,切屏會重新調用各個生命周期,切橫屏時會執行一次,切豎屏時會執行兩次
2、設置Activity的android:configChanges="orientation"時,切屏還是會重新調用各個生命周期,切橫、豎屏時只會執行一次
3、設置Activity的android:configChanges="orientation|keyboardHidden"時,切屏不會重新調用各個生命周期,只會執行onConfigurationChanged方法
Retrofit、Glide、okHttp源碼分析
Retrofit
http://www.lxweimin.com/p/45cb536be2f4
Retrofit.build()
?? ?new OkHttpClient()
?? ?create callbackExecutor(include main thread handler)
?? ?create CallAdapterFactory List
?? ??? ?創建默認的defaultCallAdapterFactory(callbackExecutor)
?? ?create ConverterFactory List
?? ?new Retrofit
Retrofit.create() 使用動態代理
?? ?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<>)
Okhttp 和volley的比較
volley底層用的是httpclient 跟 HttpUrlConnection OkHttp底層用的是socket
volley不支持同步,不能post大數據,不適合用來上傳文件,volley內部有一個開啟一個CacheDispatcher和4個默認的NetworkDispatcher 如果一個request需要很耗時的話 ?適合小的請求
okhttp支持同步,異步請求,實現了spdy http2 ?wesocket協議 http協議緩存 實現了NIO (估計有些讀者不理解 IO 和 NIO 的概念,這里姑且簡單提下,這兩個都是 Java 中的概念,如果我從硬盤讀取數據,第一種方式就是程序一直等,數據讀完后才能繼續操作,這種是最簡單的也叫阻塞式 IO,還有一種就是你讀你的,我程序接著往下執行,等數據處理完你再來通知我,然后再處理回調。而第二種就是 NIO 的方式,非阻塞式。 ) ?
okhttp 雖然不是google開發的 但是已經默認作為Android的請求方式了
- 支持 SPDY ,共享同一個Socket來處理同一個服務器的所有請求,socket自動選擇最好路線,并支持自動重連,擁有自動維護的socket連接池,減少握手次數 - 擁有隊列線程池,輕松寫并發 - 如果SPDY不可用,則通過連接池來減少請求延時 - 擁有Interceptors輕松處理請求與響應(比如透明GZIP壓縮,LOGGING),無縫的支持GZIP來減少數據流量 - 基于Headers的緩存策略,緩存響應數據來減少重復的網絡請求 -會從很多常用的連接問題中自動恢復。如果您的服務器配置了多個IP地址,當第一個IP連接失敗的時候,OkHttp會自動嘗試下一個IP。OkHttp還處理了代理服務器問題和SSL握手失敗問題。 -使用 OkHttp 無需重寫您程序中的網絡代碼。OkHttp實現了幾乎和java.net.HttpURLConnection一樣的API。如果您用了 Apache HttpClient,則OkHttp也提供了一個對應的okhttp-apache 模塊
Glide :http://blog.csdn.net/guolin_blog/article/details/53759439
okHttp的工作原理以及緩存機制
https://blog.piasy.com/2016/07/11/Understand-OkHttp/
線程池 Java內存管理 多態
java內存管理 :http://www.cnblogs.com/vamei/archive/2013/04/28/3048353.html
線程池 :http://blog.csdn.net/lift_class/article/details/70216690
多線程通信
https://blog.csdn.net/u011240877/article/details/72863432
多線程經典問題 : 生產消費者模型
https://blog.csdn.net/MONKEY_D_MENG/article/details/6251879
線程安全
進程和線程的關系
Thread和Runnable的區別
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
APP架構設計
工作中遇到最難的問題以及解決方案
單例
http://blog.csdn.net/jason0539/article/details/23297037
強引用 軟引用 弱引用 虛引用
http://blog.csdn.net/mazhimazh/article/details/19752475
HTTP
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://www.lxweimin.com/p/3c94ae673e2a
Android多渠道打包
http://tech.meituan.com/android-apk-v2-signature-scheme.html
多進程通信
從頭到尾總結一下:
1.Touch事件分發中只有兩個主角:ViewGroup和View。ViewGroup包含onInterceptTouchEvent、dispatchTouchEvent、onTouchEvent三個相關事件。View包含dispatchTouchEvent、onTouchEvent兩個相關事件。其中ViewGroup又繼承于View。
2.ViewGroup和View組成了一個樹狀結構,根節點為Activity內部包含的一個ViwGroup。
3.觸摸事件由Action_Down、Action_Move、Aciton_UP組成,其中一次完整的觸摸事件中,Down和Up都只有一個,Move有若干個,可以為0個。
4.當Acitivty接收到Touch事件時,將遍歷子View進行Down事件的分發。ViewGroup的遍歷可以看成是遞歸的。分發的目的是為了找到真正要處理本次完整觸摸事件的View,這個View會在onTouchEvent結果返回true。
5.當某個子View返回true時,會中止Down事件的分發,同時在ViewGroup中記錄該子View。接下去的Move和Up事件將由該子View直接進行處理。由于子View是保存在ViewGroup中的,多層ViewGroup的節點結構時,上級ViewGroup保存的會是真實處理事件的View所在的ViewGroup對象:如ViewGroup0-ViewGroup1-TextView的結構中,TextView返回了true,它將被保存在ViewGroup1中,而ViewGroup1也會返回true,被保存在ViewGroup0中。當Move和UP事件來時,會先從ViewGroup0傳遞至ViewGroup1,再由ViewGroup1傳遞至TextView。
6.當ViewGroup中所有子View都不捕獲Down事件時,將觸發ViewGroup自身的onTouch事件。觸發的方式是調用super.dispatchTouchEvent函數,即父類View的dispatchTouchEvent方法。在所有子View都不處理的情況下,觸發Acitivity的onTouchEvent方法。
7.onInterceptTouchEvent有兩個作用:1.攔截Down事件的分發。2.中止Up和Move事件向目標View傳遞,使得目標View所在的ViewGroup捕獲Up和Move事件。
問:Android中為什么主線程不會因為Looper.loop()里的死循環卡死?
答:線程是一段可執行的代碼,當可執行代碼執行完成后,線程生命周期便終止,線程退出。對于主線程,我們是絕不希望運行一段時間后自己就退出,那么如何保證能一直存活呢?簡單做法就是可執行代碼是能一直執行下去的,死循環便能保證不會被退出,例如,Binder線程也是采用死循環的方法,通過循環方式不斷與Binder驅動進行讀寫操作,當然并非簡單地死循環,無消息時會休眠。真正會卡死主線程的操作是在回調方法中onCreate()、onStart()、onResume等操作時間過長,導致掉幀,甚至發生ANR,Looper.loop()本身不會導致應用卡死。
dispatchTouchEvent源碼分析總結
觸摸控件(View)首先執行dispatchTouchEvent方法。
在dispatchTouchEvent方法中先執行onTouch方法,后執行onClick方法(onClick方法在onTouchEvent中執行,下面會分析)。
如果控件(View)的onTouch返回false或者mOnTouchListener為null(控件沒有設置setOnTouchListener方法)或者控件不是enable的情況下會調運onTouchEvent,dispatchTouchEvent返回值與onTouchEvent返回一樣。
如果控件不是enable的設置了onTouch方法也不會執行,只能通過重寫控件的onTouchEvent方法處理(上面已經處理分析了),dispatchTouchEvent返回值與onTouchEvent返回一樣。
如果控件(View)是enable且onTouch返回true情況下,dispatchTouchEvent直接返回true,不會調用onTouchEvent方法。
Volley源碼分析總結
????1. 當一個RequestQueue被成功申請后會開啟一個CacheDispatcher和4個默認的NetworkDispatcher。
????2. CacheDispatcher緩存調度器最為第一層緩沖,開始工作后阻塞的從緩存序列mCacheQueue中取得請求;對于已經取消的請求,標記為跳過并結束這個請求;新的或者過期的請求,直接放入mNetworkQueue中由N個NetworkDispatcher進行處理;已獲得緩存信息(網絡應答)卻沒有過期的請求,由Request的parseNetworkResponse進行解析,從而確定此應答是否成功。然后將請求和應答交由Delivery分發者進行處理,如果需要更新緩存那么該請求還會被放入mNetworkQueue中。
????3. 將請求Request add到RequestQueue后對于不需要緩存的請求(需要額外設置,默認是需要緩存)直接丟入mNetworkQueue交給N個NetworkDispatcher處理;對于需要緩存的,新的請求加到mCacheQueue中給CacheDispatcher處理;需要緩存,但是緩存列表中已經存在了相同URL的請求,放在mWaitingQueue中做暫時處理,等待之前請求完畢后,再重新添加到mCacheQueue中。
? ??4. 網絡請求調度器NetworkDispatcher作為網絡請求真實發生的地方,對消息交給BasicNetwork進行處理,同樣的,請求和結果都交由Delivery分發者進行處理。
????5. Delivery分發者實際上已經是對網絡請求處理的最后一層了,在Delivery對請求處理之前,Request已經對網絡應答進行過解析,此時應答成功與否已經設定;而后Delivery根據請求所獲得的應答情況做不同處理;若應答成功,則觸發deliverResponse方法,最終會觸發開發者為Request設定的Listener;若應答失敗,則觸發deliverError方法,最終會觸發開發者為Request設定的ErrorListener;處理完后,一個Request的生命周期就結束了,Delivery會調用Request的finish操作,將其從mRequestQueue中移除,與此同時,如果等待列表中存在相同
URL的請求,則會將剩余的層級請求全部丟入mCacheQueue交由CacheDispatcher進行處理。
接口抽象類的區別
接口中所有的方法隱含的都是抽象的。而抽象類則可以同時包含抽象和非抽象的方法。
類可以實現很多個接口,但是只能繼承一個抽象類
類如果要實現一個接口,它必須要實現接口聲明的所有方法。但是,類可以不實現抽象類聲明的所有方法,當然,在這種情況下,類也必須得聲明成是抽象的。
抽象類可以在不提供接口方法實現的情況下實現接口。
Java接口中聲明的變量默認都是final的。抽象類可以包含非final的變量。
Java接口中的成員函數默認是public的。抽象類的成員函數可以是private,protected或者是public。
接口是絕對抽象的,不可以被實例化。抽象類也不可以被實例化,但是,如果它包含main方法的話是可以被調用的。
16.什么是死鎖(deadlock)?
兩個進程都在等待對方執行完畢才能繼續往下執行的時候就發生了死鎖。結果就是兩個進程都陷入了無限的等待中。
17.如何確保N個線程可以訪問N個資源同時又不導致死鎖?
使用多線程的時候,一種非常簡單的避免死鎖的方式就是:指定獲取鎖的順序,并強制線程按照指定的順序獲取鎖。因此,如果所有的線程都是以同樣的順序加鎖和釋放鎖,就不會出現死鎖了。
Array和ArrayList的不同點:
Array可以包含基本類型和對象類型,ArrayList只能包含對象類型。
Array大小是固定的,ArrayList的大小是動態變化的。
ArrayList提供了更多的方法和特性,比如:addAll(),removeAll(),iterator()等等。
對于基本類型數據,集合使用自動裝箱來減少編碼工作量。但是,當處理固定大小的基本數據類型的時候,這種方式相對比較慢。
20.什么是迭代器(Iterator)?
Iterator接口提供了很多對集合元素進行迭代的方法。每一個集合類都包含了可以返回迭代器實例的
迭代方法。迭代器可以在迭代的過程中刪除底層集合的元素。
克隆(cloning)或者是序列化(serialization)的語義和含義是跟具體的實現相關的。因此,應該由集合類的具體實現來決定如何被克隆或者是序列化。
21.Iterator和ListIterator的區別是什么?
下面列出了他們的區別:
Iterator可用來遍歷Set和List集合,但是ListIterator只能用來遍歷List。
Iterator對集合只能是前向遍歷,ListIterator既可以前向也可以后向。
ListIterator實現了Iterator接口,并包含其他的功能,比如:增加元素,替換元素,獲取前一個和后一個元素的索引,等等。
Comparable和Comparator接口是干什么的?列出它們的區別。
Java提供了只包含一個compareTo()方法的Comparable接口。這個方法可以個給兩個對象排序。具體來說,它返回負數,0,正數來表明輸入對象小于,等于,大于已經存在的對象。
Java提供了包含compare()和equals()兩個方法的Comparator接口。compare()方法用來給兩個輸入參數排序,返回負數,0,正數表明第一個參數是小于,等于,大于第二個參數。equals()方法需要一個對象作為參數,它用來決定輸入參數是否和comparator相等。只有當輸入參數也是一個comparator并且輸入參數和當前comparator的排序結果是相同的時候,這個方法才返回true。
thread runnable
字符串常量池
http://droidyue.com/blog/2014/12/21/string-literal-pool-in-java/index.html
字符串拼接
http://droidyue.com/blog/2014/08/30/java-details-string-concatenation/
并發
volatile的原理
http://www.cnblogs.com/dolphin0520/p/3920373.html
synchronized的原理
http://www.cnblogs.com/paddix/p/5367116.html
https://blog.csdn.net/xiao__gui/article/details/8188833
java.util.concurrent包詳解
http://blog.csdn.net/chenfengdejuanlian/article/details/54969339
synchronized與Lock的區別
wait()和sleep()區別
https://www.cnblogs.com/DreamSea/archive/2012/01/16/SleepAndWaitDifferent.html
數據結構與算法
list map set 以及實現類的原理
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 的區別
http://developer.51cto.com/art/201309/410205_all.htm
快速排序 :?
http://www.cnblogs.com/MOBIN/p/4681369.html
publicstaticvoidquickSort(intarr[],int_left,int_right){
???????intleft =_left;
???????intright =_right;
???????inttemp = 0;
???????if(left <=right){??//待排序的元素至少有兩個的情況
??????????? temp=arr[left];?//待排序的第一個元素作為基準元素
???????????while(left !=right){??//從左右兩邊交替掃描,直到left = right
???????????????while(right > left && arr[right] >=temp)?
???????????????????? right--;??????//從右往左掃描,找到第一個比基準元素小的元素
????????????????? arr[left]=arr[right];?//找到這種元素arr[right]后與arr[left]交換
???????????????while(left < right && arr[left] <=temp)
???????????????????? left++;???????//從左往右掃描,找到第一個比基準元素大的元素
????????????????? arr[right]=arr[left];?//找到這種元素arr[left]后,與arr[right]交換
??????????? }
??????????? arr[right]=temp;??//基準元素歸位
??????????? quickSort(arr,_left,left-1);?//對基準元素左邊的元素進行遞歸排序
??????????? quickSort(arr, right+1,_right);?//對基準元素右邊的進行遞歸排序
??????? }???????
??? }
二分查找:
http://blog.csdn.net/lovesummerforever/article/details/24588989
/**?
?????*?二分查找遞歸實現。?
?????*?@param?srcArray??有序數組?
?????*?@param?start?數組低地址下標?
?????*?@param?end???數組高地址下標?
?????*?@param?key??查找元素?
?????*?@return?查找元素不存在返回-1?
?????*/??
????public?static?int?binSearch(int?srcArray[],?int?start,?int?end,?int?key)?{??
????????int?mid?=?(end?-?start)?/?2?+?start;??
\ ? ? ?if?(srcArray[mid]?==?key)?{??
????????????return?mid;??
????????}??
????????if?(start?>=?end)?{??
????????????return?-1;??
????????}?else?if?(key?>?srcArray[mid])?{??
????????????return?binSearch(srcArray,?mid?+?1,?end,?key);??
????????}?else?if?(key?<?srcArray[mid])?{??
????????????return?binSearch(srcArray,?start,?mid?-?1,?key);??
????????}??
????????return?-1;??
????}??
數組去重:
http://www.gjnote.com/archives/459.html
自己實現一個Stack 實現單鏈表 數的深度遍歷 廣度遍歷
面經
美團面試
http://www.lxweimin.com/p/ab4d0c6e9481
國內一線互聯網公司內部面試題庫
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
美團面試:
貓撲素數;1到n,求1的個數;單詞反轉
算法實現下如何統計出Activity中view樹的深度。
public?int?findDeep1(BiTree?root)??
??{??
??????if(root?==?null)??
??????{??
??????????return?0;??
??????}??
??????else??
??????{??
???????int?lchilddeep?=?findDeep1(root.left);//求左子樹的深度??
???????int?rchilddeep?=?findDeep1(root.right);//求右子樹的深度??
???????return?lchilddeep?>?rchilddeep???lchilddeep?+?1?:?rchilddeep?+?1;//左子樹和右子樹深度較大的那個加一等于整個樹的深度??
??????}??
??}?
java內存優化方案
釋放連接
優化邏輯,釋放不必要的對象 盡量使用局部變量
減少循環邏輯里的對象的創建
基本類型代替對象類型
使用stringBuffer和stringBuilder替代多次String對象 ?
單線程盡量使用hashmap和ArrayList
提前分配stringBuffer,數組,array,vector等容量
合適的場所使用單例
盡量不要隨意使用靜態變量
處理內存泄露
HTTP和HTTPS的區別:
1、HTTP協議使用默認80端口,HTTPS協議使用443端口
2、HTTPS協議需要到CA申請證書,一般免費的證書較少,需要交費
3、HTTP信息是明文傳輸,HTTPS使用具有安全性的SSL加密傳輸信息
http1和http2的區別:
1.http2可以同時發多個請求
2.http2會壓縮,體積小
3.http2服務器會推送
加密算法有哪些?對稱加密和非對稱加密的區別??
MD5,SHA1,Base64,RSA,AES,DES?
非對稱密鑰加密的使用過程:
1. A要向B發送信息,A和B都要產生一對用于加密和解密的公鑰和私鑰。
2. A的私鑰保密,A的公鑰告訴B;B的私鑰保密,B的公鑰告訴A。
3. A要給B發送信息時,A用B的公鑰加密信息,因為A知道B的公鑰。
4. A將這個消息發給B(已經用B的公鑰加密消息)。
5. B收到這個消息后,B用自己的私鑰解密A的消息,其他所有收到這個報文的人都無法解密,因為只有B才有B的私鑰。
6. 反過來,B向A發送消息也是一樣。
(1) 對稱加密加密與解密使用的是同樣的密鑰,所以速度快,但由于需要將密鑰在網絡傳輸,所以安全性不高。
(2) 非對稱加密使用了一對密鑰,公鑰與私鑰,所以安全性高,但加密與解密速度慢。
(3) 解決的辦法是將對稱加密的密鑰使用非對稱加密的公鑰進行加密,然后發送出去,接收方使用私鑰進行解密得到對稱加密的密鑰,然后雙方可以使用對稱加密來進行溝通。
TCP的三次握手?兩次行不行?為什么?TCP攻擊知道嗎?如何進行攻擊?
gradle中buildToolsVersion和TargetSdkVersion的區別是什么
http://chinagdg.org/2016/01/picking-your-compilesdkversion-minsdkversion-targetsdkversion/
手機適配一些方案
靜態方法是否能被重寫