MO_or查漏補缺之Java基礎篇

java_se.png

1. == 和 equals() 的區別是什麼?

== 的做用:
  • 基本數據類型:判斷值是否相等
  • 引用數據類型:判斷引用地址是否相等,String類型要單獨討論
equals() 的做用:
  • 在Object中和 == 同樣是判斷引用地址是否相等

equals object.png

  • 在String中是判斷其字符串值是否相等

equals string.png

內存模型

建立三個String對象,以下圖所示
String內存模型.pnghtml

  1. str1經過new會在堆建立一個字符串對象
  2. str2直接建立也會在堆建立一個字符串對象
  3. str3直接建立,但並不會在堆建立一個字符串對象,而是直接指向str2在堆的字符串對象。由於沒有經過new建立的String對象,會先在字符串池中去找是否已有值相等的String對象,如有則將棧指針指向堆中已有的String對象,若沒有才會在堆中建立新的String對象

2. 兩個對象的hashCode()相同,則equals()必定爲true,對嗎?爲何?

hashCode():是根據內存地址按hash算法得出的一個正數java

若equals()爲true,hashCode()也爲true
若hashCode()爲true,equals()不必定爲true,由於可能存在hash衝突(機率較低)算法

那麼hashCode在實際應用中有什麼做用呢?

以HashSet爲例確保添加的元素是不重複的:編程

  • 重寫hashCode()與equals()方法
  • 先判斷hash值是否相等,若不等,則元素不重複
  • 若hash值相等,再判斷equlas()值是否相等,如值不等則元素不重複
那麼爲何要使用hashCode呢?

若是在存儲的時候逐個equals()比較,效率較低,哈希算法提升了去重複的效率,下降了使用equals()方法的次數設計模式

3. String類的經常使用方法?

判斷功能
boolean equals(Object obj)
boolean equalsIgnoreCase(String str)
boolean isEmpty()
boolean contains(String str)
boolean startsWith(String str)
boolean endsWith(String str)
獲取功能
int length()
char charAt(int index)
int indexOf(int ch)
int indexOf(String str)
int indexOf(int ch,int fromIndex)
int indexOf(String str,int fromIndex)
String substring(int start)
String substring(int start,int end)
轉換功能
byte[] getBytes()
char[] toCharArray()
static String valueOf(char[] chs)
static String valueOf(int i)
String toLowerCase()
String toUpperCase()
String concat(String str)
其它功能
  • 替換功能
String replace(char old,char new)
String replace(String old,String new)
  • 去除字符串兩空格
String trim()
  • 按字典順序比較兩個字符串
int compareTo(String str)
int compareToIgnoreCase(String str)

4. final的做用?

修飾類

表示該類不能被繼承,請謹慎使用,若非該類已十分明確不會被繼承或出於安全方面考慮,並不建議設計爲final類安全

修飾方法

表示該方法不能被子類重寫(覆蓋),但可以被重載,即在子類中能夠建立多個與final方法方法名相同,但參數不一樣的方法
注意若父類中final方法的訪問修飾符爲private,那麼子類是不會直接繼承父類的final方法的,那麼這時在子類中建立相同的方法名與參數是不會有final衝突的服務器

修飾變量

final修飾變量是較爲常見的,也是這裏須要重點學習的部分
final修飾變量表示該變量僅能被賦值一次,賦值後值再也不改變架構

  • 當爲基本數據類型時,表示其初始化後就不能再被更改
  • 當爲引用數據類型時,表示其初始化後就不能再指向其它對象,但被指向的對象是能夠更改的,其本質是同樣的即保證棧中的地址是沒法更改的
  • 當爲成員變量時,必需要顯示初始化,即聲明變量時就初始化,或聲明變量時未初始化,但在該成員變量的類中全部構造方法(無參、有參)中賦初值
  • 當爲參數時,表示該參數只讀,只能讀取使用,但不能被更改

5. IO流分幾種?

按數據類型分:
  • 字節流:InputStream、OutputStream,任何數據類型都能支持
  • 字符流:Reader、Writer,非純文本格式數據可能會致使文件格式破壞
按數據流向分:
  • 輸入流:讀取文件數據
  • 輸出流:將數據寫入文件中
按功能分:
  • 字節流:FileInputStream、FileOutputStream,直接和源數據進行輸入輸出
  • 處理流:在字節流的基礎上進行了功能的擴展或增強,又分爲如下兩種併發

    • 轉換流:InputStreamReader、OutputStreamWriter,字節流轉字符流,字符流轉字節流
    • 緩衝流:BufferedInputStream,BufferedOutputStream   BufferedReader,BufferedReader,可對節點流經行包裝,使讀寫更快

