Java 基礎知識

引言

下面都是我對java基礎知識的集錦,查看詳細的內容請參照下面的技術文章。

重載和重寫的區別

重載: 發生在同一個類中,方法名必須相同,參數類型不同、個數不同、順序不同,方法返回值和訪問修飾符可以不同,發生在編譯時。   
重寫: 發生在父子類中,方法名、參數列表必須相同,返回值範圍小於等於父類,拋出的異常範圍小於等於父類,訪問修飾符範圍大於等於父類;如果父類方法訪問修飾符爲 private 則子類就不能重寫該方法。

String 和 StringBuffer、StringBuilder 的區別是什麼?String 爲什麼是不可變的?

  1. 可變性

String 類中使用 final 關鍵字字符數組保存字符串,private final char value[],所以 String 對象是不可變的。
StringBuilderStringBuffer 都繼承自 AbstractStringBuilder 類,在 AbstractStringBuilder 中也是使用字符數組保存字符串char[]value 但是沒有用 final 關鍵字修飾,所以這兩種對象都是可變的。

  1. 線程安全性

String 中的對象是不可變的,也就可以理解爲常量,線程安全。
StringBuffer 對方法加了同步鎖或者對調用的方法加了同步鎖,所以是線程安全的。
StringBuilder 並沒有對方法進行加同步鎖,所以是非線程安全的。

  1. 性能

每次對 String 類型進行改變的時候,都會生成一個新的 String 對象,然後將指針指向新的 String 對象。
StringBuffer 每次都會對 StringBuffer 對象本身進行操作,而不是生成新的對象並改變對象引用。
相同情況下使用 StirngBuilder 相比使用 StringBuffer 僅能獲得 10%~15% 左右的性能提升,但卻要冒多線程不安全的風險。

  1. 總結

操作少量的數據 = 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關鍵字主要用在三個地方:變量、方法、類

  1. final變量

如果是基本數據類型的變量,則其數值一旦在初始化之後便不能更改;
如果是引用類型的變量,則在對其初始化之後便不能再讓其指向另一個對象。

  1. final修飾一個類

表明這個類不能被繼承。final類中的所有成員方法都會被隱式地指定爲final方法。

  1. final方法

使用final方法的原因有兩個。
第一個原因是把方法鎖定,以防任何繼承類修改它的含義;
第二個原因是效率。在早期的Java實現版本中,會將final方法轉爲內嵌調用。類中所有的private方法都隱式地指定爲final。

Java 集合框架

在這裏插入圖片描述
具體查看我的博客:https://blog.csdn.net/weixin_43287508/article/details/86701981

Arraylist 與 LinkedList 異同

  1. 是否保證線程安全: ArrayListLinkedList 都是不同步的,也就是不保證線程安全;
  2. 底層數據結構: Arraylist 底層使用的是Object數組;LinkedList 底層使用的是雙向循環鏈表數據結構;
  3. 插入和刪除是否受元素位置的影響: ① ArrayList 採用數組存儲,所以插入和刪除元素的時間複雜度受元素位置的影響。② LinkedList 採用鏈表存儲,所以插入,刪除元素時間複雜度不受元素位置的影響。
  4. 是否支持快速隨機訪問: LinkedList 不支持高效的隨機元素訪問,而ArrayList 實現了RandmoAccess 接口,所以有隨機訪問功能。
  5. 內存空間佔用: ArrayList的空 間浪費主要體現在在list列表的結尾會預留一定的容量空間,而LinkedList的空間花費則體現在它的每一個元素都需要消耗比ArrayList更多的空間(因爲要存放直接後繼和直接前驅以及數據)。

ArrayList 與 Vector 區別

Vector類的所有方法都是同步的。可以由兩個線程安全地訪問一個Vector對象、但是一個線程訪問Vector的話代碼要在同步操作上耗費大量的時間。
Arraylist不是同步的,所以在不需要保證線程安全時時建議使用Arraylist

List接口下一共實現了三個類:ArrayList,Vector,LinkedList。
ArrayList 主要保持數據的插入順序的時候使用,採用鏈表結構。

ArrayListVector主要區別爲以下幾點:

  1. Vector是線程安全的,源碼中有很多的synchronized可以看出,而ArrayList不是。導致Vector效率無法和ArrayList相比;
  2. ArrayListVector都採用線性連續存儲空間,當存儲空間不足的時候,ArrayList默認增加爲原來的50%,Vector默認增加爲原來的一倍;

HashMap 和 Hashtable 的區別

  1. 線程是否安全:

HashMap 是非線程安全的,HashTable 是線程安全的;HashTable 內部的方法基本都經過 synchronized 修飾。HashMap 是非線程安全的。

  1. 效率:

因爲線程安全的問題,HashMap 要比 HashTable 效率高一點。另外,HashTable 基本被淘汰,不要在代碼中使用它;

  1. 對Null key 和Null value的支持:

HashMap 中,null 可以作爲鍵,這樣的鍵只有一個,可以有一個或多個鍵所對應的值爲 null。但是在 HashTable 中 put 進的鍵值只要有一個 null,直接拋出 NullPointerException。

  1. 初始容量大小和每次擴充容量大小的不同 :

①創建時如果不指定容量初始值,Hashtable 默認的初始大小爲11,之後每次擴充,容量變爲原來的2n+1。HashMap 默認的初始化大小爲16。之後每次擴充,容量變爲原來的2倍。

  1. 底層數據結構:

JDK1.8 以後的 HashMap 在解決哈希衝突時有了較大的變化,當鏈表長度大於閾值(默認爲8)時,將鏈表轉化爲紅黑樹,以減少搜索時間。Hashtable 沒有這樣的機制。

HashSet 和 HashMap 區別

看過 HashSet 源碼的話就應該知道:HashSet 底層就是基於 HashMap 實現的。
在這裏插入圖片描述

HashMap

  1. HashMap實現了Map接口
  2. HashMap儲存鍵值對
  3. 使用put()方法將元素放入map中
  4. HashMap中使用鍵對象來計算hashcode值
  5. HashMap比較快,因爲是使用唯一的鍵來獲取對象

HashSet

  1. HashSet實現了Set接口
  2. HashSet僅僅存儲對象
  3. 使用add()方法將元素放入set中
  4. HashSet使用成員對象來計算hashcode值,對於兩個對象來說hashcode可能相同,所以equals()方法用來判斷對象的相等性,如果兩個對象不同的話,那麼返回false
  5. HashSet較HashMap來說比較慢

ArrayList和LinkedList的區別

  1. ArrayList是實現了基於動態數組的數據結構,LinkedList基於鏈表的數據結構。
  2. 對於隨機訪問get和set,ArrayList覺得優於LinkedList,因爲LinkedList要移動指針。
  3. 對於新增和刪除操作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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章