1. 程式人生 > >Java程式猿想超神,我來回答這些問題(java基礎)

Java程式猿想超神,我來回答這些問題(java基礎)

1、例項方法和靜態方法有什麼不一樣?
例項方法是物件方法,由物件呼叫,在使用使用時方法才會被載入進記憶體
靜態方法是在類被載入是被載入進記憶體,由類名直接進行呼叫
所以在靜態的方法中只可以呼叫靜態的方法或成員,因為靜態方法的載入時間早於物件建立,所以在靜態方法載入時,非靜態方法還不存在呢,所以不可以呼叫
參考:https://blog.csdn.net/biaobiaoqi/article/details/6732117

2、Java中的異常有哪幾類?分別怎麼使用?
java標準庫中見了一些通用的異常,以Throwable為頂層父類,分為兩大類

錯誤:Error類以及他的子類的例項,代表了JVM本身的錯誤。錯誤不能被程式設計師通過程式碼處理,Error很少出現。

異常:Exception以及他的子類,代表程式執行時傳送的各種不期望發生的事件。可以被Java異常處理機制使用,是異常處理的核心
這裡寫圖片描述
根據Javac對異常的處理,可以分兩類:
非檢查異常:Error 和RuntimeException以及他們的子類,這些錯誤在編譯時不會報錯,一般是由於程式碼問題造成的
檢查異常:IOException對於程式碼執行環境可能產生的報錯
參考:https://blog.csdn.net/qq_34309305/article/details/79202929

3、常用的集合類有哪些?比如List如何排序?
List,map,set
set、list繼承自Collection類,是一組物件的集合,Set是一組無序且不重複資料的集合,list是有序且允許重複的
map則是另一類集合,以鍵值對的形式儲存
list有自己的sort()方法,允許自定義comparator介面,實現自定義排序

4、ArrayList和LinkedList內部的實現大致是怎樣的?他們之間的區別和各自適應的場景是什麼?
ArrayList是陣列實現,連續儲存,適合應用於查詢,修改操作更多的環境
LinkList是雙向連結串列實現,不連續儲存,適合應用於增加、刪除操作更多的環境
如果是在集合末尾的增刪,ArrayList會更為適合

5、記憶體溢位是怎麼回事?
記憶體溢位分為三種情況:
- Permanent Generation space異常,是指方法區用來儲存加來的Class的一些資訊,在程式執行期間屬於永久佔用的,Java的GC不會對他進行釋放(在一定的條件下也會GC,但是條件很苛刻,其上的GC主要針對執行常量池和已載入類的解除安裝),所以如果啟動的程式載入的資訊比較大,超出了這個空間的大小,就會發生溢位錯誤
- 堆溢位: 用來存放物件,由於物件太多,而造成堆溢位
- 棧溢位:用來存放方法中的變數,引數中的臨時資料
參考:

https://blog.csdn.net/ITzhangdaopin/article/details/78716180

6、ClassLoader有什麼用?
ClassLoader是類載入器,載入類到JVM中
類載入器有三種:
- Bootstrap ClassLoader 引導類載入器,是負責載入關鍵的Java類
- ExtClassLoader 擴充套件類載入器,負責載入java的擴充套件庫
- AppClassLoader 用來讀取所有的對應在java.class.path系統屬性的路徑下的類
classLoader的一個關鍵特性是雙親委託,依我現在的理解就是一個APPClassLoader查詢資源時,先看本地快取有沒有,沒有則向上(父載入器)委託,若最後BootstrapClassLoader的快取區也沒有,那邊從他指定的檔案目錄下查詢,然後逐層向下(子載入器)查詢,查詢成功則返回,這樣做避免了一個問題,是使用者是無法定義一個和java核心類一樣的類的,例如定義一個String類

7、==和equals的區別?
java中資料型別分為基本資料型別和複合資料型別
對於基本資料型別:byte,short,int,long,float,double,char,boolean,這樣使用==是直接判斷對應值是否相等
而對於複合型別:String,繼承自Object的類,它在判斷時使用自定義的equals方法來判斷,使用==是判斷地址是否相等

