Android面試總結(updating)

_小馬快跑_發表於2017-12-15

#Java知識點:

  • Java中Set、List、Map的區別: **Set:**儲存的值是無序、不允許重複的,加入Set的元素必須定義equals()方法以確保物件的唯一性。 **List:**儲存的值是有序、允許重複,**List是執行緒不安全的,Vector是執行緒安全的,**或者使用CopyOnWriteArrayList,它是java.util.concurrent包中的一個List的實現類。CopyOnWrite的意思是在寫時拷貝,也就是如果需要對CopyOnWriteArrayList的內容進行改變,首先會拷貝一份新的List並且在新的List上進行修改,最後將原List的引用指向新的List。 **Map:**成對的資料結構,鍵值必須具有唯一性,鍵值不能相同,否則值會被替換。 更詳細點這裡:http://www.cnblogs.com/xiaofengkang/p/3859457.html

  • 位元組流和字元流: 節流在操作時本身不會用到緩衝區(記憶體),是檔案本身直接操作的,而字元流在操作時使用了緩衝區,通過緩衝區再操作檔案。

    Paste_Image.png
    更詳細點這裡:http://blog.csdn.net/cynhafa/article/details/6882061

  • 遞迴刪除檔案/資料夾:

    public static void deleteFile(File file) {
        if (file.exists()) {
            if (file.isDirectory()) {
                //如果是資料夾
                File[] files = file.listFiles();
                if (files.length <= 0) {
                    file.delete();
                } else {
                    for (int i = 0; i < files.length; i++) {
                        deleteFile(files[i]);
                    }
                }
            } else {
                //如果是檔案
                file.delete();
            }
        }
    }
複製程式碼
  • Java sleep()和wait()以及yield()和join()的區別: 執行緒主要有以下幾種狀態:可執行,執行,阻塞,死亡。 **sleep():**方法可以直接呼叫,而wait()方法依賴於同步。而更深層次的區別在於sleep方法只是暫時讓出CPU的執行權,並不釋放鎖。而wait()方法則需要釋放鎖。 wait():方法的作用是將當前執行的執行緒掛起(即讓其進入阻塞狀態),直到notify或notifyAll方法來喚醒執行緒. **yield():**告訴當前正在執行的執行緒把執行機會交給執行緒池中擁有相同優先順序的執行緒。使當前正在執行狀態的執行緒變成可執行狀態。 **join():**方法就是通過wait方法來將執行緒的阻塞,如果join的執行緒還在執行,則將當前執行緒阻塞起來,直到join的執行緒執行完成,當前執行緒才能執行。 更多:http://www.cnblogs.com/paddix/p/5381958.html

  • Java抽象類和介面: 1、 抽象類在java語言中所表示的是一種繼承關係,一個子類只能存在一個父類,但是可以存在多個介面。 2、 在抽象類中可以擁有自己的成員變數和非抽象類方法,但是介面中只能存在靜態的不可變的成員資料(不過一般都不在介面中定義成員資料),而且它的所有方法都是抽象的。 3、抽象類和介面所反映的設計理念是不同的,抽象類所代表的是“is-a”的關係,而介面所代表的是“like-a”的關係。子類只能單繼承抽象類,但是可以實現多個介面; 抽象類和介面是java語言中兩種不同的抽象概念,他們的存在對多型提供了非常好的支援,雖然他們之間存在很大的相似性。但是對於他們的選擇往往反應了您對問題域的理解。只有對問題域的本質有良好的理解,才能做出正確、合理的設計。

  • Java基本資料型別: byte、short、int、long、float、double、char、boolean

    blog131-2.png
    詳見:http://www.cnblogs.com/simplefrog/archive/2012/07/15/2592011.html

  • String是基本型別嗎? 不是。Java中的基本資料型別只有8個:byte、short、int、long、float、double、char、boolean;除了基本型別(primitive type)和列舉型別(enumeration type),剩下的都是引用型別(reference type)。

  • Java中的裝箱與拆箱: http://www.cnblogs.com/dolphin0520/p/3780005.html 如果整型字面量的值在-128到127之間,那麼不會new新的Integer物件,而是直接引用常量池中的Integer物件,否則需要重新new Integer(int)。

  • Java中final關鍵字有什麼特點? 1、修飾類表示該類不能被繼承 2、修飾方法表示方法不能被重寫 3、修飾變數表示變數被賦值之後不能再修改

