Java基礎(chǔ)知識點面試專題

1、java中==和equals和hashCode的區(qū)別

1)==若是基本數(shù)據(jù)類型比較,是比較值,若是引用類型,則比較的是他們在內(nèi)存中的存放地址。對象是存放在堆中,棧中存放的對象的引用,所以==是對棧中的值進行比較,若返回true代表變量的內(nèi)存地址相等;

2)equals是Object類中的方法,Object類的equals方法用于判斷對象的內(nèi)存地址引用是不是同一個地址(是不是同一個對象)。若是類中覆蓋了equals方法,就要根據(jù)具體代碼來確定,一般覆蓋后都是通過對象的內(nèi)容是否相等來判斷對象是否相等。

3)hashCode()計算出對象實例的哈希碼,在對象進行散列時作為key存入。之所以有hashCode方法,因為在批量的對象比較中,hashCode比較要比equals快。在添加新元素時,先調(diào)用這個元素的hashCode方法,一下子能定位到它應該旋轉(zhuǎn)的物理位置,若該位置沒有元素,可直接存儲;若該位置有元素,就調(diào)用它的equals方法與新元素進行比較,若相同則不存,不相同,就放到該位置的鏈表末端。

4)equals與hashCode方法關(guān)系:

hashCode()是一個本地方法,實現(xiàn)是根據(jù)本地機器上關(guān)的。equals()相等的對象,hashCode()也一定相等;hashCode()不等,equals()一定也不等;hashCode()相等,equals()可能相等,也可能不等。

所以在重寫equals(Object obj)方法,有必要重寫hashCode()方法,確保通過equals(Object obj)方法判斷結(jié)果為true的兩個對象具備相等的hashCode()返回值。

5)equals與==的關(guān)系:

Integer b1 = 127;在java編譯時被編譯成Integer b1 = Integer.valueOf(127);對于-128到127之間的Integer值,用的是原生數(shù)據(jù)類型int,會在內(nèi)存里供重用,也就是這之間的Integer值進行==比較時,只是進行int原生數(shù)據(jù)類型的數(shù)值進行比較。而超出-128?127的范圍,進行==比較時是進行地址及數(shù)值比較。

2、int、char、long各占多少字節(jié)數(shù)

int\float占用4個字節(jié),short\char占用2個字節(jié),long占用8個字節(jié),byte/boolean占用1個字節(jié)

基本數(shù)據(jù)類型存放在棧里,包裝類棧里存放的是對象的引用,即值的地址,而值存放在堆里。

3、int與integer的區(qū)別

Integer是int的包裝類,int則是java的一種基本數(shù)據(jù)類型,Integer變量必須實例化才能使用,當new一個Integer時,實際是生成一個指向此對象的引用,而int是直接存儲數(shù)據(jù)的值,Integer默認值是null,而int默認值是0

4、談談對java多態(tài)的理解

同一個消息可以根據(jù)發(fā)送對象的不同而采用多種不同的行為方式,在執(zhí)行期間判斷所引用的對象的實際類型,根據(jù)其實際的類型調(diào)用其相應的方法。

作用:消除類型之間的耦合關(guān)系。實現(xiàn)多態(tài)的必要條件:繼承、重寫(因為必須調(diào)用父類中存在的方法)、父類引用指向子類對象

5、String、StringBuffer、StringBuilder區(qū)別

都是字符串類,String類中使用字符數(shù)組保存字符串,因有final修飾符,String對象是不可變的,每次對String操作都會生成新的String對象,這樣效率低,且浪費內(nèi)存空間。但線程安全。

StringBuilder和StringBuffer也是使用字符數(shù)組保存字符,但這兩種對象都是可變的,即對字符串進行append操作,不會產(chǎn)生新的對象。它們的區(qū)別是:StringBuffer對方法加了同步鎖,是線程安全的,StringBuilder非線程安全。

6、什么是內(nèi)部類?內(nèi)部類的作用