擴展:關於緩衝流,這裏涉及到了設計模式中的裝飾者模式,其做用即基於已有功能基礎上,提供加強的功能異步

其實現思路以下:

  1. 子類繼承父類
  2. 子類中聲明一個父類類型的成員變量
  3. 經過子類中的帶參構造方法接收外部傳遞的父類類型參數,並賦值給子類的父類成員類型成員變量
  4. 在實現功能時,調用外部傳遞的父類類型參數實現原有功能,本身實現加強功能

6. BIO、NIO、AIO有什麼區別?

先結合生活場景簡單介紹下同步、異步、阻塞、非阻塞,以銀行取款爲例:

  • 同步:本身到銀行取款
  • 異步:委託別人(將各類須要的資料給別人)幫本身到銀行取款,期間本身能夠作別的,而後等別人取好給本身
  • 阻塞:在ATM排隊取款,只能站着等
  • 非阻塞:在銀行取個號,坐椅子上玩本身的,等廣播叫號到本身了就去,沒到號不能插隊,也能夠不斷問大堂經理到本身沒,若是說沒到就不能去
BIO(Blocking I/O)

同步且阻塞,服務器實現模式爲一個鏈接一個線程,即客戶端有鏈接請求時服務器端就須要啓動一個線程進行處理,若是這個鏈接不作任何事情會形成沒必要要的線程開銷,固然能夠經過線程池機制改善

BIO方式適用於鏈接數目比較小且固定的架構,這種方式對服務器資源要求比較高,併發侷限於應用中,JDK1.4之前的惟一選擇,但程序直觀簡單易理解

NIO(Non-Blocking I/O)

同步非阻塞,服務器實現模式爲一個請求一個線程,即客戶端發送的鏈接請求都會註冊到多路複用器上,多路複用器輪詢到鏈接有I/O請求時才啓動一個線程進行處理

NIO方式適用於鏈接數目多且鏈接比較短(輕操做)的架構,好比聊天服務器,併發侷限於應用中,編程比較複雜,JDK1.4開始支持

AIO(Asynchronous I/O)

異步非阻塞,服務器實現模式爲一個有效請求一個線程,客戶端的I/O請求都是由OS先完成了再通知服務器應用去啓動線程進行處理

AIO方式使用於鏈接數目多且鏈接比較長(重操做)的架構,好比相冊服務器,充分調用OS參與併發操做,編程比較複雜,JDK7開始支持

擴展:Netty爲何使用NIO而不是AIO?

Netty不看重Windows上的使用,在Linux系統上,AIO的底層實現仍使用EPOLL,沒有很好實現AIO,所以在性能上沒有明顯的優點,並且被JDK封裝了一層不容易深度優化

參考:爲何Netty使用NIO而不是AIO?

7. Files的經常使用方法?

Files.read()    讀取文件
Files.write()   寫入文件
Files.exists()  檢測文件路徑是否存在
Files.createFile()  建立文件
Files.createDirectory() 建立文件夾
Files.delete()  刪除文件或者目錄
Files.copy()    複製文件
Files.move()    移動文件
Files.size()    查看文件個數

8. abstract的做用?

抽象類
  1. public abstract class ClassName{}
  2. 抽象類不能被實例化,只有非抽象子類能夠被實例化
  3. 抽象類能夠有本身的構造方法
  4. 抽象類不一樣於接口,接口的接口方法是不容許實現的,但抽象類中普通方法能夠被實現
  5. 抽象類不能用final關鍵字來形容,由於final修飾類表示該類不能被繼承,但抽象類須要子類來實現抽象方法
  6. 抽象類中能夠沒有抽象方法,但只要有一個抽象方法,就必定是抽象類
  7. 繼承了抽象類的子類必須所有重寫抽象類的方法,只有子類也爲抽象類時才能夠不用所有重寫
  8. 一個類只能單繼承抽象類,但能夠實現多個接口類
抽象方法
  1. 抽象方法相似與接口中的方法,是不容許在抽象類中實現的,只能由子類來實現
  2. 抽象方法的訪問修飾符不能用private,由於private表示只有本類能夠調用,而抽象方法須要子類來實現
  3. 抽象方法不能使用static關鍵字,由於static修飾方法,能夠直接經過類名進行調用,但抽象類是不能實例化的
相關文章
相關標籤/搜索