面試題

1.多態(tài)的了解

多態(tài)存在有三個(gè)前提

繼承,重寫,父類引用指向子類對(duì)象。

多態(tài)成員訪問的特點(diǎn):

a.成員變量

編譯看左邊(父類),運(yùn)行看左邊(父類)

b.成員方法

編譯看左邊(父類),運(yùn)行看右邊(子類)。動(dòng)態(tài)綁定

c.靜態(tài)方法

編譯看左邊(父類),運(yùn)行看左邊(父類)。

(靜態(tài)和類相關(guān),算不上重寫,所以,訪問還是左邊的)

只有非靜態(tài)的成員方法,編譯看左邊,運(yùn)行看右邊

2.什么是內(nèi)部類,內(nèi)部類的作用

內(nèi)部類( Inner Class )就是定義在另外一個(gè)類里面的類。與之對(duì)應(yīng),包含內(nèi)部類的類被稱為外部類。

內(nèi)部類的主要作用如下:

a. 內(nèi)部類提供了更好的封裝,可以把內(nèi)部類隱藏在外部類之內(nèi),不允許同一個(gè)包中的其他類訪問該類

b. 內(nèi)部類的方法可以直接訪問外部類的所有數(shù)據(jù),包括私有的數(shù)據(jù)

c. 內(nèi)部類所實(shí)現(xiàn)的功能使用外部類同樣可以實(shí)現(xiàn),只是有時(shí)使用內(nèi)部類更方便

3.抽象類的意義

抽象類體現(xiàn)的是一種模板模式的設(shè)計(jì),抽象類作為多個(gè)子類的通用模板,子類在抽象類的基礎(chǔ)上進(jìn)行擴(kuò)展,改造,但子類總體上會(huì)大致保留抽象類的行為方式

4.接口的意義

接口體現(xiàn)的是一種規(guī)范

5.內(nèi)部類的設(shè)計(jì)意圖

一個(gè)類可以訪問另一個(gè)類的私有成員(封裝性)

讓Java可以實(shí)現(xiàn)多繼承

6.靜態(tài)內(nèi)部類

如果內(nèi)部類不會(huì)引用到外部類的東西的話,強(qiáng)烈建議使用靜態(tài)內(nèi)部類,因?yàn)檫@樣更節(jié)省資源,減少內(nèi)部類指向外部類的引用

7.String轉(zhuǎn)化為integer的原理

integer的valueof原理


8.匿名內(nèi)部類

方便編寫程序而設(shè)計(jì)的一個(gè)機(jī)制,有時(shí)候內(nèi)部類只需要?jiǎng)?chuàng)建一個(gè)它的對(duì)象,以后不會(huì)在使用它,這個(gè)時(shí)候就使用匿名內(nèi)部類。而且省去了起名字的麻煩

9.常見編碼方式

utf-8,gbk,gb2312,ascii

10.靜態(tài)代理和動(dòng)態(tài)代理區(qū)別

靜態(tài)代理類:由程序員創(chuàng)建或由特定工具自動(dòng)生成源代碼,再對(duì)其編譯。在程序運(yùn)行前,代理類的.class文件就已經(jīng)存在了。

動(dòng)態(tài)代理類:在程序運(yùn)行時(shí),運(yùn)用反射機(jī)制動(dòng)態(tài)創(chuàng)建而成。

靜態(tài)代理通常只代理一個(gè)類,動(dòng)態(tài)代理是代理一個(gè)接口下的多個(gè)實(shí)現(xiàn)類。

靜態(tài)代理事先知道要代理的是什么,而動(dòng)態(tài)代理不知道要代理什么東西,只有在運(yùn)行時(shí)才知道。

動(dòng)態(tài)代理是實(shí)現(xiàn)JDK里的InvocationHandler接口的invoke方法,但注意的是代理的是接口,也就是你的業(yè)務(wù)類必須要實(shí)現(xiàn)接口,通過Proxy里的newProxyInstance得到代理對(duì)象。

還有一種動(dòng)態(tài)代理CGLIB,代理的是類,不需要業(yè)務(wù)類繼承接口,通過派生的子類來實(shí)現(xiàn)代理。通過在運(yùn)行時(shí),動(dòng)態(tài)修改字節(jié)碼達(dá)到修改類的目的。

11.依賴注入

12.泛型

泛型原理

作用:類型限定,類型檢查,提高程序運(yùn)行效率

a泛型是偽泛型,在編譯期間會(huì)被擦除,只留下原始類型,如果沒有限定類型。原始類型就是Object,如果有限定類型,就用第一個(gè)邊界的類型.

b.泛型變量的使用,是在編譯之前檢查的,因?yàn)榫幾g的時(shí)候就擦除了,無法進(jìn)行檢查.

