【魯班學院】面試總結:Java高級篇(下),抽象類和接口的關係以及對內存和棧內存的區別等

22.關於抽象類和接口的關係


簡言之抽象類是一種功能不全的類,接口只是一個抽象方法聲明和靜態不能被修改的數據的集合,二者都不能被實例化。java

從某種意義上說,接口是一種特殊形式的抽象類,在java語言中抽象類表示的是一種繼承關係,一個類只能繼承繼承一個抽象類,而一個類卻能夠實現多個接口。在許多狀況下,接口確實能夠代替抽象類,若是你不須要刻意表達屬性上的繼承的話。算法

23.堆內存和棧內存的區別


寄存器:JVM內部虛擬寄存器,存取速度很是快,程序不可控制。
棧:保存局部變量的值包括:1.保存基本數據類型的值;2.保存引用變量,即堆區對象的引用(指針)。也能夠用來保存加載方法時的幀。sql

堆:用來存放動態產生的數據,好比new出來的對象。注意建立出來的對象只包含屬於各自的成員變量,並不包括成員方法。由於同一個類的對象擁有各自的成員變量,存儲在各自的堆中,可是他們共享該類的方法,並非每建立一個對象就把成員方法複製一次。編程

常量池:JVM爲每一個已加載的類型維護一個常量池,常量池就是這個類型用到的常量的一個有序集合。包括直接常量(基本類型,String)和對其餘類型、方法、字段的符號引用(1)。池中的數據和數組同樣經過索引訪問。因爲常量池包含了一個類型全部的對其餘類型、方法、字段的符號引用,因此常量池在Java的動態連接中起了核心做用。常量池存在於堆中。數組

代碼段:用來存放從硬盤上讀取的源程序代碼。
數據段:用來存放static修飾的靜態成員(在java中static的做用就是說明該變量,方法,代碼塊是屬於類的仍是屬於實例的)。安全

24.關於Java文件的內部類的解釋?匿名內部類是什麼?如何訪問在其外面定義的變量?


java中的內部類總結
靜態內部類不能訪問外部類非靜態的成員網絡

25.關於重載和重寫的區別


重載是overload,是一個類中同方法名的不一樣具體實現。而後重寫是override,是子類重寫父類中的方法。數據結構

26.String、StringBuffer與StringBuilder之間區別


1.三者在執行速度方面的比較:StringBuilder > StringBuffer多線程

 

String String:字符串常量
StringBuffer:字符串變量
StringBuilder:字符串變量併發

 

2.StringBuilder:線程非安全的,StringBuffer:線程安全的
對於三者使用的總結:

 

(1).若是要操做少許的數據用 = String
(2).單線程操做字符串緩衝區 下操做大量數據 = StringBuilder
(3).多線程操做字符串緩衝區 下操做大量數據 = StringBuffer

 

27.運行時異常與通常異常有何異同?常見異常

Java提供了兩類主要的異常:runtime exception和checked exception
常見異常:NullPointerException、IndexOutOfBoundsException、ClassNotFoundException,IllegalArgumentException,ClassCastException(數據類型轉換異常)

 28.error和exception有什麼區別?


error 表示恢復不是不可能但很困難的狀況下的一種嚴重問題。好比說內存溢出。不可能期望程序能處理這樣的狀況。
exception表示一種設計或實現問題。也就是說,它表示若是程序運行正常,從不會發生的狀況。

29.Java異常處理機制

 

 1.捕獲異常:try、catch 和 finally
 2.拋出異常
 2.1. throws拋出異常

 

30.java中有幾種方法能夠實現一個線程?

 

1.class Thread1 extends Thread{},而後重寫run方法
 2.class Thread2 implements Runnable{},而後重寫run方法
 3.class Thread3 implements Callable{},而後new FutureTask(thread3),再用new Thread(future)封裝。

 

若是一個類繼承Thread,則不適合資源共享。可是若是實現了Runable接口的話,則很容易的實現資源共享。

31.Java中經常使用的類,包,接口。


class: ‘Date’,’System’,’Calender’,’Math’,’ArrayList’,’HashMap’package: ‘java.lang’,’java.util’,’java.io’,’java.sql’,’java.net’interface: ‘Collection’,’Map’,’List’,’Runnable’,’Callable’

 32.java在處理線程同步時,經常使用方法有:

 

 一、synchronized關鍵字。
 二、Lock顯示加鎖。
 三、信號量Semaphore。
 四、CAS算法
 五、concurrent包

 

33.Spring IOC/AOP?


回答了IOC/DI、AOP的概念。
AOP(Aspect-OrientedProgramming,面向方面編程),能夠說是OOP(Object-Oriented Programing,面向對象編程)的補充和完善。OOP引入封裝、繼承和多態性等概念來創建一種對象層次結構,用以模擬公共行爲的一個集合。當咱們須要爲分散的對象引入公共行爲的時候,OOP則顯得無能爲力。

也就是說,OOP容許你定義從上到下的關係,但並不適合定義從左到右的關係。例如日誌功能。日誌代碼每每水平地散佈在全部對象層次中,而與它所散佈到的對象的核心功能毫無關係。對於其餘類型的代碼,如安全性、異常處理和透明的持續性也是如此。這種散佈在各處的無關的代碼被稱爲橫切(cross-cutting)代碼,
在OOP設計中,它致使了大量代碼的重複,而不利於各個模塊的重用。

依賴注入(Dependency Injection)和控制反轉(Inversion of Control)是同一個概念。當某個角色(多是一個Java實例,調用者)須要另外一個角色(另外一個Java實例,被調用者)的協助時,在傳統的程序設計過程當中,一般由調用者來建立被調用者的實例。

