面向物件的三個特徵
封裝,繼承,多型.這個應該是人人皆知.有時候也會加上抽象.
多型的好處
允許不同類物件對同一訊息做出響應,即同一訊息可以根據傳送物件的不同而採用多種不同的行為方式(傳送訊息就是函式呼叫).主要有以下優點:
可替換性:多型對已存在程式碼具有可替換性.
可擴充性:增加新的子類不影響已經存在的類結構.
介面性:多型是超類透過方法簽名,向子類提供一個公共介面,由子類來完善或者重寫它來實現的.
靈活性:
簡化性:
介面的意義
介面的意義用三個詞就可以概括:規範,擴充套件,回撥.
抽象類的意義
抽象類的意義可以用三句話來概括:
- 為其他子類提供一個公共的型別
- 封裝子類中重複定義的內容
- 定義抽象方法,子類雖然有不同的實現,但是定義時一致的
什麼是不可變物件?好處是什麼?
不可變物件指物件一旦被建立,狀態就不能再改變,任何修改都會建立一個新的物件,如 String、Integer及其它包裝類.不可變物件最大的好處是執行緒安全.
java 建立物件的幾種方式
java中提供了以下四種建立物件的方式:
new建立新物件
透過反射機制
採用clone機制
透過序列化機制
前兩者都需要顯式地呼叫構造方法. 對於clone機制,需要注意淺複製和深複製的區別,對於序列化機制需要明確其實現原理,在java中序列化可以透過實現Externalizable或者Serializable來實現.
switch中能否使用string做引數?
在JDK 1.7之前,switch只能支援byte,short,char,int或者其對應的包裝類以及Enum型別.從JDK 1.7之後switch開始支援String型別.但到目前為止,switch都不支援long型別.
java中==和eqauls()的區別?
==是運算子,用於比較兩個變數是否相等,對於基本型別而言比較的是變數的值,對於物件型別而言比較的是物件的地址.
equals()是Object類的方法,用於比較兩個物件內容是否相等.預設Object類的equals()實現如下:
不難看出此時equals()是比較兩個物件的地址,此時直接==比較的的結果一樣.對於可能用於集合儲存中的物件元素而言,通常需要重寫其equals()方法.
& 和 &&的區別
基礎的概念不能弄混:&是位操作,&&是邏輯運算子.需要記住邏輯運算子具有短路特性,而&不具備短路特性.來看看一下程式碼執行結果?
final,finalize()和finally{}的不同之處
三者沒有任何相關性,遇到有問著問題的面試官就拖出去砍了吧.final是一個修飾符,用於修飾變數,方法和類.如果 final 修飾變數,意味著該變數的值在初始化後不能被改變.finalize()方法是在物件被回收之前呼叫的方法,給物件自己最後一個復活的機會.但是該方法由Finalizer執行緒呼叫,但呼叫時機無法保證.finally是一個關鍵字,與 try和catch一起用於異常的處理,finally{}一定會被執行,在此處我們通常用於資源關閉操作.
final有哪些用法?
final也是很多面試喜歡問的地方,但我覺得這個問題很無聊,通常能回答下以下5點就不錯了:
被final修飾的類不可以被繼承
被final修飾的方法不可以被重寫
被final修飾的變數不可以被改變.如果修飾引用,那麼表示引用不可變,引用指向的內容可變.
被final修飾的方法,JVM會嘗試將其內聯,以提高執行效率
被final修飾的常量,在編譯階段會存入常量池中.
除此之外,編譯器對final域要遵守的兩個重排序規則更好:
在建構函式內對一個final域的寫入,與隨後把這個被構造物件的引用賦值給一個引用變數,這兩個操作之間不能重排序
初次讀一個包含final域的物件的引用,與隨後初次讀這個final域,這兩個操作之間不能重排序.
int和Integer的區別?
Integer是int的包裝型別,在拆箱和裝箱中,二者自動轉換.int是基本型別,直接存數值;而integer是物件;用一個引用指向這個物件.由於Integer是一個物件,在JVM中物件需要一定的資料結構進行描述,相比int而言,其佔用的記憶體更大一些.
String s = new String("abc")建立了幾個String物件?
2個.一個是字串字面常數,在字串常量池中;另一個是new出來的字串物件,在堆中.
String,StringBuffer和StringBuilder區別?
String是字串常量,final修飾;StringBuffer字串變數(執行緒安全);StringBuilder 字串變數(執行緒不安全).此外StringBuilder和StringBuffer實現原理一樣,都是基於陣列擴容來實現的.
String和StringBuffer的區別?
String和StringBuffer主要區別是效能:String是不可變物件,每次對String型別進行操作都等同於產生了一個新的String物件,然後指向新的String物件.所以儘量不要對String進行大量的拼接操作,否則會產生很多臨時物件,導致GC開始工作,影響系統性能.
StringBuffer是物件本身操作,而不是產生新的物件,因此在有大量拼接的情況下,我們建議使用StringBuffer(執行緒安全).
需要注意現在JVM會對String拼接做一定的最佳化,比如
String s="This is only "+ "simple" +"test";
以上程式碼在編譯階段會直接被最佳化成會`String s=“This is only simple test”.
垃圾回收
簡單的解釋一下垃圾回收?
JVM中垃圾回收機制最基本的做法是分代回收.記憶體中的區域被劃分成不同的世代,物件根據其存活的時間被儲存在對應世代的區域中.一般的實現是劃分成3個世代:年輕,年老和永久代.所有新生成的物件優先放在年輕代的(大物件可能被直接分配在老年代,作為一種分配擔保機制),年輕代按照統計規律被分為三個區:一個Eden區,兩個 Survivor區.在年輕代中經歷了N次垃圾回收後仍然存活的物件,就會被放到年老代中.因此可以認為年老代中存放的都是一些生命週期較長的物件.
方法區也被稱為永久代,用於儲存每一個java類的結構資訊:比如執行時常量池,欄位和方法資料,建構函式和普通方法的位元組碼內容以及類,例項,介面初始化時需要使用到的特殊方法等資料,根據虛擬機器實現不同,GC可以選擇對方法區進行回收也可以不回收.
對於不同的世代可以使用不同的垃圾回收演算法。比如對由於年輕代存放的物件多是朝生夕死,因此可以採用標記-複製,而對於老年代則可以採用標記-整理/清除.
程序,執行緒相關 說說程序,執行緒之間的區別?
簡而言之,程序是程式執行和資源分配的基本單位,一個程式至少有一個程序,一個程序至少有一個執行緒.程序在執行過程中擁有獨立的記憶體單元,而多個執行緒共享記憶體資源,減少切換次數,從而效率更高.執行緒是程序的一個實體,是cpu排程和分派的基本單位,是比程式更小的能獨立執行的基本單位.同一程序中的多個執行緒之間可以併發執行.在Linux中,程序也稱為Task.
生產者消費者模型的作用是什麼?
(1)透過平衡生產者的生產能力和消費者的消費能力來提升整個系統的執行效率,這是生產者消費者模型最重要的作用
(2)解耦,這是生產者消費者模型附帶的作用,解耦意味著生產者和消費者之間的聯絡少,聯絡越少越可以獨自發展而不需要收到相互的制約
想了解更多原文連結:https://blog.csdn.net/qq_41701956/article/details/86773940