c.沒有指定泛型類型的時(shí)候,泛型方法中如果有多個(gè)參數(shù),最終的結(jié)果是兩個(gè)參數(shù)最小的共同父類型

d.類型檢查是針對(duì)引用的,用引用調(diào)用方法,就會(huì)檢查。而無關(guān)真實(shí)的對(duì)象

e.泛型中參數(shù)化類型為什么不考慮繼承關(guān)系

如果考慮了繼承關(guān)系,在取值的時(shí)候,會(huì)發(fā)生ClassCastException或者

13.String為什么設(shè)計(jì)成不可變的

string為什么設(shè)計(jì)成不可變

14.equals和hashcode方法

為什么重寫equals方法后要重寫hashcode方法

15.Object中的方法

wait,notify,hashcode,clone,equals,finalize,tostring,getclass

16.clone方法

java中的clone方法

淺拷貝:只拷貝對(duì)象。而不拷貝對(duì)象的引用,也就是說拷貝出來的對(duì)象和原對(duì)象引用同一個(gè)對(duì)象

深拷貝:不僅拷貝對(duì)象。也拷貝對(duì)象的引用

如何實(shí)現(xiàn)深拷貝?

a.實(shí)現(xiàn)Cloneable接口,重寫clone方法,手動(dòng)克隆引用

b.采用序列化方式

17.iterator和listiterator區(qū)別

迭代器區(qū)別

18.java集合

集合

19.concurrenthashmap

20Collections.synchronizedMap()

21如何控制某個(gè)方法允許并發(fā)訪問線程的個(gè)數(shù),

信號(hào)量

22.什么導(dǎo)致線程阻塞

23.java如何終止線程

24.synchronized和volatile區(qū)別

25.synchronized和lock區(qū)別

synchronizwd和lock區(qū)別

26.進(jìn)程和線程區(qū)別

進(jìn)程:進(jìn)程是資源(CPU、內(nèi)存等)分配的基本單位,它是程序執(zhí)行時(shí)的一個(gè)實(shí)例。程序運(yùn)行時(shí)系統(tǒng)就會(huì)創(chuàng)建一個(gè)進(jìn)程,并為它分配資源

線程:線程是程序執(zhí)行時(shí)的最小單位,它是進(jìn)程的一個(gè)執(zhí)行流,是CPU調(diào)度和分派的基本單位,一個(gè)進(jìn)程可以由很多個(gè)線程組成,線程間共享進(jìn)程的所有資源,每個(gè)線程有自己的堆棧和局部變量。線程由CPU獨(dú)立調(diào)度執(zhí)行,在多CPU環(huán)境下就允許多個(gè)線程同時(shí)運(yùn)行。

27.類鎖。方法鎖。重入鎖

類鎖,方法鎖,對(duì)象鎖

類鎖和對(duì)象鎖

28.CountDownlatch

在完成一組正在其他線程中執(zhí)行的操作之前,它允許一個(gè)或多個(gè)線程一直等待

CountDownLatch內(nèi)部通過共享鎖實(shí)現(xiàn)。在創(chuàng)建CountDownLatch實(shí)例時(shí),需要傳遞一個(gè)int型的參數(shù):count,該參數(shù)為計(jì)數(shù)器的初始值,也可以理解為該共享鎖可以獲取的總次數(shù)。當(dāng)某個(gè)線程調(diào)用await()方法,程序首先判斷count的值是否為0,如果不會(huì)0的話則會(huì)一直等待直到為0為止。當(dāng)其他線程調(diào)用countDown()方法時(shí),則執(zhí)行釋放共享鎖狀態(tài),使count值 – 1。當(dāng)在創(chuàng)建CountDownLatch時(shí)初始化的count參數(shù),必須要有count線程調(diào)用countDown方法才會(huì)使計(jì)數(shù)器count等于0,鎖才會(huì)釋放,前面等待的線程才會(huì)繼續(xù)運(yùn)行。注意CountDownLatch不能回滾重置。

29.CyclicBarrier

讓一組線程到達(dá)一個(gè)屏障時(shí)被阻塞,直到最后一個(gè)線程到達(dá)屏障時(shí),屏障才會(huì)開門,所有被屏障攔截的線程才會(huì)繼續(xù)干活

30.上面兩個(gè)的區(qū)別?

CountDownLatch的作用是允許1或N個(gè)線程等待其他線程完成執(zhí)行;而CyclicBarrier則是允許N個(gè)線程相互等待

CountDownLatch的計(jì)數(shù)器無法被重置;CyclicBarrier的計(jì)數(shù)器可以被重置后使用,因此它被稱為是循環(huán)的barrier

31.多線程編程的好處和缺點(diǎn)

優(yōu)點(diǎn):提高CPU利用率,提高程序運(yùn)行效率

