更新時間:2019-08-22 14:07:34 來源:動力節點 瀏覽2555次
今天要談的主題是關于求職.求職是在每個技術人員的生涯中都要經歷多次,對于我們大部分人而言,在進入自己心儀的公司之前少不了準備工作,有一份全面細致面試題將幫助我們減少許多麻煩.在跳槽季來臨之前,特地做這個系列的文章,一方面幫助自己鞏固下基礎,另一方面也希望幫助想要換工作的朋友.
相關概念
面向對象的三個特征
封裝,繼承,多態.這個應該是人人皆知.有時候也會加上抽象.
多態的好處
允許不同類對象對同一消息做出響應,即同一消息可以根據發送對象的不同而采用多種不同的行為方式(發送消息就是函數調用).主要有以下優點:
可替換性:多態對已存在代碼具有可替換性.
可擴充性:增加新的子類不影響已經存在的類結構.
接口性:多態是超類通過方法簽名,向子類提供一個公共接口,由子類來完善或者重寫它來實現的.
靈活性.
簡化性.
代碼中如何實現多態
實現多態主要有以下三種方式:
1.接口實現
2.繼承父類重寫方法
3.同一類中進行方法重載
虛擬機是如何實現多態的
動態綁定技術(dynamicbinding),執行期間判斷所引用對象的實際類型,根據實際類型調用對應的方法.
接口的意義
接口的意義用三個詞就可以概括:規范,擴展,回調.
抽象類的意義
抽象類的意義可以用三句話來概括:
為其他子類提供一個公共的類型
封裝子類中重復定義的內容
定義抽象方法,子類雖然有不同的實現,但是定義時一致的
接口和抽象類的區別
比較抽象類接口默認方法抽象類可以有默認的方法實現java8之前,接口中不存在方法的實現.實現方式子類使用extends關鍵字來繼承抽象類.如果子類不是抽象類,子類需要提供抽象類中所聲明方法的實現.子類使用implements來實現接口,需要提供接口中所有聲明的實現.構造器抽象類中可以有構造器,接口中不能和正常類區別抽象類不能被實例化接口則是完全不同的類型訪問修飾符抽象方法可以有public,protected和default等修飾接口默認是public,不能使用其他修飾符多繼承一個子類只能存在一個父類一個子類可以存在多個接口添加新方法想抽象類中添加新方法,可以提供默認的實現,因此可以不修改子類現有的代碼如果往接口中添加新方法,則子類中需要實現該方法.
父類的靜態方法能否被子類重寫
不能.重寫只適用于實例方法,不能用于靜態方法,而子類當中含有和父類相同簽名的靜態方法,我們一般稱之為隱藏.
什么是不可變對象
不可變對象指對象一旦被創建,狀態就不能再改變。任何修改都會創建一個新的對象,如String、Integer及其它包裝類。
靜態變量和實例變量的區別?
靜態變量存儲在方法區,屬于類所有.實例變量存儲在堆當中,其引用存在當前線程棧.
能否創建一個包含可變對象的不可變對象?
當然可以創建一個包含可變對象的不可變對象的,你只需要謹慎一點,不要共享可變對象的引用就可以了,如果需要變化時,就返回原對象的一個拷貝。最常見的例子就是對象中包含一個日期對象的引用.
java創建對象的幾種方式
采用new
通過反射
采用clone
通過序列化機制
前2者都需要顯式地調用構造方法.造成耦合性最高的恰好是第一種,因此你發現無論什么框架,只要涉及到解耦必先減少new的使用.
switch中能否使用string做參數
在idk1.7之前,switch只能支持byte,short,char,int或者其對應的封裝類以及Enum類型。從idk1.7之后switch開始支持String.
switch能否作用在byte,long上?
可以用在byte上,但是不能用在long上.
Strings1=”ab”,Strings2=”a”+”b”,Strings3=”a”,Strings4=”b”,s5=s3+s4請問s5==s2返回什么?
返回false.在編譯過程中,編譯器會將s2直接優化為”ab”,會將其放置在常量池當中,s5則是被創建在堆區,相當于s5=newString(“ab”);
你對String對象的intern()熟悉么?
intern()方法會首先從常量池中查找是否存在該常量值,如果常量池中不存在則現在常量池中創建,如果已經存在則直接返回.
比如
Strings1=”aa”;
Strings2=s1.intern();
System.out.print(s1==s2);//返回true
Object中有哪些公共方法?
equals()
clone()
getClass()
notify(),notifyAll(),wait()
toString
java當中的四種引用
強引用,軟引用,弱引用,虛引用.不同的引用類型主要體現在GC上:
強引用:如果一個對象具有強引用,它就不會被垃圾回收器回收。即使當前內存空間不足,JVM也不會回收它,而是拋出OutOfMemoryError錯誤,使程序異常終止。如果想中斷強引用和某個對象之間的關聯,可以顯式地將引用賦值為null,這樣一來的話,JVM在合適的時間就會回收該對象
軟引用:在使用軟引用時,如果內存的空間足夠,軟引用就能繼續被使用,而不會被垃圾回收器回收,只有在內存不足時,軟引用才會被垃圾回收器回收。
弱引用:具有弱引用的對象擁有的生命周期更短暫。因為當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值,反之不成立.
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習