Java面试之Java基础下册(含答案)
- 動態代理與cglib實現的區別。
動態代理有兩種實現方式,分別是:jdk動態代理和cglib動態代理
jdk動態代理的前提是目標類必須實現一個接口,代理對象跟目標類實現一個接口,從而避過虛擬機的校驗。
cglib動態代理是繼承并重寫目標類,所以目標類和方法不能被聲明成final。
==================================================================
- 為什么cglib方式可以對接口實現代理。
cglib動態代理是繼承并重寫目標類,所以目標類和方法不能被聲明成final。而接口是可以被繼承的。
==================================================================
- final的用途。
1.final修飾的對象不能被修改;
2.final修飾的類不能被繼承;
3.final修飾的方法不能被重寫;
==================================================================
18 如何在父類中為子類自動完成所有的hashcode和equals實現?這么做有何優劣。
父類的equals不一定滿足子類的equals需求。比如所有的對象都繼承Object,默認使用的是Object的equals方法,在比較兩個對象的時候,是看他們是否指向同一個地址。
但是我們的需求是對象的某個屬性相同,就相等了,而默認的equals方法滿足不了當前的需求,所以我們要重寫equals方法。
如果重寫了equals 方法就必須重寫hashcode方法,否則就會降低map等集合的索引速度。
==================================================================
- 請結合OO設計理念,談談訪問修飾符public、private、protected、default在應用設計中的作用。
OO設計理念:封裝、繼承、多態
封裝,也就是把客觀事物封裝成抽象的類,并且類可以把自己的數據和方法只讓可信的類或者對象操作,對不可信的進行信息隱藏。所以我們可以通過public、private、protected、default 來進行訪問控制
關鍵字類內部本包子類外部包
public √√√√
protected√√√×
default √√××
private√×××
java訪問控制符的含義和使用情況
==================================================================
- 深拷貝和淺拷貝區別。
淺拷貝只拷貝指針,深拷貝就是拷貝他的值,重新生成的對像。
==================================================================
- error和exception的區別,CheckedException,RuntimeException的區別。
Error(錯誤)表示系統級的錯誤和程序不必處理的異常,是java運行環境中的內部錯誤或者硬件問題。比如:內存資源不足等。對于這種錯誤,程序基本無能為力,除了退出運行外別無選擇,它是由Java虛擬機拋出的。 Exception(違例)表示需要捕捉或者需要程序進行處理的異常,它處理的是因為程序設計的瑕疵而引起的問題或者在外的輸入等引起的一般性問題,是程序必須處理的。Exception又分為運行時異常,受檢查異常。 RuntimeException(運行時異常),表示無法讓程序恢復的異常,導致的原因通常是因為執行了錯誤的操作,建議終止程序,因此,編譯器不檢查這些異常。 CheckedException(受檢查異常),是表示程序可以處理的異常,也即表示程序可以修復(由程序自己接受異常并且做出處理), 所以稱之為受檢查異常。
==================================================================
- 請列出5個運行時異常。
NullPointerException
IndexOutOfBoundsException
ClassCastException
ArrayStoreException
BufferOverflowException
==================================================================
- 在自己的代碼中,如果創建一個java.lang.String對象,這個對象是否可以被類加載器加載?為什么。
不可以,雙親委派模式會保證父類加載器先加載類,就是BootStrap(啟動類)加載器加載jdk里面的java.lang.String類,而自定義的java.lang.String類永遠不會被加載到
==================================================================
- 說一說你對java.lang.Object對象中hashCode和equals方法的理解。在什么場景下需要重新實現這兩個方法。
父類的equals不一定滿足子類的equals需求。比如所有的對象都繼承Object,默認使用的是Object的equals方法,在比較兩個對象的時候,是看他們是否指向同一個地址。
但是我們的需求是對象的某個屬性相同,就相等了,而默認的equals方法滿足不了當前的需求,所以我們要重寫equals方法。
如果重寫了equals 方法就必須重寫hashcode方法,否則就會降低map等集合的索引速度。
==================================================================
- 在jdk1.5中,引入了泛型,泛型的存在是用來解決什么問題。
泛型的好處是在編譯的時候檢查類型安全,并且所有的強制轉換都是自動和隱式的,提高代碼的重用率。==================================================================
- 有沒可能 2個不相等的對象有同hashcode。
有可能,最簡單的方法,百分百實現的方式就是重寫hascode();
==================================================================
- Java中的HashSet內部是如何工作的。
public HashSet() {
map = new HashMap<>();}
默認使用的是HaseMap;
==================================================================
30什么是序列化,怎么序列化,為什么序列化,反序列化會遇到什么問題,如何解決。
序列化是一種用來處理對象流的機制 ,所謂對象流就是將對象的內容進行流化。
序列化是為了解決在對對象流進行讀寫操作時所引發的問題。
序列化的實現:將需要被序列化的類實現Serializable接口,該接口沒有需要實現的方法,implements Serializable只是為了標注該對象是可被序列化的,然后使用一個輸出流(如:FileOutputStream)來構造一個ObjectOutputStream(對象流)對象,接著,使用ObjectOutputStream對象的writeObject(Object obj)方法就可以將參數為obj的對象寫出(即保存其狀態),要恢復的話則用輸入流。
小編分類整理了許多java進階學習材料和BAT面試題,需要資料的請轉發此文章后再私聊小編回復【java】就能領取2019年java進階學習資料和BAT面試題以及《Effective Java》(第3版)電子版書籍。也可以加群:712263501領取海量學習資料進行學習。
總結
以上是生活随笔為你收集整理的Java面试之Java基础下册(含答案)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java面试之Java基础上册(含答案)
- 下一篇: 要想进入顶级数据公司,2020年数据科学