WeakReference與SoftReference的區別?
這點在四種引用類型中已經做了解釋,這里簡單說明一下即可: 雖然 WeakReference 與 SoftReference 都有利于提高 GC 和 內存的效率,但是 WeakReference ,一旦失去最后一個強引用,就會被 GC 回收,而軟引用雖然不能阻止被回收,但是可以延遲到 JVM 內存不足的時候。
不像C語言,我們可以控制內存的申請和釋放,在Java中有時候我們需要適當的控制對象被回收的時機,因此就誕生了不同的引用類型,可以說不同的引用類型實則是對GC回收時機不可控的妥協.有以下幾個使用場景可以充分的說明:
利用軟引用和弱引用解決OOM問題:用一個HashMap來保存圖片的路徑和相應圖片對象關聯的軟引用之間的映射關系,在內存不足時,JVM會自動回收這些緩存圖片對象所占用的空間,從而有效地避免了OOM的問題.
通過軟引用實現Java對象的高速緩存:比如我們創建了一Person的類,如果每次需要查詢一個人的信息,哪怕是幾秒中之前剛剛查詢過的,都要重新構建一個實例,這將引起大量Person對象的消耗,并且由于這些對象的生命周期相對較短,會引起多次GC影響性能。此時,通過軟引用和 HashMap 的結合可以構建高速緩存,提供性能.
java中==和eqauls()的區別,equals()和`hashcode的區別
==是運算符,用于比較兩個變量是否相等,而equals是Object類的方法,用于比較兩個對象是否相等.默認Object類的equals方法是比較兩個對象的地址,此時和==的結果一樣.換句話說:基本類型比較用==,比較的是他們的值.默認下,對象用==比較時,比較的是內存地址,如果需要比較對象內容,需要重寫equal方法
hashCode()是Object類的一個方法,返回一個哈希值.如果兩個對象根據equal()方法比較相等,那么調用這兩個對象中任意一個對象的hashCode()方法必須產生相同的哈希值. 如果兩個對象根據eqaul()方法比較不相等,那么產生的哈希值不一定相等(碰撞的情況下還是會相等的.)
a.hashCode()有什么用?與a.equals(b)有什么關系
hashCode() 方法是相應對象整型的 hash 值。它常用于基于 hash 的集合類,如 Hashtable、HashMap、LinkedHashMap等等。它與 equals() 方法關系特別緊密。根據 Java 規范,兩個使用 equal() 方法來判斷相等的對象,必須具有相同的 hashcode。
將對象放入到集合中時,首先判斷要放入對象的hashcode是否已經在集合中存在,不存在則直接放入集合.如果hashcode相等,然后通過equal()方法判斷要放入對象與集合中的任意對象是否相等:如果equal()判斷不相等,直接將該元素放入集合中,否則不放入.
有可能,兩個不相等的對象可能會有相同的 hashcode 值,這就是為什么在 hashmap 中會有沖突。相等 hashcode 值的規定只是說如果兩個對象相等,必須有相同的hashcode 值,但是沒有關于不相等對象的任何規定。
不行,因為同一對象的 hashcode 值必須是相同的
如果a 和b 都是對象,則 a==b 是比較兩個對象的引用,只有當 a 和 b 指向的是堆中的同一個對象才會返回 true,而 a.equals(b) 是進行邏輯比較,所以通常需要重寫該方法來提供邏輯一致性的比較。例如,String 類重寫 equals() 方法,所以可以用于兩個不同對象,但是包含的字母相同的比較。
false,因為有些浮點數不能完全精確的表示出來。
隱式的將加操作的結果類型強制轉換為持有結果的類型。如果兩這個整型相加,如 byte、short 或者 int,首先會將它們提升到 int 類型,然后在執行加法操作。如果加法操作的結果比 a 的最大值要大,則 a+b 會出現編譯錯誤,但是 a += b 沒問題,如下: byte a = 127; byte b = 127; b = a + b; // error : cannot convert from int to byte b += a; // ok (譯者注:這個地方應該表述的有誤,其實無論 a+b 的值為多少,編譯器都會報錯,因為 a+b 操作會將 a、b 提升為 int 類型,所以將 int 類型賦值給 byte 就會編譯出錯)
內部類可以用多個實例,每個實例都有自己的狀態信息,并且與其他外圍對象的信息相互獨立.在單個外圍類當中,可以讓多個內部類以不同的方式實現同一接口,或者繼承同一個類.創建內部類對象的時刻病不依賴于外部類對象的創建.內部類并沒有令人疑惑的”is-a”關系,它就像是一個獨立的實體.
內部類提供了更好的封裝,除了該外圍類,其他類都不能訪問
final 是一個修飾符,可以修飾變量、方法和類。如果 final 修飾變量,意味著該變量的值在初始化后不能被改變。finalize 方法是在對象被回收之前調用的方法,給對象自己最后一個復活的機會,但是什么時候調用 finalize 沒有保證。finally 是一個關鍵字,與 try 和 catch 一起用于異常的處理。finally 塊一定會被執行,無論在 try 塊中是否有發生異常。
java.lang.Cloneable 是一個標示性接口,不包含任何方法,clone 方法在 object 類中定義。并且需要知道 clone() 方法是一個本地方法,這意味著它是由 c 或 c++ 或 其他本地語言實現的。
淺拷貝:被復制對象的所有變量都含有與原來的對象相同的值,而所有的對其他對象的引用仍然指向原來的對象。換言之,淺拷貝僅僅復制所考慮的對象,而不復制它所引用的對象。
深拷貝:被復制對象的所有變量都含有與原來的對象相同的值,而那些引用其他對象的變量將指向被復制過的新對象,而不再是原有的那些被引用的對象。換言之,深拷貝把要復制的對象所引用的對象都復制了一遍。
幾乎所有的人都知道static關鍵字這兩個基本的用法:靜態變量和靜態方法.也就是被static所修飾的變量/方法都屬于類的靜態資源,類實例所共享.
除了靜態變量和靜態方法之外,static也用于靜態塊,多用于初始化操作:
public calssPreCache{static{//執行相關操作
}
}
此外static也多用于修飾內部類,此時稱之為靜態內部類.
最后一種用法就是靜態導包,即import static.import static是在JDK 1.5之后引入的新特性,可以用來指定導入某個類中的靜態資源,并且不需要使用類名.資源名,可以直接使用資源名,比如:
import staticjava.lang.Math.*;publicclassTest{publicstaticvoidmain(String[]args){//System.out.println(Math.sin(20));傳統做法System.out.println(sin(20));
}
}
final也是很多面試喜歡問的地方,能回答下以下三點就不錯了: 1.被final修飾的類不可以被繼承 2.被final修飾的方法不可以被重寫 3.被final修飾的變量不可以被改變.如果修飾的引用,那么表示引用不可變,引用指向的內容可變. 4.被final修飾的方法,JVM會嘗試將其內聯,以提高運行效率 5.被final修飾的常量,在編譯階段會存入常量池中.
當前回答出編譯器對final域要遵守的兩個重排序規則更好: 1.在構造函數內對一個final域的寫入,與隨后把這個被構造對象的引用賦值給一個引用變量,這兩個操作之間不能重排序. 2.初次讀一個包含final域的對象的引用,與隨后初次讀這個final域,這兩個操作之間不能重排序.
好了同學們,我能介紹的也都全部介紹完給你們了,如果下獲得更多JAVA教學資源,可以選擇來我們這里共同交流,群:240448376,很多大神在這里切磋學習,不懂可以直接問,晚上還有大牛免費直播教學。
注:加群要求
1、具有一定工作經驗的,面對目前流行的技術不知從何下手,需要突破技術瓶頸的可以加,有些應屆生和實習生也可以加。
2、在公司待久了,過得很安逸,但跳槽時面試碰壁。需要在短時間內進修、跳槽拿高薪的可以加。
3、如果沒有工作經驗,但基礎非常扎實,對java工作機制,常用設計思想,常用java開發框架掌握熟練的,可以加。
4、覺得自己很牛B,一般需求都能搞定。但是所學的知識點沒有系統化,很難在技術領域繼續突破的可以加。
5.阿里Java高級大牛直播講解知識點,分享知識,多年工作經驗的梳理和總結,帶著大家全面、科學地建立自己的技術體系和技術認知!
PS:現在主要講解的內容是(反射原理、枚舉原理與應用、注解原理、常用設計模式、正規表達式高級應用、JAVA操作Office原理詳解、JAVA圖像處理技術,等多個知識點的詳解和實戰)
6.小號或者小白之類加群一律不給過,謝謝。
最后,每一位讀到這里的網友,感謝你們能耐心地看完。覺得對你有幫助可以給個喜歡!希望在成為一名更優秀的Java程序員的道路上,我們可以一起學習、一起進步