========= 基礎 =========
1、封裝、多態和繼承
https://blog.csdn.net/qq_22118507/article/details/51422591
封裝:爲了安全、私有化屬性、提供 get/set方法對外訪問
繼承:複用代碼,繼承父類的方法和屬性,也可以自己擴展
多態:可維護性和擴展性強,條件是重寫和繼承
2、final class 和 static
3、抽象類和接口
https://www.zhihu.com/question/20149818
https://blog.csdn.net/high2011/article/details/49467341
相同:都有抽象方法、都不能被實例化
不同:
4、Java 虛擬機、GC算法
https://blog.csdn.net/high2011/article/details/80177473
5、數據結構:數組、集合、堆棧、一對一(鏈表、隊列)、一對多(樹)、多對多(圖)
https://blog.fundebug.com/2018/08/27/code-interview-data-structure/
6、方法重寫和重載
7、併發和並行
https://blog.csdn.net/high2011/article/details/76480593
8、Java 的數據類型
基本類型 + 引用類型
9、Java Map 、List 、Set區別
10、String 、 StringBuffer 和 StringBuider 的區別
(1)STRING的長度是不可變的,STRINGBUFFER的長度是可變的。
(2)如果你對字符串中的內容經常進行操作,特別是內容要修改時,那麼使用StringBuffer,如果最後需要String,那麼使用StringBuffer的toString()方法
(3)StringBuffer 線程安全,StringBuider線程不安全,但是快
11、多線程實現方式
3種:Thread、Runable和 Callable
12、如何避免 hashCode爲負值
與16進制的最高位爲0 的數據做 & 計算
https://blog.csdn.net/high2011/article/details/78851556
13、i++ 和 ++i 的區別
https://blog.csdn.net/high2011/article/details/79186604
14、Java Comparable 和 Comparator
https://blog.csdn.net/high2011/article/details/77336336
15、屬性添加 transient
@Transient表示該屬性字段的生命週期僅存於調用者的內存中而不會寫到磁盤裏持久化
https://www.cnblogs.com/birkhoff/p/5377857.html
16、位運算
17、Java IO
mkdir和mkdirs有什麼區別
18、寫字節文件和寫字符文件使用的流,舉例一個
(1)寫字符文件
new BufferedWriter(new FileWriter(filePath,false)).write("---------")
(2)寫字節文件
- public static void main(String[] args) throws Exception {
- // 指定要讀取文件的緩衝輸入字節流
- BufferedInputStream in = new BufferedInputStream(new FileInputStream("F:\\test.jpg"));
- File file = new File("E:\\test.jpg");
- if (file != null) {
- file.createNewFile();
- }
- // 指定要寫入文件的緩衝輸出字節流
- BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(file));
- byte[] bb = new byte[1024];// 用來存儲每次讀取到的字節數組
- int n;// 每次讀取到的字節數組的長度
- while ((n = in.read(bb)) != -1) {
- out.write(bb, 0, n);// 寫入到輸出流
- }
- out.close();// 關閉流
- in.close();
- }
19、垃圾收集過程的簡單描述
當Eden已滿時,在Eden上運行次要GC,並將從Eden和Survivor 1中存活的物件複製到Survivor 2。Survivor區域被交換。如果對象足夠舊或Survivor2已滿,則將其移至Old。最後,當Old接近滿時,將調用完整的GC
20、Java 查看年輕代、老年代內存的命令
https://blog.csdn.net/high2011/article/details/80449719
jmap -heap [pid]
jstat -gc pid 毫秒 次數
jstat -gcutil pid
========= 進階 =========
1、== 和 equals的區別
- == 針對 基本數據類型比較
- equals 針對 引用類型的比較,在內存中的地址是否相同,值是否相同
2、 final/finally/finalize的區別
- final 用於聲明屬性,方法和類, 分別表示屬性不可變, 方法不可覆蓋, 類不可繼承.
- finally 是異常處理語句結構的一部分,表示總是執行.
- finalize 是Object類的一個方法,在垃圾收集器執行的時候會調用被回收對象的此方法,可以覆蓋此方法提供垃圾收集時的其他資源回收,例如關閉文件等. JVM不保證此方法總被調用.
3、反射機制
http://wiki.jikexueyuan.com/project/java-interview-question/java/reflection.html
JAVA反射機制是在運行狀態中
- 對於任意一個類, 都能夠知道這個類的所有屬性和方法;
- 對於任意一個對象, 都能夠調用它的任意一個方法和屬性;
- 這種動態獲取的信息以及動態調用對象的方法的功能稱爲java語言的反射機制.
主要作用有三
- 運行時取得類的方法和字段的相關信息。
- 創建某個類的新實例(.newInstance())
- 取得字段引用直接獲取和設置對象字段,無論訪問修飾符是什麼。
用處如下
- 觀察或操作應用程序的運行時行爲。
- 調試或測試程序,因爲可以直接訪問方法、構造函數和成員字段。
- 通過名字調用不知道的方法並使用該信息來創建對象和調用方法。
4、類加載過程
https://blog.csdn.net/javazejian/article/details/73413292
https://blog.csdn.net/eff666/article/details/52203406
加載->鏈接(驗證+準備+解析)->初始化(使用前的準備)->使用->卸載
5、JVM 組成
https://blog.csdn.net/lzm1340458776/article/details/44153825
6、實現單例模式
餓漢、懶漢、登記模式,一般使用 懶漢式
https://jifei-yang.blog.csdn.net/article/details/49905189
7、List、Map和 Set 的遍歷方式
8、Java 裝箱和拆箱
https://blog.csdn.net/high2011/article/details/48711407