缺點(diǎn):安全性問題,性能問題(線程的創(chuàng)建銷毀,以及線程之間的互相切換都是會(huì)消耗時(shí)間

32.線程優(yōu)先級(jí)

優(yōu)先級(jí)1-10,默認(rèn)是5,普通優(yōu)先級(jí),一般來說,高優(yōu)先級(jí)的線程在運(yùn)行時(shí)會(huì)具有優(yōu)先權(quán),但這

依賴于線程調(diào)度的實(shí)現(xiàn),這個(gè)實(shí)現(xiàn)和操作系統(tǒng)相關(guān)的,我們可以設(shè)置線程的優(yōu)先級(jí),但是不能保證優(yōu)先級(jí)高的線程一定先執(zhí)行。

33.什么是線程調(diào)度器(Thread Scheduler)和時(shí)間分片(Time Slicing)?

線程調(diào)度器是一個(gè)操作系統(tǒng)服務(wù),它負(fù)責(zé)為Runnable狀態(tài)的線程分配CPU時(shí)間。一旦我們創(chuàng)建一個(gè)線程并啟動(dòng)它,它的執(zhí)行便依賴于線程調(diào)度器的實(shí)現(xiàn)。時(shí)間分片是指將可用的CPU時(shí)間分配給可用的Runnable線程的過程。分配CPU時(shí)間可以基于線程優(yōu)先級(jí)或者線程等待的時(shí)間。線程調(diào)度并不受到Java虛擬機(jī)控制,所以由應(yīng)用程序來控制它是更好的選擇(也就是說不要讓你的程序依賴于線程的優(yōu)先級(jí))。

34.在多線程中,什么是上下文切換(context-switching)?

上下文切換是存儲(chǔ)和恢復(fù)CPU狀態(tài)的過程,它使得線程執(zhí)行能夠從中斷點(diǎn)恢復(fù)執(zhí)行。上下文切換是多任務(wù)操作系統(tǒng)和多線程環(huán)境的基本特征。

35.為什么線程通信的方法wait(), notify()和notifyAll()被定義在Object類里?

Java的每個(gè)對(duì)象中都有一個(gè)鎖(monitor,也可以成為監(jiān)視器) 并且wait(),notify()等方法用于等待對(duì)象的鎖或者通知其他線程對(duì)象的監(jiān)視器可用。在Java的線程中并沒有可供任何對(duì)象使用的鎖和同步器。這就是為什么這些方法是Object類的一部分,這樣Java的每一個(gè)類都有用于線程間通信的基本方法

36.為什么wait(), notify()和notifyAll()必須在同步方法或者同步塊中被調(diào)用?

當(dāng)一個(gè)線程需要調(diào)用對(duì)象的wait()方法的時(shí)候,這個(gè)線程必須擁有該對(duì)象的鎖,接著它就會(huì)釋放這個(gè)對(duì)象鎖并進(jìn)入等待狀態(tài)直到其他線程調(diào)用這個(gè)對(duì)象上的notify()方法。同樣的,當(dāng)一個(gè)線程需要調(diào)用對(duì)象的notify()方法時(shí),它會(huì)釋放這個(gè)對(duì)象的鎖,以便其他在等待的線程就可以得到這個(gè)對(duì)象鎖。由于所有的這些方法都需要線程持有對(duì)象的鎖,這樣就只能通過同步來實(shí)現(xiàn),所以他們只能在同步方法或者同步塊中被調(diào)用。

37.為什么Thread類的sleep()和yield()方法是靜態(tài)的?

Thread類的sleep()和yield()方法將在當(dāng)前正在執(zhí)行的線程上運(yùn)行。所以在其他處于等待狀態(tài)的線程上調(diào)用這些方法是沒有意義的。這就是為什么這些方法是靜態(tài)的。它們可以在當(dāng)前正在執(zhí)行的線程中工作,并避免程序員錯(cuò)誤的認(rèn)為可以在其他非運(yùn)行線程調(diào)用這些方法。

38.ArrayMap和hashmap對(duì)比

存儲(chǔ)方式不同

arraymap源碼

39.TreeMap

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,621評(píng)論 1 32
  • 三重:代碼、底層內(nèi)存、源碼 第一階段:開發(fā)常用JavaSE基礎(chǔ)、IDE、Maven、Gradle、SVN、Git、...
    guodd369閱讀 17,509評(píng)論 1 44
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,623評(píng)論 18 399
  • 我把很多文章都刪了,我想從頭開始。 以前的都是消極的,灰暗的,抱怨的,那是因?yàn)槲易约?,無法應(yīng)對(duì)這新的一切,婆媳關(guān)系...
    林潓甄閱讀 512評(píng)論 13 2
  • 合適的不咸不淡
    322_閱讀 180評(píng)論 0 0

友情鏈接更多精彩內(nèi)容