史上最全Java面試題之相關概念篇!(帶所有答案)

面向對象的三個特徵
封裝,繼承,多態,這個應該是人人皆知,有時候也會加上抽象。java

多態的好處
容許不一樣類對象對同一消息作出響應,即同一消息能夠根據發送對象的不一樣而採用多種不一樣的行爲方式(發送消息就是函數調用)。主要有如下優勢:c++

1.可替換性:多態對已存在代碼具備可替換性面試

2.可擴充性:增長新的子類不影響已經存在的類結構sql

3.接口性:多態是超類經過方法簽名,向子類提供一個公共接口,由子類來完善或者重寫它來實現的。緩存

4.靈活性架構

5.簡化性併發

代碼中如何實現多態框架

實現多態主要有如下三種方式:分佈式

  1. 接口實現
  2. 繼承父類重寫方法
  3. 同一類中進行方法重載

虛擬機是如何實現多態的函數

動態綁定技術(dynamic binding),執行期間判斷所引用對象的實際類型,根據實際類型調用對應的方法。

接口的意義

接口的意義用三個詞就能夠歸納:規範,擴展,回調。

抽象類的意義

抽象類的意義能夠用三句話來歸納:

爲其餘子類提供一個公共的類型

封裝子類中重複定義的內容

定義抽象方法,子類雖然有不一樣的實現,可是定義時一致的

接口和抽象類的區別

clipboard.png

父類的靜態方法可否被子類重寫

不能。重寫只適用於實例方法,不能用於靜態方法,而子類當中含有和父類相同簽名的靜態方法,咱們通常稱之爲隱藏。

什麼是不可變對象

不可變對象指對象一旦被建立,狀態就不能再改變。任何修改都會建立一個新的對象,如 String、Integer及其它包裝類。

靜態變量和實例變量的區別?

靜態變量存儲在方法區,屬於類全部。實例變量存儲在堆當中,其引用存在當前線程棧。

可否建立一個包含可變對象的不可變對象?

固然能夠建立一個包含可變對象的不可變對象的,你只須要謹慎一點,不要共享可變對象的引用就能夠了,若是須要變化時,就返回原對象的一個拷貝。最多見的例子就是對象中包含一個日期對象的引用。

java 建立對象的幾種方式

  • 採用new
  • 經過反射
  • 採用clone
  • 經過序列化機制

前2者都須要顯式地調用構造方法。形成耦合性最高的剛好是第一種,所以你發現不管什麼框架,只要涉及到解耦必先減小new的使用。

switch中可否使用string作參數

在idk 1.7以前,switch只能支持byte, short, char, int或者其對應的封裝類以及Enum類型。從idk 1.7以後switch開始支持String。

switch可否做用在byte, long上?

能夠用在byte上,可是不能用在long上。

String s1=」ab」, String s2=」a」+」b」, String s3=」a」, String s4=」b」, s5=s3+s4請問s5==s2返回什麼?

返回false。在編譯過程當中,編譯器會將s2直接優化爲」ab」,會將其放置在常量池當中,s5則是被建立在堆區,至關於s5=new String(「ab」);

你對String對象的intern()熟悉麼?

intern()方法會首先從常量池中查找是否存在該常量值,若是常量池中不存在則如今常量池中建立,若是已經存在則直接返回。

好比

String s1=」aa」;

String s2=s1.intern();

System.out.print(s1==s2);//返回true

Object中有哪些公共方法?

equals()

clone()

getClass()

notify(),notifyAll(),wait()

toString

java當中的四種引用

強引用,軟引用,弱引用,虛引用。不一樣的引用類型主要體如今GC上:

強引用:若是一個對象具備強引用,它就不會被垃圾回收器回收。即便當前內存空間不足,JVM也不會回收它,而是拋出 OutOfMemoryError 錯誤,使程序異常終止。若是想中斷強引用和某個對象之間的關聯,能夠顯式地將引用賦值爲null,這樣一來的話,JVM在合適的時間就會回收該對象。

軟引用:在使用軟引用時,若是內存的空間足夠,軟引用就能繼續被使用,而不會被垃圾回收器回收,只有在內存不足時,軟引用纔會被垃圾回收器回收。

弱引用:具備弱引用的對象擁有的生命週期更短暫。由於當 JVM 進行垃圾回收,一旦發現弱引用對象,不管當前內存空間是否充足,都會將弱引用回收。不過因爲垃圾回收器是一個優先級較低的線程,因此並不必定能迅速發現弱引用對象。

虛引用:顧名思義,就是形同虛設,若是一個對象僅持有虛引用,那麼它至關於沒有引用,在任什麼時候候均可能被垃圾回收器回收。

WeakReference與SoftReference的區別?

