阿里P5-基礎知識

2020-10-05 01:00:24

阿里P5-基礎知識

1.Try…catch…finally 執行中,在 try 或 catch程式碼塊中return還會執行finally程式碼?
答案首先是肯定的,因為Try…catch…finally程式碼塊裡的finally子句裡的語句是一定會被執行的。只是在finally子句的語句會對整個程式碼塊的執行結果會有影響嗎?會有的,主要有兩大類情況:
a.finally中最好不要包含return,否則程式會提前退出,返回值不是try或catch中儲存的返回值。
b.如果finally中沒有return語句,但是改變了要返回的值,這裡有點類似與參照傳遞和值傳遞的區別,分以下兩種情況:
1)如果return的資料是基本資料型別或文字字串,則在finally中對該基本資料的改變不起作用,try中的return語句依然會返回進入finally塊之前保留的值。
2)如果return的資料是參照資料型別,而在finally中對該參照資料型別的屬性值的改變起作用,try中的return語句返回的就是在finally中改變後的該屬性的值。
2. Interface與abstract類的區別
含有abstract修飾符的class即為抽象類,abstract 類不能建立的範例物件。含有abstract方法的類必須定義為abstract class,abstract class類中的方法不必是抽象的。abstract class類中定義抽象方法必須在具體子類中實現,所以,不能有抽象構造方法或抽象靜態方法。如果的子類沒有實現抽象父類別中的所有抽象方法,那麼子類也必須定義為abstract型別。
  介面(interface)可以說成是抽象類的一種特例,介面中的所有方法都必須是抽象的。介面中的方法定義預設為public abstract型別,介面中的成員變數型別預設為public static final。
  
  介面和抽象類的概念不一樣。介面是對動作的抽象,抽象類是對根源的抽象。抽象類表示的是,這個物件是什麼。介面表示的是,這個物件能做什麼。比如,男人,女人,這兩個類(如果是類的話……),他們的抽象類是人。說明,他們都是人.人可以吃東西,狗也可以吃東西,你可以把「吃東西」定義成一個介面,然後讓這些類去實現它.所以,在高階語言上,一個類只能繼承一個類(抽象類)(正如人不可能同時是生物和非生物),但是可以實現多個介面(吃飯介面、走路介面)。

第一點. 介面是抽象類的變體,介面中所有的方法都是抽象的。而抽象類是宣告方法的存在而不去實現它的類。
第二點. 介面可以多繼承,抽象類不行
第三點. 介面定義方法,不能實現,而抽象類可以實現部分方法。
第四點. 介面中基本資料型別為static 而抽類象不是的。

當你關注一個事物的本質的時候,用抽象類;當你關注一個操作的時候,用介面。在應用上的區別:介面更多的是在系統架構設計方法發揮作用,主要用於定義模組之間的通訊契約。而抽象類在程式碼實現方面發揮作用,可以實現程式碼的重用,例如,模板方法設計模式是抽象類的一個典型應用,假設某個專案的所有Servlet類都要用相同的方式進行許可權判斷、記錄存取紀錄檔和處理異常,那麼就可以定義一個抽象的基礎類別,讓所有的Servlet都繼承這個抽象基礎類別,在抽象基礎類別的service方法中完成許可權判斷、記錄存取紀錄檔和處理異常的程式碼,在各個子類中只是完成各自的業務邏輯程式碼。
3.final 、static在 java 中有什麼作用?
final作為Java中的關鍵字可以用於三個地方。用於修飾類、類屬性和類方法。
特徵:凡是參照final關鍵字的地方皆不可修改!
(1)修飾類:表示該類不能被繼承;
(2)修飾方法:表示方法不能被重寫;
(3)修飾變數:表示變數只能一次賦值以後值不能被修改(常數)。

當final修飾的是一個基本資料型別資料時, 這個資料的值在初始化後將不能被改變; 當final修飾的是一個參照型別資料時, 也就是修飾一個物件時, 參照在初始化後將永遠指向一個記憶體地址, 不可修改. 但是該記憶體地址中儲存的物件資訊, 是可以進行修改的.

