tips:下面簡述題為java面試真題,閱讀本文且感興趣的,還有將要面試的小伙伴有條件的準備一下筆和紙,將之轉(zhuǎn)述出來成為自己的知識,希望接下來的面試好運連連
目錄
1.Java中的四種訪問權(quán)限分別是什么?它們分別可以修飾什么?
2.Java中的接口和抽象類有什么區(qū)別?
3.說一下Java中的多態(tài),以及它的實現(xiàn)方式。
4.什么是多線程,什么是線程安全?什么時候出現(xiàn)線程安全問題?如何保證線程安全?
5.簡述Spring框架的核心功能,包括IOC和AOP。
6.MyBatis框架中的Mapper是什么?如何使用?
7.經(jīng)常使用框架有什么好處?
8.synchronized和Renntrantlock的區(qū)別?后者怎么實現(xiàn)的?
9.什么是aqs?
10.請簡單介紹一下MySQL數(shù)據(jù)庫,并說明其特點和優(yōu)劣。
1.Java中的四種訪問權(quán)限分別是什么?它們分別可以修飾什么?
?? ?四種訪問權(quán)限分別是:public:protected:default:private:
?? ?public:公共的 所修飾的類、變量、方法,在內(nèi)外包均具有訪問權(quán)限;
?? ?protected:受保護的 這種權(quán)限是為繼承而設(shè)計的,protected所修飾的成員,對所有子類是可訪問的,對同包的類是可訪問的,但對外包的非子類是不可以訪問;
?? ?default:包訪問權(quán)限 只有同包的類有訪問權(quán)限;
?? ?private:私有的 只對本類的方法可以使用(可以多說兩句private能不能修飾類)
2.Java中的接口和抽象類有什么區(qū)別?
1)從基礎(chǔ)知識方面來講(拓展學(xué)習(xí))
Java中接口和抽象類的定義語法分別為interface與abstract關(guān)鍵字。
抽象類:在Java中被abstract關(guān)鍵字修飾的類稱為抽象類,被abstract關(guān)鍵字修飾的方法稱為抽象方法,抽象方法只有方法的聲明,沒有方法體。
抽象類的特點:
a、抽象類不能被實例化,只能被繼承;
b、包含抽象方法的一定是抽象類,但是抽象類不一定含有抽象方法;
c、抽象類中的抽象方法的修飾符只能為public或者protected,默認為public;
d、一個子類繼承一個抽象類,則子類必須實現(xiàn)父類抽象方法,否則子類也必須定義為抽象類;
e、抽象類可以包含屬性、方法、構(gòu)造方法,但是構(gòu)造方法不能用于實例化,主要用途是被子類調(diào)用。
接口:Java中接口使用interface關(guān)鍵字修飾,特點為:
a、接口可以包含變量、方法;變量被隱式指定為public static final,方法被隱式指定為public abstract(JDK1.8之前);
b、接口支持多繼承,即一個接口可以implements多個接口,間接的解決了Java中類的單繼承問題;
c、一個類可以實現(xiàn)多個接口;
d、JDK1.8中對接口增加了新的特性:(1)默認方法(default method):JDK 1.8允許給接口添加非抽象的方法實現(xiàn),但必須使用default關(guān)鍵字修飾;定義了default的方法可以不被實現(xiàn)子類所實現(xiàn),但只能被實現(xiàn)子類的對象調(diào)用;如果子類實現(xiàn)了多個接口,并且這些接口包含一樣的默認方法,則子類必須重寫默認方法;(2)靜態(tài)方法(static method):JDK 1.8中允許使用static關(guān)鍵字修飾一個方法,并提供實現(xiàn),稱為接口靜態(tài)方法。接口靜態(tài)方法只能通過接口調(diào)用(接口名.靜態(tài)方法名)。
如下例子所示:
public interface Person{
? public static final int a=10;
? //JDK1.8
? ? default void sayHello(){
? ? ? ? System.out.println("Hello World");
? ? }
? ? public void say();
}
public abstract class Person{
? public abstract void say();
? public void eat(){};
}
如上述代碼所示:
接口只能是功能的定義,而抽象類既可以為功能的定義也可以為功能的實現(xiàn)。
2)從面試角度:接口與抽象類的區(qū)別
相同點:
(1)都不能被實例化 (2)接口的實現(xiàn)類或抽象類的子類都只有實現(xiàn)了接口或抽象類中的方法后才能實例化。
不同點:
(1)接口只有定義,不能有方法的實現(xiàn),java 1.8中可以定義default方法體,而抽象類可以有定義與實現(xiàn),方法可在抽象類中實現(xiàn)。
(2)實現(xiàn)接口的關(guān)鍵字為implements,繼承抽象類的關(guān)鍵字為extends。一個類可以實現(xiàn)多個接口,但一個類只能繼承一個抽象類。所以,使用接口可以間接地實現(xiàn)多重繼承。
(3)接口強調(diào)特定功能的實現(xiàn),而抽象類強調(diào)所屬關(guān)系。
(4)接口成員變量默認為public static final,必須賦初值,不能被修改;其所有的成員方法都是public、abstract的。抽象類中成員變量默認default,可在子類中被重新定義,也可被重新賦值;抽象方法被abstract修飾,不能被private、static、synchronized和native等修飾,必須以分號結(jié)尾,不帶花括號。
3.說一下Java中的多態(tài),以及它的實現(xiàn)方式。
?? ?java面向?qū)ο笕筇卣鳎悍庋b 繼承 多態(tài)
?? ?多態(tài):同一個類型的行為具有多個不同表現(xiàn)形式或形態(tài)的能力,Java允許把一個子類對象直接賦給一個父類引用變量,無須任何類型轉(zhuǎn)換,或者被稱為向上轉(zhuǎn)型,向上轉(zhuǎn)型由編譯器自動完成。
?? ?多態(tài)的必要條件:1.要有繼承(or接口的實現(xiàn))2.要有重寫 3.父類引用指向子類對象
?? ?多態(tài)優(yōu)點:1、實現(xiàn)代碼的復(fù)用,避免代碼的冗余;2、減少代碼之間的關(guān)聯(lián)性,即耦合度,方便后期對代碼的修改,功能的改善,不必牽一發(fā)而動全身,減少不必要的麻煩;3、能夠通過重寫子類的方法,使不同的對象具有不同的功能,擴展了功能。
?? ?類方法實現(xiàn)多態(tài):
?? ??? ?1.重載(參數(shù)個數(shù),順序,類型不同)
?? ??? ?2.方法重寫(父類與子類方法名一致)
?? ??? ?3.父類引用指向子類對象(編譯期看父類,運行期看子類)
?? ??? ?4.對靜態(tài)成員方法、成員變量:編譯和運行都看左邊
????????Animal x = new Cat();//向上轉(zhuǎn)型
?? ??? ?x只能調(diào)用父類方法,調(diào)用子類方法會報錯
?? ??? ?Animal x = new Cat();
?? ??? ?Cat s = (Cat)x;//向下轉(zhuǎn)型
?? ??? ?s可以調(diào)用子類和父類方法
4.什么是多線程,什么是線程安全?什么時候出現(xiàn)線程安全問題?如何保證線程安全?
?? ?多線程:Java多線程是指在Java編程語言中同時執(zhí)行多個線程的能力。線程是程序的執(zhí)行單元,可以同時執(zhí)行多個任務(wù),提高程序的并發(fā)性和效率。
????????在Java中,可以通過創(chuàng)建Thread類的實例來創(chuàng)建和管理線程。可以使用Thread類的start()方法啟動線程的執(zhí)行。此外,還可以實現(xiàn)Runnable接口,并將其傳遞給Thread類的構(gòu)造函數(shù)來創(chuàng)建線程。
多線程編程可以實現(xiàn)以下幾個目的:
提高程序的響應(yīng)性:可以在后臺執(zhí)行耗時的任務(wù),同時保持程序的交互性。
提高系統(tǒng)資源利用率:通過同時執(zhí)行多個任務(wù),充分利用CPU資源。
實現(xiàn)并行計算:將任務(wù)拆分為多個子任務(wù),分配給不同的線程并行執(zhí)行,加快計算速度。
然而,多線程編程也需要注意線程安全性、競態(tài)條件、死鎖等問題,需要合理地設(shè)計和同步線程來避免這些問題。
?? ?線程安全:線程安全是多線程編程時的計算機程序代碼中的一個概念。在擁有共享數(shù)據(jù)的多條線程并行執(zhí)行的程序中,線程安全的代碼會通過同步機制保證各個線程都可以正常且正確的執(zhí)行,不會出現(xiàn)數(shù)據(jù)污染等意外情況。
?? ?線程安全問題:線程安全問題在多線程編程中可能會出現(xiàn),具體取決于以下幾個因素:
????????共享數(shù)據(jù):當多個線程同時訪問和修改共享數(shù)據(jù)時,可能會導(dǎo)致線程安全問題。例如,多個線程同時對同一個變量進行寫操作,可能導(dǎo)致數(shù)據(jù)不一致或丟失。
????????競態(tài)條件:當多個線程在執(zhí)行過程中的結(jié)果依賴于彼此的執(zhí)行順序時,可能會產(chǎn)生競態(tài)條件。例如,兩個線程同時對同一個變量進行讀寫操作,由于執(zhí)行順序的不確定性,可能導(dǎo)致意外的結(jié)果。
????????不正確的同步:如果在多線程環(huán)境下沒有正確地使用同步機制,可能會導(dǎo)致線程安全問題。例如,沒有正確地使用鎖或其他同步工具來保護共享數(shù)據(jù),可能導(dǎo)致數(shù)據(jù)的不一致性。
????????死鎖:當多個線程互相等待對方釋放資源時,可能會發(fā)生死鎖。這種情況下,所有的線程都無法繼續(xù)執(zhí)行,導(dǎo)致程序無法正常運行。
????????線程安全問題的出現(xiàn)是由于多線程并發(fā)執(zhí)行引起的,當多個線程同時訪問和修改共享資源時,需要正確地使用同步機制來保證數(shù)據(jù)的一致性和正確性。
?? ?如何保證線程安全:
????????原子類(JUC):JDK從1.5開始提供了java.util.concurrent.atomic包,這個包中的原子操作類提供了一種用法簡單、性能高效、線程安全地更新一個變量的方式。在atomic包里一共提供了17個類,按功能可以歸納為4種類型的原子更新方式,分別是原子更新基本類型、原子更新引用類型、原子更新屬性、原子更新數(shù)組。無論原子更新哪種類型,都要遵循“比較和替換”規(guī)則,即比較要更新的值是否等于期望值,如果是則更新,如果不是則失敗。
????????volatile:是輕量級的synchronized,它在多處理器開發(fā)中保證了共享變量的“可見性”以及防止指令重排序,從而可以保證單個變量讀寫時的線程安全??梢娦詥栴}是由處理器核心的緩存導(dǎo)致的,每個核心均有各自的緩存,而這些緩存均要與內(nèi)存進行同步。volatile具有如下的內(nèi)存語義:當寫一個volatile變量時,該線程本地內(nèi)存中的共享變量的值會被立刻刷新到主內(nèi)存;當讀一個volatile變量時,該線程本地內(nèi)存會被置為無效,迫使線程直接從主內(nèi)存中讀取共享變量。
????????鎖:原子類和volatile只能保證單個共享變量的線程安全,鎖則可以保證臨界區(qū)內(nèi)的多個共享變量的線程安全,Java中加鎖的方式有兩種,分別是synchronized關(guān)鍵字和Lock接口。synchronized是比較早期的API,在設(shè)計之初沒有考慮到超時機制、非阻塞形式,以及多個條件變量。若想通過升級的方式讓它支持這些相對復(fù)雜的功能,則需要大改它的語法結(jié)構(gòu),不利于兼容舊代碼。因此,JDK的開發(fā)團隊在1.5新增了Lock接口,并通過Lock支持了上述的功能,即:支持響應(yīng)中斷、支持超時機制、支持以非阻塞的方式獲取鎖、支持多個條件變量(阻塞隊列)。
5.簡述Spring框架的核心功能,包括IOC和AOP。
?? ?spring框架是一款輕量級框架,核心是ioc控制翻轉(zhuǎn)和aop面向切面編程;
?? ?IOC:Spring IOC容器管理對象,IoC不是一種技術(shù),只是一種思想,一個重要的面向?qū)ο缶幊痰姆▌t,它能指導(dǎo)我們?nèi)绾卧O(shè)計出松耦合、更優(yōu)良的程序。傳統(tǒng)應(yīng)用程序都是由我們在類內(nèi)部主動創(chuàng)建依賴對象,從而導(dǎo)致類與類之間高耦合,難于測試;有了IoC容器后,把創(chuàng)建和查找依賴對象的控制權(quán)交給了容器,由容器進行注入組合對象,所以對象與對象之間是松散耦合,這樣也方便測試,利于功能復(fù)用,更重要的是使得程序的整個體系結(jié)構(gòu)變得非常靈活。
?? ?AOP:面向切面編程,aop是一種思想,是面向?qū)ο螅╫op)編程的一種補充。面向?qū)ο缶幊虒⒊绦虺槌蓚€各層次的對象,而面向切面編程是將程序抽象成各個切面。
SpringMVC框架中,控制器的作用是什么?怎樣配置控制器?
?? ?1.控制器復(fù)雜提供訪問應(yīng)用程序的行為,通常通過接口定義或注解定義兩種方法實現(xiàn)。2.控制器負責解析用戶的請求并將其轉(zhuǎn)換為一個模型。3.在Spring MVC中一個控制器類可以包含多個方法,在Spring MVC中,對于Controller的配置方式有很多種。
6.MyBatis框架中的Mapper是什么?如何使用?
?? ?在MyBatis框架中,Mapper是一個接口,用于定義數(shù)據(jù)庫操作的方法。Mapper接口定義了與數(shù)據(jù)庫交互的SQL語句,以及映射數(shù)據(jù)庫結(jié)果集到Java對象的規(guī)則。
????????Mapper接口中的方法通常對應(yīng)于數(shù)據(jù)庫的CRUD操作(增刪改查),例如插入數(shù)據(jù)、更新數(shù)據(jù)、刪除數(shù)據(jù)以及查詢數(shù)據(jù)等。MyBatis框架會根據(jù)Mapper接口的方法名和參數(shù)來動態(tài)生成相應(yīng)的SQL語句,并執(zhí)行數(shù)據(jù)庫操作。
????????Mapper接口的實現(xiàn)是由MyBatis框架自動生成的,無需手動編寫實現(xiàn)類。在MyBatis的配置文件中,需要將Mapper接口與相應(yīng)的映射文件(XML文件)進行關(guān)聯(lián),映射文件中定義了SQL語句的具體實現(xiàn)以及與Java對象之間的映射規(guī)則。
????????通過Mapper接口的方法,我們可以方便地進行數(shù)據(jù)庫操作,而無需編寫繁瑣的SQL語句和結(jié)果集映射代碼。這使得數(shù)據(jù)庫操作更加簡潔和易于維護。
7.經(jīng)常使用框架有什么好處?
使用框架有以下幾個好處:
- 提高開發(fā)效率:框架提供了一系列的工具、組件和規(guī)范,能夠簡化開發(fā)過程,減少重復(fù)性的代碼編寫。開發(fā)者可以直接使用框架提供的功能,而無需從頭開始構(gòu)建應(yīng)用程序的基礎(chǔ)結(jié)構(gòu),從而節(jié)省了開發(fā)時間和精力。
- 提供標準化和規(guī)范化:框架通常遵循一系列的設(shè)計原則、最佳實踐和標準化規(guī)范,使得代碼結(jié)構(gòu)更加清晰、可維護性更高。開發(fā)者可以基于框架進行開發(fā),遵循框架的規(guī)范,提高代碼的可讀性和可維護性。
- 提供高性能和優(yōu)化:框架通常經(jīng)過優(yōu)化和測試,能夠提供高性能的運行效果??蚣茉诘讓訉崿F(xiàn)了一些復(fù)雜的算法和數(shù)據(jù)結(jié)構(gòu),以提高應(yīng)用程序的性能和效率。
- 提供豐富的功能擴展:框架通常提供了豐富的功能擴展機制,可以根據(jù)需要選擇性地擴展和定制功能。開發(fā)者可以通過插件、模塊、擴展點等方式,將自己的代碼與框架集成,實現(xiàn)更多的功能和業(yè)務(wù)需求。
- 提供良好的文檔和社區(qū)支持:常見的框架通常擁有完善的文檔和活躍的社區(qū)支持,開發(fā)者可以通過官方文檔、教程、示例代碼等獲取幫助和解決問題。社區(qū)中的其他開發(fā)者也可以共享經(jīng)驗和提供支持,加快問題的解決和學(xué)習(xí)的進程。
????????綜上所述,使用框架可以提高開發(fā)效率、標準化代碼、提供高性能和豐富的功能擴展,同時還能夠獲取文檔和社區(qū)支持,使得開發(fā)過程更加便捷和高效。
8.synchronized和Renntrantlock的區(qū)別?后者怎么實現(xiàn)的?
????????synchronized是可重用鎖,他有倆種使用方式,方法或者代碼塊。加鎖的話是傳入一個人對象或者一個靜態(tài)類,其實是對對象頭進行一個操作,會把線程的id存儲到對象頭里面,線程在第二次調(diào)用這把鎖的時候,他去判斷這個id是不是鎖里面的id,如果是的話他就可以直接操作。因為是jvm自己管理的,所以鎖釋放的話,當run方法執(zhí)行完,也會直接釋放。
????????ReentrantLock需要手動加鎖和釋放,首先我們要加鎖,并在finally里面進行釋放。和synchronized相比,ReentrantLock用起來會復(fù)雜一些。在基本的加鎖和解鎖上,兩者是一樣的,所以無特殊情況下,推薦使用synchronized。ReentrantLock的優(yōu)勢在于它更靈活、更強大,增加了輪訓(xùn)、超時、中斷等高級功能
ReentrantLock是Java中的一個可重入鎖:
????????它的實現(xiàn)原理是基于AQS(AbstractQueuedSynchronizer)實現(xiàn)的。AQS是一個抽象的同步器,它提供了一種基于FIFO等待隊列的同步機制,可以用來實現(xiàn)各種同步器,如鎖、信號量、倒計時器等。
????????ReentrantLock內(nèi)部維護了一個state變量,用來表示鎖的狀態(tài)。當state為時,表示鎖是未鎖定狀態(tài);當state為1時,表示鎖是鎖定狀態(tài)。當一個線程請求鎖時,如果state為,表示鎖是未鎖定狀態(tài),那么該線程就可以獲得鎖,并將state設(shè)置為1;如果state為1,表示鎖已經(jīng)被其他線程鎖定了,那么該線程就會被加入到等待隊列中,等待其他線程釋放鎖。
????????ReentrantLock還支持可重入性,即同一個線程可以多次獲得同一個鎖,而不會被阻塞。這是通過維護一個owner變量來實現(xiàn)的,owner變量記錄了當前持有鎖的線程。當一個線程再次請求鎖時,如果它是當前持有鎖的線程,那么它可以直接獲得鎖,而不會被阻塞。當線程釋放鎖時,它會將state減1,如果state變?yōu)?,表示鎖已經(jīng)完全釋放,那么它會喚醒等待隊列中的一個線程,讓它獲得鎖。
????????總之,ReentrantLock的實現(xiàn)原理是基于AQS實現(xiàn)的,它通過維護一個state變量和一個等待隊列來實現(xiàn)鎖的功能,同時支持可重入性,保證同一個線程可以多次獲得同一個鎖。
9.什么是aqs?
????????AQS是英文單詞AbstractQueuedSynchronizer的縮寫,翻譯過來就是隊列同步器。
它是構(gòu)建鎖或者其他同步組件的基礎(chǔ)框架(如ReentrantLock、ReentrantReadWriteLock、Semaphore等),JUC并發(fā)包的作者(Doug Lea)期望它能夠成為實現(xiàn)大部分同步需求的基礎(chǔ)。它是JUC并發(fā)包中的核心基礎(chǔ)組件。
????????AQS的主要使用方式是繼承,子類通過繼承同步器并實現(xiàn)它的抽象方法來管理同步狀態(tài)。
10.請簡單介紹一下MySQL數(shù)據(jù)庫,并說明其特點和優(yōu)劣。
????????MySQL是一個 關(guān)系型數(shù)據(jù)庫管理系統(tǒng),由瑞典MySQL AB 公司開發(fā),目前屬于 ?Oracle 旗下產(chǎn)品。MySQL 是最流行的 關(guān)系型數(shù)據(jù)庫管理系統(tǒng)之一,在 WEB 應(yīng)用方面,MySQL是最好的 ?RDBMS (Relational Database Management System,關(guān)系數(shù)據(jù)庫管理系統(tǒng)) 應(yīng)用軟件。
????????優(yōu)點:文章來源:http://www.zghlxwxcb.cn/news/detail-599917.html
- 體積小、速度快、總體擁有成本低,開源,提供的接口支持多種語言連接操作
- MySQL 的核心程序采用完全的多線程編程。線程是輕量級的進程,它可以靈活地為用戶提供服務(wù),而不過多的系統(tǒng)資源。用多線程和C語言實現(xiàn)的MySQL ,充分利用CPU資源
- 有一個非常靈活而且安全的權(quán)限和口令系統(tǒng)。當客戶與MySQL 服務(wù)器連接時,他們之間所有的口令傳送被加密,而且MySQL 支持主機認證
- 支持大型的數(shù)據(jù)庫, 可以方便地支持上千萬條記錄的數(shù)據(jù)庫。作為一個開放源代碼的數(shù)據(jù)庫,可以針對不同的應(yīng)用進行相應(yīng)的修改
- 支持多種操作系統(tǒng),如Linux、Windows、AIX、FreeBSD、HP-UX、MacOS、NovellNetware、OpenBSD、OS/2 Wrap、Solaris等
- 提供多語言支持,常見的編碼如GB2312、BIG5、UTF8
????????缺點:文章來源地址http://www.zghlxwxcb.cn/news/detail-599917.html
- 不支持熱備份
- 不支持自定義數(shù)據(jù)類型
- 對存儲過程和觸發(fā)器支持不夠友好
- MySQL最大的缺點是其安全系統(tǒng),主要是復(fù)雜而非標準,另外只有到調(diào)用mysqladmin來重讀用戶權(quán)限時才發(fā)生改變
到了這里,關(guān)于java面試真題【上冊】的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!