這點在四種引用類型中已經作了解釋,這裏簡單說明一下便可:

雖然 WeakReference 與 SoftReference 都有利於提升 GC 和 內存的效率,可是 WeakReference ,一旦失去最後一個強引用,就會被 GC 回收,而軟引用雖然不能阻止被回收,可是能夠延遲到 JVM 內存不足的時候。

爲何要有不一樣的引用類型

不像C語言,咱們能夠控制內存的申請和釋放,在Java中有時候咱們須要適當的控制對象被回收的時機,所以就誕生了不一樣的引用類型,能夠說不一樣的引用類型實則是對GC回收時機不可控的妥協。有如下幾個使用場景能夠充分的說明:

利用軟引用和弱引用解決OOM問題:用一個HashMap來保存圖片的路徑和相應圖片對象關聯的軟引用之間的映射關係,在內存不足時,JVM會自動回收這些緩存圖片對象所佔用的空間,從而有效地避免了OOM的問題.

經過軟引用實現Java對象的高速緩存:好比咱們建立了一Person的類,若是每次須要查詢一我的的信息,哪怕是幾秒中以前剛剛查詢過的,都要從新構建一個實例,這將引發大量Person對象的消耗,而且因爲這些對象的生命週期相對較短,會引發屢次GC影響性能。此時,經過軟引用和 HashMap 的結合能夠構建高速緩存,提供性能。

