一、網絡
1、https原理
2、tcp/ip協議
三次握手:https://www.cnblogs.com/cenglinjinran/p/8482412.html
四次揮手:https://www.zhihu.com/question/63264012
二、多線程
java基礎知識相關
Android相關
1、從點擊一個圖標到這個應用啟動的全過程
https://blog.csdn.net/freekiteyu/article/details/79318031
性能優化
https://www.jianshu.com/p/797395731747
三、第三方插件
1、ProtoBuffer
2、EventBus
https://www.jianshu.com/p/e7d5c7bda783
https://www.jianshu.com/p/d9516884dbd4
https://baike.baidu.com/item/EventBus/20461274?fr=aladdin
ThreadLocal、ThreadLocal內存泄漏問題
HashMap,ConcurrentHashMap
反射
注解
3、ButterKnife
和androidx沖突問題,R2代替R
4、Retrofit
官網:https://square.github.io/retrofit/
與OkHttp的區別:定位不一樣,OkHttp功能更強更多,而Retrofit是對OkHttp的進一步封裝和增減,使其使用更安全,更方便
四、jetpack
1、RecyclerView
緩存問題
多種布局問題:https://www.jianshu.com/p/66702b7a6881
刷新界面問題
空數據界面顯示問題:RecyclerView設置空數據視圖
2、ConstraintLayout
https://www.jianshu.com/p/17ec9bd6ca8a
五、java基礎
1、反射
(1)java反射機制是什么?
java反射機制是一種在程序運行狀態下,動態獲取或者調用類或對象的方法、字段等所有成員信息的功能。
其本質就是在得到指定類X的Class(Class對象)后,根據該Class對象反向獲取類X的各種信息。當X.java被編譯后生成X.class文件,當程序運行時,JVM會在磁盤中尋找X.class文件並加載到JVM內存中為其分配內存空間,同時JVM會自動為X.class創建一個Class對象,在ClassLoader中,有且只有一個X類的Class對象。
(2)為什么要使用反射(使用反射有什么好處)?
1)可以動態編譯,在運行期才確定類型,體現java的靈活性。比如某個類“A”由同伴開發,但沒有開發完,而我需要預先寫道代碼中,如果直接通過new A()的給方式,編譯肯定會報錯,但使用Class.forName("A")這樣的反射方式就可以通過編譯,不影響自己開發和編譯。由於Class.forName("...")中的參數是字符串,可以將該字符串寫入配置文件,通過I/O的方式讀取,這樣就可以通過修改配置文件來控制加載哪個類了,java中的Spring就有很多這種操作。
2)可以訪問類中用private修飾的字段、方法、構造函數等成員。
3)可以對某些類/方法/字段起到“后門”作用。比如某些類方法/字段比較敏感,為了避免外部人員不小心使用到而導致某些嚴重后果,就需要“隱藏”起來(比如用private修飾),但是內部開發人員又需要用到,這時候就可以使用反射的方式來實現。因為相比於通過new的方式直接使用,反射方式會復雜一些,且需要對該敏感的類/方法/字段比較了解。(這個說法是在某教學課堂上老師講到的,聽起來挺有道理的,但其它地方好像沒聽說過這種說法)
4)可以越過泛型。比如ArrayList定義好元素的類型后,就無法添加其它類型了,但是通過反射的方式卻可以做到,可以參考后文的鏈接。
(3)反射有什么弊端?
1)性能差;原因后面有說明。為了避免這一點,有些地方通過使用注解生成器的方式將需要反射的地方提前到編譯期完成,比如EventBus就可以通過選擇使用注解生成器來實現這一點。有個比較有名的java反射框架jOOR,可以了解一下。
2)會破壞一些類的安全性。上面的第2)和第3)點也說到了,可以使用private修飾的成員等這些不太希望被“外人”使用的功能。
(4)反射為什么性能差?
沒找到權威答案,網上零零星星收集了一些(參考https://www.zhihu.com/question/19826278):
1)jvm無法優化反射相關得代碼;
2)動態加載,原本在編譯期做的事,等到運行期才做;
3)反射的具體邏輯是委托給MethodAccessor實現,而該類需要在第一次調用invoke時才會實例化對象,是一種lazy init;
4)method.invoke方法,每次調用時都需要對參數進行數組包裝;
5)method.invoke方法中要對方法的可見性做檢查;
6)MethodAccessor對象實現反射有兩種方式:開始15次是native方式,以后是java方式。在使用java方式時,其invoke方法中要檢查參數的類型匹配。
2、面向對象
(1)面向對象的三大特性:封裝、繼承、多態;
多態:1)重寫,override,子類覆蓋父類的方法;重載,overload,同一個類中方法名相同,參數必須不同,返回值、修飾符可以不同。