基本語法
switch中能否使用string做參數
在idk 1.7之前,switch只能支持byte, short, char, int或者其對應的封裝類以及Enum類型。從idk 1.7之后switch開始支持String。
String s1=”ab”, String s2=”a”+”b”, String s3=”a”, String s4=”b”, s5=s3+s4請問s5==s2返回什么?
返回false。在編譯過程中,編譯器會將s2直接優化為”ab”,會將其放置在常量池當中,s5則是被創建在堆區,相當于s5=new String(“ab”);
Object中有哪些公共方法?
equals(),clone(),getClass(),notify(),notifyAll(),wait(),toString()
java當中的四種引用
強引用,軟引用,弱引用,虛引用。不同的引用類型主要體現在GC上:
強引用:如果一個對象具有強引用,它就不會被垃圾回收器回收。即使當前內存空間不足,JVM也不會回收它,而是拋出 OutOfMemoryError 錯誤,使程序異常終止。如果想中斷強引用和某個對象之間的關聯,可以顯式地將引用賦值為null,這樣一來的話,JVM在合適的時間就會回收該對象。
軟引用:在使用軟引用時,如果內存的空間足夠,軟引用就能繼續被使用,而不會被垃圾回收器回收,只有在內存不足時,軟引用才會被垃圾回收器回收。
弱引用:具有弱引用的對象擁有的生命周期更短暫。因為當 JVM 進行垃圾回收,一旦發現弱引用對象,無論當前內存空間是否充足,都會將弱引用回收。不過由于垃圾回收器是一個優先級較低的線程,所以并不一定能迅速發現弱引用對象。
虛引用:顧名思義,就是形同虛設,如果一個對象僅持有虛引用,那么它相當于沒有引用,在任何時候都可能被垃圾回收器回收。
為什么要有不同的引用類型
不像C語言,我們可以控制內存的申請和釋放,在Java中有時候我們需要適當的控制對象被回收的時機,因此就誕生了不同的引用類型,可以說不同的引用類型實則是對GC回收時機不可控的妥協。有以下幾個使用場景可以充分的說明:
利用軟引用和弱引用解決OOM問題:用一個HashMap來保存圖片的路徑和相應圖片對象關聯的軟引用之間的映射關系,在內存不足時,JVM會自動回收這些緩存圖片對象所占用的空間,從而有效地避免了OOM的問題.
通過軟引用實現Java對象的高速緩存:比如我們創建了一Person的類,如果每次需要查詢一個人的信息,哪怕是幾秒中之前剛剛查詢過的,都要重新構建一個實例,這將引起大量Person對象的消耗,并且由于這些對象的生命周期相對較短,會引起多次GC影響性能。此時,通過軟引用和 HashMap 的結合可以構建高速緩存,提供性能。
java中==和eqauls()的區別,equals()和`hashcode的區別
==是運算符,用于比較兩個變量是否相等,而equals是Object類的方法,用于比較兩個對象是否相等。默認Object類的equals方法是比較兩個對象的地址,此時和==的結果一樣。換句話說:基本類型比較用==,比較的是他們的值。默認下,對象用==比較時,比較的是內存地址,如果需要比較對象內容,需要重寫equal方法。
equals()和hashcode()的聯系
hashCode()是Object類的一個方法,返回一個哈希值。如果兩個對象根據equal()方法比較相等,那么調用這兩個對象中任意一個對象的hashCode()方法必須產生相同的哈希值。
如果兩個對象根據eqaul()方法比較不相等,那么產生的哈希值不一定相等(碰撞的情況下還是會相等的。)
3*0.1==0.3返回值是什么
false,因為有些浮點數不能完全精確的表示出來。
a=a+b與a+=b有什么區別嗎?
+=操作符會進行隱式自動類型轉換,此處a+=b隱式的將加操作的結果類型強制轉換為持有結果的類型,而a=a+b則不會自動進行類型轉換。
short s1= 1; s1 = s1 + 1; 該段代碼是否有錯,有的話怎么改?
有錯誤,short類型在進行運算時會自動提升為int類型,也就是說s1+1的運算結果是int類型。
改為short s1= 1; s1 += 1; +=操作符會自動對右邊的表達式結果強轉匹配左邊的數據類型
一個java文件內部可以有類?(非內部類)
只能有一個public公共類,但是可以有多個default修飾的類。
64位的JVM當中,int的長度是多少?
Java 中,int 類型變量的長度是一個固定值,與平臺無關,都是 32 位。意思就是說,在 32 位 和 64 位 的Java 虛擬機中,int 類型的長度是相同的。
int和Integer的區別
Integer是int的包裝類型,在拆箱和裝箱中,二者自動轉換。int是基本類型,直接存數值,而integer是對象,用一個引用指向這個對象。
Integer 對象會占用更多的內存。Integer是一個對象,需要存儲對象的元數據。但是 int 是一個原始類型的數據,所以占用的空間更少。
字符串
String是定義在 java.lang 包下的一個類。它不是基本數據類型。
String是不可變的,JVM使用字符串池來存儲所有的字符串對象。
字符串的創建有兩種方式。
方法1:String str =newString("abc");
使用這種方式時,JVM創建字符串對象但不存儲于字符串池。我們可以調用intern()方法將該字符串對象存儲在字符串池,如果字符串池已經有了同樣值的字符串,則返回引用。
該語句首先String s1是聲明,new String(“abc”)先在常量池中查找,若沒有則創建“abc”,而后通過new在堆內存中創建對象,把“abc”拷貝賦值。String 定義為初始化一個新創建的 String 對象,表示一個與該參數相同的字符序列;換句話說,新創建的字符串是該參數字符串的一個副本。故創建常量池和堆內存中兩個對象,兩個對象的地址值不一樣。?
方法2:String str1 ="abc";
使用這種方式時,JVM去字符串池找有沒有值相等字符串,如果有,則返回找到的字符串引用。否則創建一個新的字符串對象并存儲在字符串池。
String的intern()方法:當intern()方法被調用,如果字符串池中含有一個字符串和當前調用方法的字符串eqauls相等,那么就會返回池中的字符串。如果池中沒有的話,則首先將當前字符串加入到池中,然后返回引用。
抽象類和接口的區別
如果你擁有一些方法并且想讓它們中的一些有默認實現,那么使用抽象類吧。
如果你想實現多重繼承,那么你必須使用接口。由于Java不支持多繼承,子類不能夠繼承多個類,但可以實現多個接口。因此你就可以使用接口來解決它。
如果基本功能在不斷改變,那么就需要使用抽象類。如果不斷改變基本功能并且使用接口,那么就需要改變所有實現了該接口的類。
抽象類可以有默認的方法實現,可以有構造器,抽象方法可以有public、protected和default這些修飾符。如果你往抽象類中添加新的方法,你可以給它提供默認的實現。因此你不需要改變你現在的代碼。而接口必須修改所有實現過該接口的方法?
final關鍵字
在Java中,final關鍵字可以用來修飾類、方法和變量(包括成員變量和局部變量)
?當用final修飾一個類時,表明這個類不能被繼承。也就是說,如果一個類你永遠不會讓他被繼承,就可以用final進行修飾。final類中的成員變量可以根據需要設為final,但是要注意final類中的所有成員方法都會被隱式地指定為final方法。
?final修飾的方法表示此方法已經是“最后的、最終的”含義,亦即此方法不能被重寫
當final修飾一個基本數據類型時,表示該基本數據類型的值一旦在初始化后便不能發生變化;如果final修飾一個引用類型時,則在對其初始化之后便不能再讓其指向其他對象了,但該引用所指向的對象的內容是可以發生變化的。本質上是一回事,因為引用的值是一個地址,final要求值,即地址的值不發生變化。