但在Spring裏,建立被調用者的工做再也不由調用者來完成,所以稱爲控制反轉;建立被調用者實例的工做一般由Spring容器來完成,而後注入調用者,所以也稱爲依賴注入。不論是依賴注入,仍是控制反轉,都說明Spring採用動態、靈活的方式來管理各類對象。對象與對象之間的具體實現互相透明。
在理解依賴注入以前,看以下這個問題在各類社會形態裏如何解決:一我的(Java實例,調用者)須要一把斧子(Java實例,被調用者)。

34.對JVM的垃圾回收的認識?


垃圾回收器的做用是查找和回收(清理)無用的對象。以便讓JVM更有效的使用內存。

35.進程與線程的區別,及其通訊方式

線程與進程的區別及其通訊方式 
區別
1.一個程序至少有一個進程,一個進程至少有一個線程.
2.進程在執行過程當中擁有獨立的內存單元,而多個線程共享內存
3.線程是進程的一個實體,是CPU調度和分派的基本單位

進程間通訊

36.JVM如何GC,新生代,老年代,持久代,都存儲哪些東西?


JVM的GC算法有:引用計數器算法,根搜索方法
新生成的對象首先都是放在年輕代的。年輕代的目標就是儘量快速的收集掉那些生命週期短的對象。

在年輕代中經歷了N次垃圾回收後仍然存活的對象,就會被放到年老代中。所以,能夠認爲年老代中存放的都是一些生命週期較長的對象。
持久代主要存放的是Java類的類信息

 37.JVM分爲哪些區,每個區幹嗎的?


問:Java運行時數據區域?
回答:包括程序計數器、JVM棧、本地方法棧、方法區、堆

問:方法區裏存放什麼?
本地方法棧:和jvm棧所發揮的做用相似,區別是jvm棧爲jvm執行java方法(字節碼)服務,而本地方法棧爲jvm使用的native方法服務。
JVM棧:局部變量表、操做數棧、動態連接、方法出口。
方法區:用於存儲已被虛擬機加載的類信息,常量、靜態變量、即時編譯器編譯後的代碼等。
堆:存放對象實例。

 38.GC用的引用可達性分析算法中,哪些對象可做爲GC Roots對象?

虛擬機棧(棧幀中的本地變量表)中引用的對象;
方法區中類靜態屬性引用的對象;
方法區中常量引用的對象;
本地方法棧中JNI(即通常說的Native方法)引用的對象

 

39.用什麼工具調試程序?jmap、jstack,JConsole,用過嗎?

虛擬機性能監控與調優實戰–博客

 

40.線程池用過嗎?

線程池–併發編程網 - ifeve.com

線程池(Thread Pool)對於限制應用程序中同一時刻運行的線程數頗有用。由於每啓動一個新線程都會有相應的性能開銷,每一個線程都須要給棧分配一些內存等等。

咱們能夠把併發執行的任務傳遞給一個線程池,來替代爲每一個併發執行的任務都啓動一個新的線程。只要池裏有空閒的線程,任務就會分配給一個線程執行。在線程池的內部,任務被插入一個阻塞隊列(Blocking Queue ),線程池裏的線程會去取這個隊列裏的任務。當一個新任務插入隊列時,一個空閒線程就會成功的從隊列中取出任務而且執行它。

 

41.操做系統如何進行分頁調度?–要考LRU

 1.最講置換原則-OPT
 2.先進先出原則-FIFO
 3.最近最少使用置換算法-LRU
 4.時鐘置換算法

42.講講LinkedHashMap

Java8 LinkedHashMap工做原理及實現

LinkedHashMap是經過哈希表和鏈表實現的,它經過維護一個鏈表來保證對哈希表迭代時的有序性,而這個有序是指鍵值對插入的順序。
LinkedHashMap 的大體實現以下圖所示,固然鏈表和哈希表中相同的鍵值對都是指向同一個對象,這裏把它們分開來畫只是爲了呈現出比較清晰的結構。

 

 

LinkedHashMap是Hash表和鏈表的實現,而且依靠着雙向鏈表保證了迭代順序是插入的順序。
三個重點實現的函數
在HashMap中提到了下面的定義:

LinkedHashMap繼承於HashMap,所以也從新實現了這3個函數,顧名思義這三個函數的做用分別是:節點訪問後、節點插入後、節點移除後作一些事情。

43.線程同步與阻塞的關係?同步必定阻塞嗎?阻塞必定同步嗎?,同步和異步有什麼區別?

同步與非同步:主要是保證互斥的訪問臨界資源的狀況
阻塞與非阻塞:主要是從 CPU 的消耗上來講的

 

44.int與Integer的區別,分別什麼場合使用

int是基本數據類型,Integer是包裝類,相似HashMap這樣的結構必須使用包裝類,由於包裝類繼承自Object,都須要實現HashCode,因此可使用在HashMap這類數據結構中。

 

45.RPC的詳細過程

 

RPC主要的重點有:
 動態代理,主要是invoke反射原理
 序列化,使用Thrift的效率高 通訊方式,使用Netty的NIO能提升效率
 服務發現,使用zookeeper能夠實現

 

一、服務消費方(client)調用以本地調用方式調用服務; 二、client stub接收到調用後負責將方法、參數等組裝成可以進行網絡傳輸的消息體; 三、client stub找到服務地址,並將消息發送到服務端; 四、server stub收到消息後進行解碼; 五、server stub根據解碼結果調用本地的服務; 六、本地服務執行並將結果返回給server stub; 七、server stub將返回結果打包成消息併發送至消費方; 八、client stub接收到消息,並進行解碼; 九、服務消費方獲得最終結果。

相關文章
相關標籤/搜索