內(nèi)部類指在類的內(nèi)部再定義另一個類。

內(nèi)部類的作用:1)實現(xiàn)多重繼承,因為java中類的繼承只能單繼承,使用內(nèi)部類可達到多重繼承;2)內(nèi)部類可以很好的實現(xiàn)隱藏,一般非內(nèi)部類,不允許有private或protected權(quán)限的,但內(nèi)部類可以;3)減少了類文件編譯后產(chǎn)生的字節(jié)碼文件大小;

內(nèi)部類在編譯完后也會產(chǎn)生.class文件,但文件名稱是:外部類名稱$內(nèi)部類名稱.class。分為以下幾種:

1)成員內(nèi)部類,作為外部類的一個成員存在,與外部類的屬性、方法并列,成員內(nèi)部類持有外部類的引用,成員內(nèi)部類不能定義static變量和方法。應用場合:每一個外部類都需要一個內(nèi)部類實例,內(nèi)部類離不開外部類存在。

2)靜態(tài)內(nèi)部類,內(nèi)部類以static聲明,其他類可通過外部類.內(nèi)部類來訪問。特點:不會持有外部類的引用,可以訪問外部類的靜態(tài)變量,若要訪問成員變量須通過外部類的實例訪問。應用場合:內(nèi)部類不需要外部類的實例,僅為外部類提供或邏輯上屬于外部類,邏輯上可單獨存在。設(shè)計的意義:加強了類的封裝性(靜態(tài)內(nèi)部類是外部類的子行為或子屬性,兩者保持著一定關(guān)系),提高了代碼的可讀性(相關(guān)聯(lián)的代碼放在一起)。

3)匿名內(nèi)部類,在整個操作中只使用一次,沒有名字,使用new創(chuàng)建,沒有具體位置。

4)局部內(nèi)部類,在方法內(nèi)或是代碼塊中定義類,

7、抽象類和接口區(qū)別

抽象類在類前面須用abstract關(guān)鍵字修飾,一般至少包含一個抽象方法,抽象方法指只有聲明,用關(guān)鍵字abstract修飾,沒有具體的實現(xiàn)的方法。因抽象類中含有無具體實現(xiàn)的方法,固不能用抽象類創(chuàng)建對象。當然如果只是用abstract修飾類而無具體實現(xiàn),也是抽象類。抽象類也可以有成員變量和普通的成員方法。抽象方法必須為public或protected(若為private,不能被子類繼承,子類無法實現(xiàn)該方法)。若一個類繼承一個抽象類,則必須實現(xiàn)父類中所有的抽象方法,若子類沒有實現(xiàn)父類的抽象方法,則也應該定義為抽象類。

接口用關(guān)鍵字interface修飾,接口也可以含有變量和方法,接口中的變量會被隱式指定為public static final變量。方法會被隱式的指定為public abstract,接口中的所有方法均不能有具體的實現(xiàn),即接口中的方法都必須為抽象方法。若一個非抽象類實現(xiàn)某個接口,必須實現(xiàn)該接口中所有的方法。

區(qū)別:

1)抽象類可以提供成員方法實現(xiàn)的細節(jié),而接口只能存在抽象方法;

2)抽象類的成員變量可以是各種類型,而接口中成員變量只能是public static final類型;

3)接口中不能含有靜態(tài)方法及靜態(tài)代碼塊,而抽象類可以有靜態(tài)方法和靜態(tài)代碼塊;

4)一個類只能繼承一個抽象類,用extends來繼承,卻可以實現(xiàn)多個接口,用implements來實現(xiàn)接口。

7.1、抽象類的意義

抽象類是用來提供子類的通用性,用來創(chuàng)建繼承層級里子類的模板,減少代碼編寫,有利于代碼規(guī)范化。

7.2、抽象類與接口的應用場景

