JAVA基礎理解(三)

1.強引用和軟引用和弱引用以及虛引用

  • 強引用

    最普遍的一種引用方式,如String s = “abc”,變量s就是字符串"abc"的強引用,只要強引用存在,則垃圾回收器就不會回收這個對象。

  • 軟引用(SoftReference)

    用於描述還有用但非必須的對象,如果內存足夠,不回收,如果內存不足,則回收。一般用於實現內存敏感的高速緩存,軟引用可以和引用隊列ReferenceQueue聯合使用,若果軟引用的對象被垃圾回收,JVM就會把這個軟引用加入到與之關聯的引用隊列中。

  • 弱引用(WeakReference)

    弱引用和軟引用大致相同,弱引用與軟引用的區別在於:只具有弱引用的對象擁有更短暫的生命週期。在垃圾回收期線程掃描它所管轄的內存區域的過程中,一旦發現了只具有弱引用的對象,不管當前內存空間足夠與否,都會回收它的內存。

  • 虛引用(PhantomReference)

    就是形同虛設,與其他幾種引用都不同,虛引用並不會決定對象的生命週期,如果一個對象僅支持有虛引用,那麼它就和沒有引用一樣,在任何時候都可能被垃圾回收期回收。虛引用主要用來跟蹤對象被垃圾回收的活動。

    虛引用與軟引用和弱引用的一個區別在於:

    虛引用必須和引用隊列(ReferenceQueue)聯合使用。當垃圾回收期準備回收一個對象時,如果發現它還有虛引,就會在回收對象的內存之前,把這個虛引用加入到與之關聯的引用隊列中。

2.數組在內存中如何分配

當一個對象使用new 關鍵字創建的時候,會在堆上分配內存空間,然後才返回到對象的引用。這對數組來說也是一樣的,因爲數組也是一個對象,簡單的值類型的數組,每個數組的成員是一個引用(指針),引用到棧上的空間。

3.Java中怎麼創建一個不可變對象?

  • 對象的狀態在構造函數之後都不能被修改,任何修改應該通過創建一個新對象來實現。
  • 所有的對象的屬性應該都設置成final。
  • 對象的創建要正確,例如:對象的應用不能在構造函數中被泄露出去
  • 對象要設置爲final,確保不要繼承的Class修改了immutability 不變性特性

26.Java中++操作符是線程安全的嘛?

不是線程安全的操作,其涉及到多個指令,如讀取變量值,增加,然後存儲回內存,這個過程可能會出現多個線程交叉。

4.new一個對象的過程和clone一個對象的過程

new操作符號的本意是分配內存。程序執行到new操作符時,首先去看new操作符後面的類型,因爲知道了類型,才能知道要分配多大的內存空間。分配完內存空間之後,再調用構造函數,填充對象的各個域,這一步叫做對象的初始化,構造方法返回後,一個對象創建完畢,可以把它的引用地址發佈到外部,在外部就可以使用這個引用操縱這個對象。

clone在第一步和new是相似的,都是分配內存,調用clone方法時,分配的內存和原對象(即調用clone方法的對象)相同,然後在使用原對象中對應的各個域,填充新對象的域,填充完成之後,clone方法返回,一個新的相同的對象被創建,同樣可以把這個新對象的引用發佈到外部。

5.Java中==和equals()的區別?

使用==比較原生類型如:boolean、int、char等等。使用equals()比較對象。

1、==是判斷兩個變量或實例是不是指向同一個內存空間。equals是判斷兩個變量或實例鎖指向的內存空間的值是不是相同。

2、==是指對內存地址進行比較。equals()是對字符串的內容進行比較。

3、==指引用是否相同。equals()指的是值是否相同。

6.final、finalize 和 finally 的不同之處?

final 用於聲明屬性,方法和類,分別表示屬性不可變,方法不可覆蓋,類不可繼承。

finally 是異常處理語句結構的一部分,表示總是執行。

finalize 是 Object 類的一個方法,在GC(垃圾回收器)執行的時候會調用被回收對象的此方法,可以覆蓋此方法提供垃圾收集時的其他資源回收,例如關閉文件等。

7.Java的多態表現在哪裏?

多態要有動態綁定,否則就不是多態,方法重載也不是多態(因爲方法重載是編譯器決定好的,沒有後期也就是運行期的動態綁定)

當滿足這三個條件

  • 有繼承
  • 有重寫
  • 父類引用指向子類對象

8. 靜態類型有什麼特點?

1、靜態的屬性:隨着類的加載而加載,該屬性不再屬於某個對象,屬於整個類

2、靜態的方法:直接用類名調用,靜態方法裏不能訪問非靜態成員變量

3、靜態類:不能直接創建對象,不能被繼承

9.Java創建對象的幾種方式

  • new 創建新對象
  • 採用clone機制
  • 反射
  • 序列化機制

10.Object 中有哪些公共方法

Object是所有類的祖先類/父類,任何類如果沒有繼承類,則默認繼承Object類

clone 保護方法,實現對象的淺複製,只有實現了Cloneable接口才能使用,否則拋出異常CloneNotSupportedException異常

equals 在Object中與==是一樣的,子類一般需要重寫該方法。

hashCode 該方法用於哈希查找,重寫了equals方法一般要重寫hashCode方法。這個方法在一些具有哈希功能的Collection中用到

getClass final方法 獲得運行時類型

wait 是當前線程等待該對象的鎖,當前線程必須是該對象的擁有者,也就是具有該對象鎖。wait()方法一直等待,直到獲得鎖或者被中斷。wait(long timeout) 設定一個超時間隔,如果規定時間內沒有獲得鎖就返回。

11、&和&&的區別

&是位運算符,表示按位與運算,&&是邏輯運算符,表示邏輯與(and)

12、在.java文件內部可以有多少內部類

一個.java源文件中可以包括多個類(不是內部類),單個文件中只能有一個Public類,並且該public 類必須與文件名相同。

13.如何正確的退出多層嵌套循環

  • 1.break
  • 2.通過在外層循環中添加標識符

14.內部類有什麼作用

1、內部類可以很友好的實現隱藏,一般的非內部類,是不允許有private與protected權限的,但內部類可以

2、內部類擁有外圍類的所有元素的訪問權限

3、間接實現多重繼承

4、可以避免修改接口而實現同一個類中兩種同名方法的調用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章