8、hashCode方法的作用?
hashCode的作用是判斷兩個元素是否相等,是equals的互補。
例如:我們在set中元素是不重複,而為了保證不重複,我們不會每次增加一個元素,都去從頭用equals()檢查一遍,那樣太慢了,所以我們使用雜湊演算法(雜湊演算法),我們使用hashcode來確定元素的位置,如果該位置沒有元素則儲存,如有,則呼叫equals方法判斷,相等則不儲存,不相等則雜湊其餘位置

11、HashMap資料結構、擴充套件策略,Hash衝突攻擊如何防範,如何實現執行緒安全的HashMap?
HashMap的資料結構是一個數組,陣列中每個元素的型別是一個單向連結串列
擴充套件策略:hashMap有兩個初始值,初始容量、載入因子(預設0.75)
hashMap的hash值衝突:通過拉鍊法解決,同一個hash值下對應的是一個連結串列,相同hash值,但是是不同key的,在next後儲存,如果相同key值,則將原有的value值修改為新的value值
參考 http://www.cnblogs.com/skywang12345/p/3310835.html
https://www.cnblogs.com/chohyee/p/7404209.html
執行緒安全:
Hashtable
ConcurrentHashMap
Synchronized Map
參考 http://www.importnew.com/21396.html

12、JVM記憶體結構,GC演算法,CMS、G1的原理
JVM記憶體結構:
這裡寫圖片描述

13、NIO模型,select/epoll的區別,多路複用的原理
NIO的模型
這裡寫圖片描述
多路複用的原理是:一個非阻塞IO的執行緒,一個輪詢的selector這樣來完善整個流程
select和epoll:https://www.cnblogs.com/Anker/p/3265058.html
14、Java中一個字元佔多少個位元組,擴充套件再問int, long, double佔多少位元組
char 2個,int 4個 long 8 個 double 4位元組

15、建立一個類的例項都有哪些辦法?

  • new
  • classLoader
  • clone(原型模式)

16、final/finally/finalize的區別?
final 是變數、方法修飾符,表示此方法不可被重寫或變數不可以被改變值
finally 和try catch相搭配使用,表示最後要被執行的操作
finaliize 方法是在垃圾收集器刪除物件之前對這個物件呼叫的,進行必要的清理工作

17、LinkingBlockingQueue與ArrayBlockingQueue的區別,他們的適用場景?
Linked是無界的,無界快取等待佇列
Array是有界的,有界快取等待佇列
參考 https://www.cnblogs.com/feiyun126/p/7686302.html

18、Session/Cookie的區別?
Cookie是採用客戶端保持狀態的方案,內容存放在客戶的瀏覽器上,不安全,cookie,未設定過期時間一般儲存在記憶體中,成為會話Cookie,一旦瀏覽器關閉,這個Cookie也就關閉;若設定了過期時間,則是儲存在硬碟上,下次依然會有效
Session是採用伺服器保持狀態的方案,內容存放在伺服器上,更為安全,當有一個客戶端要與伺服器建立連線時,伺服器會檢索請求是否包含一個session標識,若包含,則將這個session檢索出來

19、String/StringBuffer/StringBuilder的區別,擴充套件再問他們的實現?
String 字串常量 操作少量資料
StringBuffer是執行緒安全 字串變數,適用於多執行緒操作大量資料
StringBuilder是執行緒不安全的 字串變數,適用於單執行緒操作大量資料

20、Servlet的生命週期?
這裡寫圖片描述

21、如何用Java分配一段連續的1G的記憶體空間?需要注意些什麼?
ByteBuffer.allocateDirect(1024*1024*1024);
注意記憶體溢位

22、Java有自己的記憶體回收機制,但為什麼還存在記憶體洩露的問題呢?
java的記憶體洩漏主要由個人編碼不認真造成,GC自動回收符合條件的記憶體空間,而有時你例項化一個物件,卻沒有將他置為null,造成他一直存在,這邊出現了記憶體洩漏

23、Java裡面用物件作為Key需要注意些什麼? 如何實現hashcode?
注意重寫hashCode方法和equals方法,清楚邏輯:如果物件equals為true,則hashCode為true,而hashCode為true,equals不一定為true