更多Java面試題檢視: http://www.importnew.com/22083.html

#Android知識點:

  • 啟動模式 Intent.Flags: http://blog.csdn.net/liuhe688/article/details/6761337

  • Android避免記憶體OOM的一些優化: 1、使用更加輕量級的資料結構 2、避免使用列舉 3、減小Bitmap物件的記憶體佔用 (1)inSampleSize:縮放比例,在把圖片載入到記憶體之前,先計算一個合適的縮放比例,避免不必要的大圖載入 (2)decodeFormat:解碼格式,選擇ARGB_8888/RBG_565/ARGB_4444/ALPHA_8,存在很大差異。 4、使用更小的圖片 在涉及給到資源圖片時,我們需要特別留意這張圖片是否存在可以壓縮的空間,是否可以使用更小的圖片。儘量使用更小的圖片不僅可以減少記憶體的使用,還能避免出現大量的InflationException。假設有一張很大的圖片被XML檔案直接引用,很有可能在初始化檢視時會因為記憶體不足而發生InflationException,這個問題的根本原因其實是發生了OOM。 5、記憶體物件的重複利用 1)複用系統自帶的資源 2)注意在ListView/GridView等出現大量重複子元件的檢視裡對ConvertView的複用 3)Bitmap物件的複用 4)避免在onDraw方法裡面執行物件的建立 5)StringBuilder 更多檢視:http://www.csdn.net/article/2015-09-18/2825737/3 6、Android子執行緒真的不能更新UI麼? http://www.cnblogs.com/lao-liang/p/5108745.html 7、SparseArray、ArrayMap: http://www.jianshu.com/p/a1141f92d2cd http://blog.csdn.net/as02446418/article/details/47428737 http://blog.csdn.net/u010687392/article/details/47809295 8、效能優化典範之多執行緒篇: http://www.cnblogs.com/bugly/p/5519510.html 9、螢幕適配: http://www.jianshu.com/p/ec5a1a30694b 10、Android載入高清巨圖、長圖:(BitmapRegionDecoder Rect) http://blog.csdn.net/lmj623565791/article/details/49300989/ http://blog.csdn.net/guolin_blog/article/details/9316683 http://www.jianshu.com/p/8872b7e0bb51

百度糯米: 1、單連結串列的反轉: http://blog.csdn.net/guyuealian/article/details/51119499 2、Java中的equals、hashcode、==: http://blog.csdn.net/jiangwei0910410003/article/details/22739953 http://www.cnblogs.com/xudong-bupt/p/3960177.html 3、平時用過的三方庫及其中的原理 4、菲波那切數列: http://blog.csdn.net/u010983881/article/details/50462951 5、演算法的時間複雜度的定義以及陣列和連結串列的時間複雜度:

時間複雜度定義:演算法的基本操作的執行次數作為演算法時間複雜度的度量,時間複雜度不是執行完一段程式的總時間,而是其中基本操作的總次數。明確哪些操作是基本操作,然後計算出基本操作重複的次數。

空間複雜度定義:是指在執行時所需的儲存空間的度量,主要考慮在演算法執行過程中臨時佔用的儲存空間的大小

陣列利用下標定位,時間複雜度為O(1),連結串列定位元素時間複雜度O(n); 陣列插入或刪除元素的時間複雜度O(n),連結串列的時間複雜度O(1)。

6、設計模式六大原則: http://www.uml.org.cn/sjms/201211023.asp 7、Gson解析原理: http://blog.csdn.net/qyl10241024/article/details/49473513 8、Handler原理 9、記憶體洩漏和記憶體優化

  • 單例(主要原因還是因為一般情況下單例都是全域性的,有時候會引用一些實際生命週期比較短的變數,導致其無法釋放)
  • 靜態變數(同樣也是因為生命週期比較長)
  • Handler記憶體洩露[7]
  • 匿名內部類(匿名內部類會引用外部類,導致無法釋放,比如各種回撥)
  • 資源使用完未關閉(BraodcastReceiver,ContentObserver,File,Cursor,Stream,Bitmap)

10、Okhttp 11、熱修復Hook原理

相關文章