引言
下面都是我對java基礎知識的集錦,查看詳細的內容請參照下面的技術文章。
重載和重寫的區別
重載: 發生在同一個類中,方法名必須相同,參數類型不同、個數不同、順序不同,方法返回值和訪問修飾符可以不同,發生在編譯時。
重寫: 發生在父子類中,方法名、參數列表必須相同,返回值範圍小於等於父類,拋出的異常範圍小於等於父類,訪問修飾符範圍大於等於父類;如果父類方法訪問修飾符爲 private 則子類就不能重寫該方法。
String 和 StringBuffer、StringBuilder 的區別是什麼?String 爲什麼是不可變的?
- 可變性
String 類中使用 final 關鍵字字符數組保存字符串,private final char value[],所以 String 對象是不可變的。
StringBuilder 與 StringBuffer 都繼承自 AbstractStringBuilder 類,在 AbstractStringBuilder 中也是使用字符數組保存字符串char[]value 但是沒有用 final 關鍵字修飾,所以這兩種對象都是可變的。
- 線程安全性
String 中的對象是不可變的,也就可以理解爲常量,線程安全。
StringBuffer 對方法加了同步鎖或者對調用的方法加了同步鎖,所以是線程安全的。
StringBuilder 並沒有對方法進行加同步鎖,所以是非線程安全的。
- 性能
每次對 String 類型進行改變的時候,都會生成一個新的 String 對象,然後將指針指向新的 String 對象。
StringBuffer 每次都會對 StringBuffer 對象本身進行操作,而不是生成新的對象並改變對象引用。
相同情況下使用 StirngBuilder 相比使用 StringBuffer 僅能獲得 10%~15% 左右的性能提升,但卻要冒多線程不安全的風險。
- 總結:
操作少量的數據 = String
單線程操作字符串緩衝區下操作大量數據 = StringBuilder
多線程操作字符串緩衝區下操作大量數據 = StringBuffer
自動裝箱與拆箱
裝箱:將基本類型用它們對應的引用類型包裝起來;
拆箱:將包裝類型轉換爲基本數據類型;
具體查看我的博客:https://blog.csdn.net/weixin_43287508/article/details/86704036
== 與 equals
== 比較運算符,它的作用是判斷兩個對象的地址是不是相等。
即,判斷兩個對象是不是同一個對象。
(基本數據類型比較的是值,引用數據類型比較的是內存地址)
equals() : 它的作用也是判斷兩個對象是否相等。但它一般有兩種使用情況:
情況1:類沒有覆蓋 equals() 方法。則通過 equals() 比較該類的兩個對象時,等價於通過“==”比較這兩個對象。
情況2:類覆蓋了 equals() 方法。一般,我們都覆蓋 equals() 方法來兩個對象的內容相等;
說明:String 中的 equals 方法是被重寫過的,因爲 object 的 equals 方法是比較的對象的內存地址,而 String 的 equals 方法比較的是對象的值。
具體查看我的博客:https://blog.csdn.net/weixin_43287508/article/details/86702352
關於 final 關鍵字的一些總結
final關鍵字主要用在三個地方:變量、方法、類。
- final變量
如果是基本數據類型的變量,則其數值一旦在初始化之後便不能更改;
如果是引用類型的變量,則在對其初始化之後便不能再讓其指向另一個對象。
- final修飾一個類
表明這個類不能被繼承。final類中的所有成員方法都會被隱式地指定爲final方法。
- final方法
使用final方法的原因有兩個。
第一個原因是把方法鎖定,以防任何繼承類修改它的含義;
第二個原因是效率。在早期的Java實現版本中,會將final方法轉爲內嵌調用。類中所有的private方法都隱式地指定爲final。
Java 集合框架
具體查看我的博客:https://blog.csdn.net/weixin_43287508/article/details/86701981
Arraylist 與 LinkedList 異同
- 是否保證線程安全: ArrayList 和 LinkedList 都是不同步的,也就是不保證線程安全;
- 底層數據結構: Arraylist 底層使用的是Object數組;LinkedList 底層使用的是雙向循環鏈表數據結構;
- 插入和刪除是否受元素位置的影響: ① ArrayList 採用數組存儲,所以插入和刪除元素的時間複雜度受元素位置的影響。② LinkedList 採用鏈表存儲,所以插入,刪除元素時間複雜度不受元素位置的影響。
- 是否支持快速隨機訪問: LinkedList 不支持高效的隨機元素訪問,而ArrayList 實現了RandmoAccess 接口,所以有隨機訪問功能。
- 內存空間佔用: ArrayList的空 間浪費主要體現在在list列表的結尾會預留一定的容量空間,而LinkedList的空間花費則體現在它的每一個元素都需要消耗比ArrayList更多的空間(因爲要存放直接後繼和直接前驅以及數據)。
ArrayList 與 Vector 區別
Vector類的所有方法都是同步的。可以由兩個線程安全地訪問一個Vector對象、但是一個線程訪問Vector的話代碼要在同步操作上耗費大量的時間。
Arraylist不是同步的,所以在不需要保證線程安全時時建議使用Arraylist。
List接口下一共實現了三個類:ArrayList,Vector,LinkedList。
ArrayList 主要保持數據的插入順序的時候使用,採用鏈表結構。
ArrayList,Vector主要區別爲以下幾點:
- Vector是線程安全的,源碼中有很多的synchronized可以看出,而ArrayList不是。導致Vector效率無法和ArrayList相比;
- ArrayList和Vector都採用線性連續存儲空間,當存儲空間不足的時候,ArrayList默認增加爲原來的50%,Vector默認增加爲原來的一倍;
HashMap 和 Hashtable 的區別
- 線程是否安全:
HashMap 是非線程安全的,HashTable 是線程安全的;HashTable 內部的方法基本都經過 synchronized 修飾。HashMap 是非線程安全的。
- 效率:
因爲線程安全的問題,HashMap 要比 HashTable 效率高一點。另外,HashTable 基本被淘汰,不要在代碼中使用它;
- 對Null key 和Null value的支持:
HashMap 中,null 可以作爲鍵,這樣的鍵只有一個,可以有一個或多個鍵所對應的值爲 null。但是在 HashTable 中 put 進的鍵值只要有一個 null,直接拋出 NullPointerException。
- 初始容量大小和每次擴充容量大小的不同 :
①創建時如果不指定容量初始值,Hashtable 默認的初始大小爲11,之後每次擴充,容量變爲原來的2n+1。HashMap 默認的初始化大小爲16。之後每次擴充,容量變爲原來的2倍。
- 底層數據結構:
JDK1.8 以後的 HashMap 在解決哈希衝突時有了較大的變化,當鏈表長度大於閾值(默認爲8)時,將鏈表轉化爲紅黑樹,以減少搜索時間。Hashtable 沒有這樣的機制。
HashSet 和 HashMap 區別
看過 HashSet 源碼的話就應該知道:HashSet 底層就是基於 HashMap 實現的。
HashMap
- HashMap實現了Map接口
- HashMap儲存鍵值對
- 使用put()方法將元素放入map中
- HashMap中使用鍵對象來計算hashcode值
- HashMap比較快,因爲是使用唯一的鍵來獲取對象
HashSet
- HashSet實現了Set接口
- HashSet僅僅存儲對象
- 使用add()方法將元素放入set中
- HashSet使用成員對象來計算hashcode值,對於兩個對象來說hashcode可能相同,所以equals()方法用來判斷對象的相等性,如果兩個對象不同的話,那麼返回false
- HashSet較HashMap來說比較慢
ArrayList和LinkedList的區別
- ArrayList是實現了基於動態數組的數據結構,LinkedList基於鏈表的數據結構。
- 對於隨機訪問get和set,ArrayList覺得優於LinkedList,因爲LinkedList要移動指針。
- 對於新增和刪除操作add和remove,LinedList比較佔優勢,因爲ArrayList要移動數據。
具體查看我的博客:https://blog.csdn.net/weixin_43287508/article/details/87002475
集合框架底層數據結構
Collection
- List
Arraylist: Object數組
Vector: Object數組
LinkedList: 雙向循環鏈表
- Set
HashSet(無序,唯一): 基於 HashMap 實現的,底層採用 HashMap 來保存元素
LinkedHashSet: LinkedHashSet 繼承與 HashSet,並且其內部是通過 LinkedHashMap 來實現的。
TreeSet(有序,唯一): 紅黑樹(自平衡的排序二叉樹。)
Map
HashMap:HashMap由數組+鏈表組成的,數組是HashMap的主體。
LinkedHashMap: LinkedHashMap 繼承自 HashMap,底層是基於拉鍊式散列結構即由數組和鏈表或紅黑樹組成。
HashTable: 數組+鏈表組成的,數組是 HashMap 的主體,鏈表則是主要爲了解決哈希衝突而存在的
TreeMap: 紅黑樹(自平衡的排序二叉樹)
具體查看我的博客:https://blog.csdn.net/weixin_43287508/article/details/86704594
Java多線程
①悲觀鎖和樂觀鎖
具體查看我的博客:https://blog.csdn.net/weixin_43287508/article/details/86704174
②synchronized和lock區別以及volatile和synchronized的區別
③可重入鎖與非可重入鎖的區別
④多線程是解決什麼問題的
⑤線程池解決什麼問題
⑥線程池的原理
⑦線程池使用時的注意事項
⑧AQS原理
⑨ReentranLock源碼
具體查看我的博客:https://blog.csdn.net/weixin_43287508/article/details/86704174
Java虛擬機
關於Java虛擬機的知識點有:
①Java內存區域
②虛擬機垃圾算法
③虛擬機垃圾收集器
④JVM內存管理
⑤JVM調優。
具體查看我的博客:https://blog.csdn.net/weixin_43287508/article/details/86688014
設計模式
手寫一個單例模式(注意單例模式的幾種不同的實現方法)
或者讓你說一下某個常見的設計模式在你的項目中是如何使用的,
抽象工廠和工廠方法模式的區別、工廠模式的思想。
代理模式、觀察者模式、(抽象)工廠模式這三個設計模式也很重要。
具體查看我的博客:https://blog.csdn.net/weixin_43287508/article/details/86611916