抽象類的應用場景:1)規(guī)范了一組公共的方法,與狀態(tài)無關(guān),可以共享的,無需子類分別實現(xiàn);而另一些方法卻需要各個子類根據(jù)自己特定狀態(tài)來實現(xiàn)特定功能;

2)定義一組接口,但不強迫每個實現(xiàn)類都必須實現(xiàn)所有的方法,可用抽象類定義一組方法體可以是空方法體,由子類選擇自己感興趣的方法來覆蓋;

7.3****、抽象類是否可以沒有方法和屬性?

可以

7.4、接口的意義

1)有利于代碼的規(guī)范,對于大型項目,對一些接口進行定義,可以給開發(fā)人員一個清晰的指示,防止開發(fā)人員隨意命名和代碼混亂,影響開發(fā)效率。

2)有利于代碼維護和擴展,當前類不能滿足要求時,不需要重新設(shè)計類,只需要重新寫了個類實現(xiàn)對應的方法。

3)解耦作用,全局變量的定義,當發(fā)生需求變化時,只需改變接口中的值即可。

4)直接看接口,就可以清楚知道具體實現(xiàn)類間的關(guān)系,代碼交給別人看,別人也能立馬明白。

8、泛型中extends和super的區(qū)別

<? extends T>限定參數(shù)類型的上界,參數(shù)類型必須是T或T的子類型,但對于List<? extends T>,不能通過add()來加入元素,因為不知道<? extends T>是T的哪一種子類;

<? super T>限定參數(shù)類型的下界,參數(shù)類型必須是T或T的父類型,不能能過get()獲取元素,因為不知道哪個超類;

9、父類的靜態(tài)方法能否被子類重寫?靜態(tài)屬性和靜態(tài)方法是否可以被繼承?

父類的靜態(tài)方法和屬性不能被子類重寫,但子類可以繼承父類靜態(tài)方法和屬性,如父類和子類都有同名同參同返回值的靜態(tài)方法show(),聲明的實例Father father = new Son(); (Son extends Father),會調(diào)用father對象的靜態(tài)方法。靜態(tài)是指在編譯時就會分配內(nèi)存且一直存在,跟對象實例無關(guān)。

10、進程和線程的區(qū)別

進程:具有一定獨立功能的程序,是系統(tǒng)進行資源分配和調(diào)度運行的基本單位。

線程:進程的一個實體,是CPU調(diào)度的苯單位,也是進程中執(zhí)行運算的最小單位,即執(zhí)行處理機調(diào)度的基本單位,如果把進程理解為邏輯上操作系統(tǒng)所完成的任務,線程則表示完成該任務的許多可能的子任務之一。

關(guān)系:一個進程可有多個線程,至少一個;一個線程只能屬于一個進程。同一進程的所有線程共享該進程的所有資源。不同進程的線程間要利用消息通信方式實現(xiàn)同步。

區(qū)別:進程有獨立的地址空間,而多個線程共享內(nèi)存;進程具有一個獨立功能的程序,線程不能獨立運行,必須依存于應用程序中;

11、final,finally,finalize的區(qū)別

final:變量、類、方法的修飾符,被final修飾的類不能被繼承,變量或方法被final修飾則不能被修改和重寫。

finally:異常處理時提供finally塊來執(zhí)行清除操作,不管有沒有異常拋出,此處代碼都會被執(zhí)行。如果try語句塊中包含return語句,finally語句塊是在return之后運行;

finalize:Object類中定義的方法,若子類覆蓋了finalize()方法,在在垃圾收集器將對象從內(nèi)存中清除前,會執(zhí)行該方法,確定對象是否會被回收。

12、序列化Serializable 和Parcelable 的區(qū)別

序列化:將一個對象轉(zhuǎn)換成可存儲或可傳輸?shù)臓顟B(tài),序列化后的對象可以在網(wǎng)絡(luò)上傳輸,也可以存儲到本地,或?qū)崿F(xiàn)跨進程傳輸;

