帶你了解10道java入門面試題
1. 談?wù)勀銓γ嫦驅(qū)ο蟮牧私猓?(談?wù)勀銓γ嫦驅(qū)ο蠛兔嫦蜻^程的了解?)
面向?qū)ο笈c面向過程相比較,面向過程注重事件的步驟與順序,比較直接高效,面向?qū)ο笞⒅厥录⑴c的對象與對象各己需要做的事,更易于復(fù)用,維護與擴展。(以舉例來說明更加形象)
(例:拿常見手機支付來看)
面向過程
:1,手機掃碼——>2,輸入密碼——>3,確認(rèn)是否支付成功——>4,離開
面向?qū)ο?/code>:拆出人與手機二個對象,(人:輸入密碼,離開,手機:手機掃碼,確認(rèn)是否支付成功)
下面就要談?wù)劽嫦驅(qū)ο蟮娜筇卣鳎悍庋b。繼承與多態(tài)
封裝的意義
:明確標(biāo)識出允許外部使用的屬性與方法,內(nèi)部細(xì)節(jié)對外部隱藏,外部調(diào)用無需修改和關(guān)心內(nèi)部如何實現(xiàn)。
繼承
:繼承父類(基類)的方法,不包括私有化的部分,引用父類的方法或者按自己需求進行修改與擴展。
多態(tài)
:(條件:1,在繼承的基礎(chǔ)上,2,存在方法重寫,3,父類的引用指向子類的對象),基于對象所屬類的不同,子類對父類同一個方法的調(diào)用,實際執(zhí)行的邏輯不同。(無法調(diào)用調(diào)用子類特有的方法)。
2.==與equals的比較(筆試中常見)
==
:比較的是棧中的值,基本上就是比較的變量當(dāng)中的值,引用類型是堆中的內(nèi)存對象地址、
equals
:Object默認(rèn)采用“==”比較,通常繼承后會進行重寫比較的為對象的內(nèi)容(例如String)。
例題:
public class Taxi { public static void main(String[] args) { String str1="hello"; String str2=new String("hello"); String str3=str2; System.out.println(str1==str2);//false System.out.println(str1==str3);//false System.out.println(str2==str3);//true System.out.println(str1.equals(str2));//true System.out.println(str1.equals(str3));//true System.out.println(str2.equals(str3));//true } }
解析:在Java中字符串是對象,字符串在生成時其實是在內(nèi)存常量池當(dāng)中生成。所以str1指向的“hello”的對象內(nèi)存地址,str2因為new關(guān)鍵字在堆中開辟內(nèi)存,但內(nèi)存指向常量池中的“hello”,str2指向開辟內(nèi)存的對象地址。str3==str2,所以str3指向str2指向開辟內(nèi)存的對象地址。因為str1與str2和str1與str3“==”比較內(nèi)存地址不同返回flase,str2與str3的內(nèi)存地址相同返回ture,字符串方法中equals重寫過,比較的是內(nèi)容,str1與str2與str3的內(nèi)容相同為“hello”,所以返回的是ture.
3.fianl關(guān)鍵字
final的作用:
類 | 該類不能被繼承 |
方法 | 該方法不能被重寫,但可以重載 |
變量 | 變量一旦被賦值就不能修改 |
成員變量(普通) | 在聲明的時候就需要賦值,或者靜態(tài)塊中與構(gòu)造函數(shù)中賦值 |
成員變量(靜態(tài)) | 在聲明的時候就需要賦值,或者靜態(tài)塊中賦值 |
局部變量 | 系統(tǒng)不會給變量初始化,必須程序員寫入,在初始化時不會報錯,但在使用前一定要初始化,不然報錯 |
基本數(shù)據(jù)類型 | 基本數(shù)據(jù)類型的數(shù)值初始化后不能改變 |
引用數(shù)據(jù)類型 | 初始化后不能指向另一個對象,但引用的值是可以改變的 |
4.為什么局部內(nèi)部類與匿名內(nèi)部類只能訪問局部的final變量?
首先必須知道,內(nèi)部類與外部類,內(nèi)部類不會因為定義在方法中,跟方法執(zhí)行完一起回收,就會產(chǎn)生一個問題,外部方法結(jié)束時,就會回收局部變量,但內(nèi)部類對象(當(dāng)沒有引用時回收)還存在,就存在了一個問題,內(nèi)部類訪問了一個不存在的變量,所以在jdk當(dāng)中為了解決這個辦法,局部就復(fù)制了一份內(nèi)部類成員變量,當(dāng)局部變量回收后仍可以訪問局部變量,但實際訪問的是“copy”過的值。(為了復(fù)制的局部變量必須與原局部變量一樣,所以使用final修飾)
public class Management { private int id=10; //final修飾局部變量 public void outPrint(final String x){ class InClass{ public void Inprint(){ System.out.println(x); System.out.println(id); } } new InClass().Inprint(); } public static void main(String[] args) { Management m=new Management(); m.outPrint("小羅"); } }
5.String,StringBuffer,StringBuilder 三者的區(qū)別與使用場景?
String
:final修飾的,不可變的,每次操作會產(chǎn)生新的對象。
StringBuffer
,StringBuilder
:對原對象進行操作,不產(chǎn)生新對象。
性能上
:StringBuilder (線程不安全)> StringBuffer(線程安全) > String
使用場景
:當(dāng)需要對字符串內(nèi)容進行多次改變時,使用StringBuffer,StringBuilder。但因為性能原因優(yōu)先使用StringBuilder ,需要多線程,共享變量時使用StringBuffer。
6.重載和重寫(覆蓋)的區(qū)別?
重載:發(fā)生在類當(dāng)中,方法名稱必須相同,參數(shù)的類型,個數(shù)順序不同。方法返回值與修飾符可以不同。(下圖:不是重載,方法名稱必須相同,參數(shù)的類型,個數(shù)順序相同,重載與返回值沒有關(guān)系)
public void outPrint(String x,int i){ } public int outPrint(String x,int i){ //這個不是重載,編譯時會報錯 }
重寫(覆蓋):發(fā)生在繼承的父類與子類當(dāng)中,方法名與參數(shù)列表必須相同,返回值的范圍小于等于父類,如果存在異常,拋出異常范圍小于等于父類,修飾符的權(quán)限必須大于等于父類。如果父類方法以private修飾則子類不能重寫該方法。
7.接口與抽象類的區(qū)別?
1,抽象類可以存在普通成員函數(shù),而接口只能存在public abstract 方法,
2,抽象類只能繼承一個,而接口可以s實現(xiàn)多個。
3,抽象類中成員變量可以是任何類型,而接口中成員變量只能是public static final 類型的。
(高級:接口設(shè)計的目的:是對類行為進行約束,抽象類的目的:提高代碼的復(fù)用性,抽象類不允許實例化)
使用場景:當(dāng)你關(guān)注的是事務(wù)本身時,就用抽象類,當(dāng)你關(guān)注操作時就使用接口。
8.list與set的區(qū)別?
list
:有序,可重復(fù)的,按對象進入順序進行存儲,允許多個null對象,可以使用迭代器取出所以元素,還可以所以get方法獲取指定下標(biāo)的元素。
set
:無序,不可重復(fù)。只允許有一個null對象,只能使用迭代器遍歷元素。
9.hashCode與equals
equals
:Object默認(rèn)采用“==”比較,通常繼承后會進行重寫比較的為對象的內(nèi)容(例如String)。
hashCode
:定義在Object中hashCode()會獲取哈希碼(又稱為散列碼),確定哈希表表上的索引,并返回int整數(shù)。特點“根據(jù)鍵快速找到與之對應(yīng)的值”
聯(lián)系與規(guī)則:
1,如果二個對象相等,hashCode一定也是相等的
2,如果二個對象相等,二個對象調(diào)用equals返回ture。
3,二個對象的hashCode一樣,他們不一定相等。
4,equals方法被覆蓋,hashCode方法也必須覆蓋。
5,hashCode默認(rèn)行為是堆上的對象獨特值,如果沒有重寫hashCode(),則該類二個對象無論如何都不會相等。
10.ArryList與LinkList的區(qū)別?
ArryList:基于動態(tài)數(shù)組,連續(xù)存儲,適合下標(biāo)訪問,擴容機制:因為數(shù)組長度是固定的,超過固定長度會新建立一個數(shù)組,長度擴大原來1.5倍,回收老數(shù)組。
LinkList:基于列表,可以存儲在分散的內(nèi)存當(dāng)中。適合插入,刪除,不適合查詢。LinkList一般使用迭代器進行遍歷。不建議使用for循環(huán)遍歷,因為每一次遍歷都會get方法,消耗性能大,不使用indexOf來返回元素索引,和遍歷元素。用indexOf遍歷list進行遍歷時,當(dāng)結(jié)果為空時還遍歷這個列表。
總結(jié)
本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
使用java基于pushlet和bootstrap實現(xiàn)的簡單聊天室
這篇文章主要介紹了使用java基于pushlet和bootstrap實現(xiàn)的簡單聊天室的相關(guān)資料,需要的朋友可以參考下2015-03-03Java生成指定范圍內(nèi)的一個隨機整數(shù)2種方式
本文主要介紹了Java生成指定范圍內(nèi)的一個隨機整數(shù)2種方式,主要使用Math.random()和Random.nextInt()這兩種,具有一定的參考價值,感興趣的可以了解一下2023-04-04idea雙擊圖標(biāo)打不開,無反應(yīng)的解決
這篇文章主要介紹了idea雙擊圖標(biāo)打不開,無反應(yīng)的解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-09-09