Android 面試題

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://droidyue.com/blog/2014/12/28/in-android-handler-classes-should-be-static-or-leaks-might-occur/

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優化

https://mp.weixin.qq.com/s?__biz=MjM5NjQ5MTI5OA==&mid=2651746383&idx=2&sn=9b8f8ec2adf7c13934bfb9891eae4d81&chksm=bd12a9028a652014ab8b89ff996cf7b53e8d40bfbcd64725c7c82df72515669fcf5267272ccf&scene=0&key=8652b956ca1971a40ad6b41493d96b1dec8f3b81a9dc906f9c847f4096f53793bf38273a695ff893f30d3fc5eae8409e0ed72b4fb4de3469ba0f52f101d17460a7f899a398cd880b515f2fea36a1ae19&ascene=0&uin=ODE4NjgzNjgw&devicetype=iMac+MacBookPro12%2C1+OSX+OSX+10.12.1+build(16B2555)&version=12020510&nettype=WIFI&fontScale=100&pass_ticket=UYjezO5sOIUhdToTt7sxrHDotjZd3okvLWNljbwnQR7zFq3dGtrbuuXIzLM5LKTr

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

https://mp.weixin.qq.com/s?__biz=MzIwMzYwMTk1NA==&mid=2247485679&idx=1&sn=cdf5785ae5a63af9b7eec9f068ea4b96&chksm=96cda9a2a1ba20b4f91db6985c24696ec1ad710f06d4d9692e35cec25caf19b2c1bbc76111e6&scene=0&key=31a3a388ed6fa873510429955b564e37579e60b77f2fdd98e765085401d84f3534cb1c4bf0da1da6fd44c60424f647adc8e566fcd1db9461e5a7dd7d8452b6e3dd7d85399f26e5d2d86854d51b74c117&ascene=0&uin=ODE4NjgzNjgw&devicetype=iMac+MacBookPro12%2C1+OSX+OSX+10.12.1+build(16B2555)&version=12020510&nettype=WIFI&fontScale=100&pass_ticket=FIP8laSErajzhVZpQmcOgKDoY4MXjh5XMwvJICLE7vZDkXiofAb6S%2BVDyt47Z4nZ

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 實現單鏈表 數的深度遍歷 廣度遍歷

面經

https://mp.weixin.qq.com/s?__biz=MzI2OTQxMTM4OQ==&mid=2247485000&idx=1&sn=2d74c597c62c9c4229f79cce9587b6bf&chksm=eae1f31add967a0cddf98dd3bbf529b50420bbf7a9cb6b238e6e6fe993c8bd8ba5cca728e0da#rd

美團面試

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/

手機適配一些方案

靜態方法是否能被重寫

http://xm-king.iteye.com/blog/745787

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,001評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,786評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,986評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,204評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,964評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,354評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,410評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,554評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,106評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,918評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,093評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,648評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,342評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,755評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,009評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,839評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,107評論 2 375

推薦閱讀更多精彩內容