java中==和eqauls()的區別,equals()和`hashcode的區別

==是運算符,用於比較兩個變量是否相等,而equals是Object類的方法,用於比較兩個對象是否相等。默認Object類的equals方法是比較兩個對象的地址,此時和==的結果同樣。換句話說:基本類型比較用==,比較的是他們的值。默認下,對象用==比較時,比較的是內存地址,若是須要比較對象內容,須要重寫equal方法。

equals()和hashcode()的聯繫

hashCode()是Object類的一個方法,返回一個哈希值。若是兩個對象根據equal()方法比較相等,那麼調用這兩個對象中任意一個對象的hashCode()方法必須產生相同的哈希值。

若是兩個對象根據eqaul()方法比較不相等,那麼產生的哈希值不必定相等(碰撞的狀況下仍是會相等的。)

a.hashCode()有什麼用?與a.equals(b)有什麼關係

hashCode() 方法是相應對象整型的 hash 值。它經常使用於基於 hash 的集合類,如 Hashtable、HashMap、LinkedHashMap等等。它與 equals() 方法關係特別緊密。根據 Java 規範,使用 equal() 方法來判斷兩個相等的對象,必須具備相同的 hashcode。

將對象放入到集合中時,首先判斷要放入對象的hashcode是否已經在集合中存在,不存在則直接放入集合。若是hashcode相等,而後經過equal()方法判斷要放入對象與集合中的任意對象是否相等:若是equal()判斷不相等,直接將該元素放入集合中,不然不放入。

有沒有可能兩個不相等的對象有相同的hashcode

有可能,兩個不相等的對象可能會有相同的 hashcode 值,這就是爲何在 hashmap 中會有衝突。若是兩個對象相等,必須有相同的hashcode 值,反之不成立。

能夠在hashcode中使用隨機數字嗎?

不行,由於同一對象的 hashcode 值必須是相同的

a==b與a.equals(b)有什麼區別

若是a 和b 都是對象,則 a==b 是比較兩個對象的引用,只有當 a 和 b 指向的是堆中的同一個對象纔會返回 true,而 a.equals(b) 是進行邏輯比較,因此一般須要重寫該方法來提供邏輯一致性的比較。例如,String 類重寫 equals() 方法,因此能夠用於兩個不一樣對象,可是包含的字母相同的比較。

3*0.1==0.3返回值是什麼

false,由於有些浮點數不能徹底精確的表示出來。

a=a+b與a+=b有什麼區別嗎?

+=操做符會進行隱式自動類型轉換,此處a+=b隱式的將加操做的結果類型強制轉換爲持有結果的類型,而a=a+b則不會自動進行類型轉換。如:

byte a = 127;

byte b = 127;

b = a + b; // error : cannot convert from int to byte

b += a; // ok

(譯者注:這個地方應該表述的有誤,其實不管 a+b 的值爲多少,編譯器都會報錯,由於 a+b 操做會將 a、b 提高爲 int 類型,因此將 int 類型賦值給 byte 就會編譯出錯)

short s1= 1; s1 = s1 + 1; 該段代碼是否有錯,有的話怎麼改?

有錯誤,short類型在進行運算時會自動提高爲int類型,也就是說s1+1的運算結果是int類型。

short s1= 1; s1 += 1; 該段代碼是否有錯,有的話怎麼改?

+=操做符會自動對右邊的表達式結果強轉匹配左邊的數據類型,因此沒錯。

& 和 &&的區別

首先記住&是位操做,而&&是邏輯運算符。另外須要記住邏輯運算符具備短路特性,而&不具有短路特性。

public class Test{

static String name;

public static void main(String[] args){

if(name!=null&userName.equals("")){

          System.out.println("ok");

      }else{

          System.out.println("erro");

      }

  }

}

以上代碼將會拋出空指針異常。

一個java文件內部能夠有類?(非內部類)

只能有一個public公共類,可是能夠有多個default修飾的類。

如何正確的退出多層嵌套循環?

使用標號和break;

經過在外層循環中添加標識符

內部類的做用

內部類能夠有多個實例,每一個實例都有本身的狀態信息,而且與其餘外圍對象的信息相互獨立.在單個外圍類當中,可讓多個內部類以不一樣的方式實現同一接口,或者繼承同一個類.建立內部類對象的時刻不依賴於外部類對象的建立。內部類並無使人疑惑的」is-a」管系,它就像是一個獨立的實體。

內部類提供了更好的封裝,除了該外圍類,其餘類都不能訪問。

final, finalize和finally的不一樣之處

final 是一個修飾符,能夠修飾變量、方法和類。若是 final 修飾變量,意味着該變量的值在初始化後不能被改變。finalize 方法是在對象被回收以前調用的方法,給對象本身最後一個復活的機會,可是何時調用 finalize 沒有保證。finally 是一個關鍵字,與 try 和 catch 一塊兒用於異常的處理。finally 塊必定會被執行,不管在 try 塊中是否有發生異常。

clone()是哪一個類的方法?

java.lang.Cloneable 是一個標示性接口,不包含任何方法,clone 方法在 object 類中定義。而且須要知道 clone() 方法是一個本地方法,這意味着它是由 c 或 c++ 或 其餘本地語言實現的。

深拷貝和淺拷貝的區別是什麼?

淺拷貝:被複制對象的全部變量都含有與原來的對象相同的值,而全部的對其餘對象的引用仍然指向原來的對象。換言之,淺拷貝僅僅複製所考慮的對象,而不復制它所引用的對象。

深拷貝:被複制對象的全部變量都含有與原來的對象相同的值,而那些引用其餘對象的變量將指向被複制過的新對象,而再也不是原有的那些被引用的對象。換言之,深拷貝把要複製的對象所引用的對象都複製了一遍。

static都有哪些用法?

幾乎全部的人都知道static關鍵字這兩個基本的用法:靜態變量和靜態方法。也就是被static所修飾的變量/方法都屬於類的靜態資源,類實例所共享。

除了靜態變量和靜態方法以外,static也用於靜態塊,多用於初始化操做:

public calss PreCache{

static{

        //執行相關操做

  }

}

此外static也多用於修飾內部類,此時稱之爲靜態內部類。

最後一種用法就是靜態導包,即import static.import static是在JDK 1.5以後引入的新特性,能夠用來指定導入某個類中的靜態資源,而且不須要使用類名。資源名,能夠直接使用資源名,好比:

import static java.lang.Math.*;

public class Test{

public static void main(String[] args){

//System.out.println(Math.sin(20));傳統作法

      System.out.println(sin(20));

  }

}

final有哪些用法

final也是不少面試喜歡問的地方,能回答下如下三點就不錯了:

1.被final修飾的類不能夠被繼承

2.被final修飾的方法不能夠被重寫

3.被final修飾的變量不能夠被改變。若是修飾引用,那麼表示引用不可變,引用指向的內容可變。

4.被final修飾的方法,JVM會嘗試將其內聯,以提升運行效率

5.被final修飾的常量,在編譯階段會存入常量池中。

回答出編譯器對final域要遵照的兩個重排序規則更好:

1.在構造函數內對一個final域的寫入,與隨後把這個被構造對象的引用賦值給一個引用變量,這兩個操做之間不能重排序。

2.初次讀一個包含final域的對象的引用,與隨後初次讀這個final域,這兩個操做之間不能重排序。


本文的重點是你有沒有收穫與成長,其他的都不重要,但願讀者們能謹記這一點。同時我通過多年的收藏目前也算收集到了一套完整的學習資料,包括但不限於:分佈式架構、高可擴展、高性能、高併發、Jvm性能調優、Spring,MyBatis,Nginx源碼分析,Redis,ActiveMQ、、Mycat、Netty、Kafka、Mysql、Zookeeper、Tomcat、Docker、Dubbo、Nginx等多個知識點高級進階乾貨,但願對想成爲架構師的朋友有必定的參考和幫助

須要更詳細架構師技能思惟導圖和如下資料的能夠加一下技術交流分享羣:「708 701 457」免費獲取




相關文章
相關標籤/搜索