看到大廠的面試題,你慌了嗎?


       最近參加了TX音樂Android工程師崗位的面試,這里憑記憶記錄了面試中的一些考點,希望能幫到正在面試的你(答案還在整理中)!

1、Java調用函數傳入實際參數時,是值傳遞還是引用傳遞?

2、單例模式的DCL方式,為什么需要第二次判空?

    單例模式的DCL是一種比較好的單例實現方式,面試中被問及的頻率非常高,考察的方式也多種多樣。根據本題的提問,這里簡單整理了一下,這里面的每一個點最好都能夠做到爛熟於心:

 1 public class Test {
 2     private volatile static Test instance;
 3 
 4     private Test() {
 5 
 6     }
 7 
 8     public static Test getInstance() {
 9         if (instance == null) {
10             synchronized (Test.class) {
11                 if (instance == null) {
12                     instance = new Test();
13                 }
14             }
15         }
16         return instance;
17     }
18 }

 這里有5個要點需要注意:

    (1)第一個注意點:使用私有的構造函數,確保正常情況下該類不能被外部初始化(非正常情況比如通過反射初始化,一般使用反射之后單例模式也就失去效果了)。

    (2)第二個注意點:getInstance方法中第一個判空條件,邏輯上是可以去除的,去除之后並不影響單例的正確性,但是去除之后效率低。因為去掉之后,不管instance是否已經初始化,都會進行synchronized操作,而synchronized是一個重操作消耗性能。加上之后,如果已經初始化直接返回結果,不會進行synchronized操作。

    (3)第三個注意點:加上synchronized是為了防止多個線程同時調用getInstance方法時,各初始化instance一遍的並發問題。

    (4)第四個注意點:getInstance方法中的第二個判空條件是不可以去除,如果去除了,並且剛好有兩個線程a和b都通過了第一個判空條件。此時假設a先獲得鎖,進入synchronized的代碼塊,初始化instance,a釋放鎖。接着b獲得鎖,進入synchronized的代碼塊,也直接初始化instance,instance被初始化多遍不符合單例模式的要求~。加上第二個判空條件之后,b獲得鎖進入synchronized的代碼塊,此時instance不為空,不執行初始化操作。

    (5)第五個注意點:instance的聲明有一個voliate關鍵字,如果不用該關鍵字,有可能會出現異常。因為instance = new Test();並不是一個原子操作,會被編譯成三條指令,如下所示。
          1)給Test的實例分配內存

          2)初始化Test的構造器

          3)將instance對象指向分配的內存空間(注意,此時instance就不為空)

        然后咧,java會指令重排序,JVM根據處理器的特性,充分利用多級緩存,多核等進行適當的指令重排序,使程序在保證業務運行的同時,充分利用CPU的執行特點,最大的發揮機器的性能!簡單來說就是jvm執行上面三條指令的時候,不一定是1-2-3這樣執行,有可能是1-3-2這樣執行。如果jvm是按照1-3-2來執行的話,當1-3執行完2還沒執行的時候,如果另外一個線程調用getInstance(),因為3執行了此時instance不為空,直接返回instance。問題是2還沒執行,此時instance相當於什么都沒有,肯定是有問題的。然后咧,voliate有一個特性就是禁止指令重排序,上面的三條指令是按照1-2-3執行的,這樣就沒有問題了。

       參考:https://blog.csdn.net/hnd978142833/article/details/81633730

3、volatile有什么作用?AtomiticInteger有什么作用,底層實現原理是什么?與synchronized關鍵字有什么區別?cas有什么弊端?

       關於多線程相關的知識點,volatile、AtomiticInteger、synchronized、cas問題都是高頻考點,與之相關的知識點如:重量級鎖/輕量級鎖、樂觀鎖/悲觀鎖、JMM(Java Memmory Mode Java內存模型)、用戶空間/內核空間、多線程三要素(原子性、可見性、順序性)、自旋、ABA問題等,都是需要掌握的要點。

       推薦閱讀:【死磕Synchronized底層實現

                         【面試官沒想到,volatile能吹上半個小時

                         【《吊打面試官》系列-樂觀鎖、悲觀鎖

                         【「每日知識點」什么是 CAS 機制

4、Android Log中的tag,用類名.class.getSimpleName()來獲取,會有什么弊端?

5、反射有什么作用?有什么弊端?

6、廣播底層實現機制?為什么會比AIDL方式慢?與EventBus相比有什么區別?

7、Handler如何保證每個線程只有一個looper?ThreadLocal有什么作用?

       這道題其實主要考察ThreadLocal,不了解ThreadLocal的可以閱讀博文:【朝花夕拾】Android多線程之(二)ThreadLocal篇,以及【再有人問你什么是ThreadLocal,就把這篇文章甩給他!

8、100個0~100之間的整數,實現排序

9、RxJava介紹

10、Glide介紹

11、measuredWidth和width的區別

      結論:getMeasuredWidth()獲取的是view原始的大小,也就是這個view在XML文件中配置或者是代碼中設置的大小。getWidth()獲取的是這個view最終顯示的大小,這個大小有可能等於原始的大小也有可能不等於原始大小。

      推薦閱讀:【android中getWidth()和getMeasuredWidth()之間的區別

12、SparseArray介紹,為什么能提高性能

13、MVP與MVVM的區別,MVVM的實現方式

14、分享時,Android N開始對url做了什么限制?

15、HashSet介紹

16、軟引用和弱引用的區別,什么時候會GC?System.gc()的時候系統會立即回收系統垃圾嗎?

17、Exception和Error有什么區別?Error能被捕捉嗎?OOM Error能被捕捉嗎?

18、Sharepreference commit()和apply()的區別。Sharepreference進程安全嗎?線程安全嗎?

19、500x500的png圖片所占的內存大小。同一張圖片在xxdpi-drawable和drawable中誰占用的內存更大,大多少?

20、RecyclerView與ListView的區別。

大體上這記得么多,面試官會根據回答的內容進一步深入提問,讀者可以在該知識點上進一步拓展。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM