天天看點

java 常見基礎題

Java中==和equals和hashCode的差別

基本資料類型的​

​==​

​比較的值相等.

類的​

​==​

​​比較的記憶體的位址,即是否是同一個對象,在不覆寫​

​equals​

​​的情況下,同比較記憶體位址,原實作也為​

​==​

​​ ,如​

​String​

​​等重寫了​

​equals​

​方法.

​hashCode​

​​也是​

​Object​

​​類的一個方法。傳回一個離散的​

​int​

​​型整數。在集合類操作中使用,為了提高查詢速度。​

​(HashMap,HashSet等比較是否為同一個)​

如果兩個對象​

​equals,Java​

​​運作時環境會認為他們的​

​hashcode​

​一定相等。

如果兩個對象不​

​equals​

​​,他們的​

​hashcode​

​有可能相等。

如果兩個對象​

​hashcode​

​​相等,他們不一定​

​equals​

​。

如果兩個對象​

​hashcode​

​​不相等,他們一定不​

​equals​

​。

int與integer的差別

​int​

​ 基本類型

​integer​

​​ 對象​

​int​

​的封裝類

String、StringBuffer、StringBuilder差別

​String:​

​ 字元串常量 不适用于經常要改變值得情況,每次改變相當于生成一個新的對象

​StringBuffer:​

​ 字元串變量 (線程安全)

​StringBuilder:​

​ 字元串變量(線程不安全) 確定單線程下可用,效率略高于StringBuffer

什麼是内部類?内部類的作用

内部類可直接通路外部類的屬性

​Java​

​​中内部類主要分為​

​成員内部類​

​​、​

​局部内部類​

​​(嵌套在方法和作用域内)、​

​匿名内部類​

​​(沒構造方法)、​

​靜态内部類​

​(static修飾的類,不能使用任何外圍類的非static成員變量和方法, 不依賴外圍類)

程序和線程的差別

​程序​

​​是​

​cpu​

​​資源配置設定的最小機關,

​​

​線程​

​​是​

​cpu​

​排程的最小機關。

程序之間不能共享資源,而線程共享所在程序的位址空間和其它資源。

一個程序内可擁有多個線程,程序可開啟程序,也可開啟線程。

一個線程隻能屬于一個程序,線程可直接使用同程序的資源,線程依賴于程序而存在。

final,finally,finalize的差別

​final:​

​ 修飾類、成員變量和成員方法,類不可被繼承,成員變量不可變,成員方法不可重寫

​finally:​

​​ 與​

​try...catch...​

​共同使用,確定無論是否出現異常都能被調用到

​finalize:​

​​ 類的方法,垃圾回收之前會調用此方法,子類可以重寫​

​finalize()​

​方法實作對資源的回收。

Serializable 和Parcelable 的差別

​Serializable​

​​

​Java​

​序列化接口 在硬碟上讀寫 讀寫過程中有大量臨時變量的生成,内部執行大量的​

​i/o​

​操作,效率很低。

​Parcelable​

​​

​Android​

​序列化接口 效率高 使用麻煩 在記憶體中讀寫(​

​AS​

​有相關插件 一鍵生成所需方法) ,對象不能儲存到磁盤中。

靜态屬性和靜态方法是否可以被繼承?是否可以被重寫?以及原因?

可繼承 不可重寫 而是被隐藏

如果子類裡面定義了靜态方法和屬性,那麼這時候父類的靜态方法或屬性稱之為​

​"隐藏"​

​​。如果你想要調用父類的靜态方法和屬性,直接通過​

​父類名.方法​

​​或​

​變量​

​名完成。

成員内部類、靜态内部類、局部内部類和匿名内部類的了解,以及項目中的應用

​Java​

​​中内部類主要分為​

​成員内部類​

​​、​

​局部内部類​

​​(嵌套在方法和作用域内)、​

​匿名内部類​

​​(沒構造方法)、​

​靜态内部類​

​​(​

​static​

​​修飾的類,不能使用任何外圍類的非​

​static​

​成員變量和方法, 不依賴外圍類)

​使用内部類最吸引人的原因是:​

​ 每個内部類都能獨立地繼承一個(接口的)實作,是以無論外圍類是否已經繼承了某個(接口的)實作,對于内部類都沒有影響。

因為​

​Java​

​不支援多繼承,支援實作多個接口。但有時候會存在一些使用接口很難解決的問題,這個時候我們可以利用内部類提供的、可以繼承多個具體的或者抽象的類的能力來解決這些程式設計問題。可以這樣說,接口隻是解決了部分問題,而内部類使得多重繼承的解決方案變得更加完整。

哪些情況下的對象會被垃圾回收機制處理掉?

  1. 所有執行個體都沒有活動線程通路。
  2. 沒有被其他任何執行個體通路的循環引用執行個體。
  3. ​Java​

    ​ 中有不同的引用類型。判斷執行個體是否符合垃圾收集的條件都依賴于它的引用類型。

要判斷怎樣的對象是沒用的對象。這裡有​

​2​

​種方法:

  1. 采用标記計數的方法:

給記憶體中的對象給打上标記,對象被引用一次,計數就加​

​1​

​​,引用被釋放了,計數就減一,當這個計數為​

​0​

​的時候,這個對象就可以被回收了。當然,這也就引發了一個問題:循環引用的對象是無法被識别出來并且被回收的。是以就有了第二種方法:

  1. 采用根搜尋算法:

從一個根出發,搜尋所有的可達對象,這樣剩下的那些對象就是需要被回收的。

靜态代理和動态代理的差別,什麼場景使用?

​靜态代理類:​

​ 由程式員建立或由特定工具自動生成源代碼,再對其編譯。在程式運作前,代理類的.class檔案就已經存在了。

​動态代理類:​

​ 在程式運作時,運用反射機制動态建立而成。

Java中實作多态的機制是什麼?

方法的重寫​

​Overriding​

​​和重載​

​Overloading​

​​是​

​Java​

​多态性的不同表現

​重寫​

​​

​Overriding​

​是父類與子類之間多态性的一種表現

​重載​

​​

​Overloading​

​是一個類中多态性的一種表現.

HashMap和HashTable的差別

​HashMap​

​​ 不是線程安全的,效率高一點、方法不是​

​Synchronize​

​的要提供外同步,有​

​containsvalue​

​和​

​containsKey​

​方法。

HashMap與HashSet的差別