static一般表示「靜態」的意思,可修飾成員變數和方法,也可形成靜態static程式碼塊。另外注意Java中沒有全域性變數的概念。被static修飾的成員變數或方法獨立於該類的物件,只要該類被載入,可以在物件建立即範例化之前存取。
靜態變數
被static修飾的變數即為靜態變數,當JVM載入類後,可以通過類名直接存取,類的所有範例共用一個static變數。
靜態方法
靜態方法可以直接通過類名呼叫,但是不能直接存取所屬類的範例變數和方法,只能存取所屬類的靜態變數和方法,這是因為範例成員只與特定物件關聯。
靜態程式碼塊
為類中獨立於類成員的static語句塊,不在任何方法體內,當JVM載入類時,就會執行靜態程式碼塊,無需等待範例化,static語句塊可以多個,JVM會按照它們的先後順序依次執行。
static和final一起時有什麼作用 ?
static final一起使用修飾成員變數或方法時,可以理解為「全域性常數」,均可通過類名直接存取。
4.String、StringBuffer、StringBulider它們之間有什麼區別?
詳見:https://blog.csdn.net/itchuxuezhe_yang/article/details/89966303
5.BIO、NIO、AIO 有什麼區別?
BIO表示同步阻塞式IO,伺服器實現模式為一個連線一個執行緒,即使用者端有連線請求時伺服器端就需要啟動一個執行緒進行處理,如果這個連線不做任何事情會造成不必要的執行緒開銷,當然可以通過執行緒池機制改善。

NIO表示同步非阻塞IO,伺服器實現模式為一個請求一個執行緒,即使用者端傳送的連線請求都會註冊到多路複用器上,多路複用器輪詢到連線有I/O請求時才啟動一個執行緒進行處理。

AIO表示非同步非阻塞IO,伺服器實現模式為一個有效請求一個執行緒,使用者端的I/O請求都是由作業系統先完成IO操作後再通知伺服器應用來啟動執行緒進行處理。

應用場景:
BIO適用於連線數目比較小且固定的架構,該方式對伺服器資源要求比較高,JDK 1.4以前的唯一選擇。
NIO適用於連線數目多且連線比較短(輕操作)的架構,如聊天伺服器,程式設計複雜,JDK 1.4開始支援,如在Netty框架中使用。
AIO適用於連線數目多且連線比較長(重操作)的架構,如相簿伺服器,充分呼叫作業系統參與並行操作,程式設計複雜,JDK 1.7開始支援。
備註:在大多數場景下,不建議直接使用JDK的NIO類庫(門檻很高),除非精通NIO程式設計或者有特殊的需求。在絕大多數的業務場景中,可以使用NIO框架Netty來進行NIO程式設計,其既可以作為使用者端也可以作為伺服器端,且支援UDP和非同步檔案傳輸,功能非常強大。
補充:
同步IO和非同步IO:
IO操作主要分為兩個步驟,即發起IO請求和實際IO操作,同步IO與非同步IO的區別就在於第二個步驟是否阻塞。
若實際IO操作阻塞請求程序,即請求程序需要等待或者輪詢檢視IO操作是否就緒,則為同步IO。
若實際IO操作並不阻塞請求程序,而是由作業系統來進行實際IO操作並將結果返回,則為非同步IO。
阻塞IO和非阻塞IO
IO操作主要分為兩個步驟,即發起IO請求和實際IO操作,阻塞IO與非阻塞IO的區別就在於第一個步驟是否阻塞。
若發起IO請求後請求執行緒一直等待實際IO操作完成,則為阻塞IO。
若發起IO請求後請求執行緒返回而不會一直等待,即為非阻塞IO。

同步,就是我呼叫一個功能,該功能沒有結束前,我死等結果。
非同步,就是我呼叫一個功能,不需要知道該功能結果,該功能有結果後通知我(回撥通知)。
阻塞,就是呼叫我(函數),我(函數)沒有接收完資料或者沒有得到結果之前,我不會返回。
非阻塞,就是呼叫我(函數),我(函數)立即返回,通過select通知呼叫者