為什么要進行序列化:開發(fā)過程中,我們需要將對象的引用傳給其他activity或fragment使用時,需要將這些對象放到一個Intent或Bundle中,再進行傳遞,而Intent或Bundle只能識別基本數(shù)據(jù)類型和被序列化的類型。

Serializable:表示將一個對象轉(zhuǎn)換成可存儲或可傳輸?shù)臓顟B(tài)。

Parcelable:與Serializable實現(xiàn)的效果相同,也是將一個對象轉(zhuǎn)換成可傳輸?shù)臓顟B(tài),但它的實現(xiàn)原理是將一個完整的對象進行分解,分解后的每一部分都是Intent所支持的數(shù)據(jù)類型,這樣實現(xiàn)傳遞對象的功能。

Parcelable****實現(xiàn)序列化的重要方法:序列化功能是由writeToParcel完成,通過Parcel中的write方法來完成;反序列化由CREATOR完成,內(nèi)部標明了如何創(chuàng)建序列化對象及數(shù)級,通過Parcel的read方法完成;內(nèi)容描述功能由describeContents方法完成,一般直接返回0。

區(qū)別:Serializable在序列化時會產(chǎn)生大量臨時變量,引起頻繁GC。Serializable本質(zhì)上使用了反射,序列化過程慢。Parcelable不能將數(shù)據(jù)存儲在磁盤上,在外界變化時,它不能很好的保證數(shù)據(jù)的持續(xù)性。

選擇原則:若僅在內(nèi)存中使用,如activity\service間傳遞對象,優(yōu)先使用Parcelable,它性能高。若是持久化操作,優(yōu)先使用Serializable

注意:靜態(tài)成員變量屬于類,不屬于對象,固不會參與序列化的過程;用transient關(guān)鍵字編輯的成員變量不會參與序列化過程;可以通過重寫writeObject()和readObject()方法來重寫系統(tǒng)默認的序列化和反序列化。

13、談談對kotlin的理解

特點:1)代碼量少且代碼末尾沒有分號;2)空類型安全(編譯期處理了各種null情況,避免執(zhí)行時異常);3)函數(shù)式的,可使用lambda表達式;4)可擴展方法(可擴展任意類的的屬性);5)互操作性強,可以在一個項目中使用kotlin和java兩種語言混合開發(fā);

14、string 轉(zhuǎn)換成 integer的方式及原理

1)parseInt(String s)內(nèi)部調(diào)用parseInt(s, 10)默認為10進制 。

2)正常判斷null\進制范圍,length等。

3)判斷第一個字符是否是符號位。

4)循環(huán)遍歷確定每個字符的十進制值。

5)通過*=和-=進行計算拼接。

6)判斷是否為負值返回結(jié)果。

謝謝你的閱讀,如果您覺得這篇博文對你有幫助,請點贊或者喜歡,讓更多的人看到!祝你每天開心愉快!

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

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

  • 1.java中==和equals和hashCode的區(qū)別 1)==若是基本數(shù)據(jù)類型比較,是比較值,若是引用類型,則...
    Fitz_e74a閱讀 4,507評論 1 1
  • 注:都是在百度搜索整理的答案,如有侵權(quán)和錯誤,希告知更改。 一、java中==和equals和hashCode的區(qū)...
    Jenchar閱讀 639評論 1 2
  • java基礎(chǔ) 集合承繼包含圖 Collection vs Collections 首先,"Collection" ...
    onlyHalfSoul閱讀 1,427評論 0 5
  • 1.import static是Java 5增加的功能,就是將Import類中的靜態(tài)方法,可以作為本類的靜態(tài)方法來...
    XLsn0w閱讀 1,419評論 0 2
  • 面向?qū)ο笾饕槍γ嫦蜻^程。 面向過程的基本單元是函數(shù)。 什么是對象:EVERYTHING IS OBJECT(萬物...
    sinpi閱讀 1,218評論 0 4

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