Java運行環境(Java Runtime Enviroment) 是運行Java程序的基本的Java虛擬機,包括執行applet的瀏覽器插件。JDK (Java Development Kit) 是爲了開發,編譯和執行Java應用程序,針對Java的全功能的軟件開發包,包含了JRE,編譯器和工具(好比說 JavaDoc 和Java Debugger)。html
由類加載器、內存空間、執行引擎,垃圾收集、本地方法接口組成。java
類加載器找到類文件,並驗證解析類文件,最後加載到內存空間各個區域中spring
內存空間包括堆、棧、方法區等,用來存儲對象引用、對象數據,類方法等。windows
垃圾收集回收內存中的過時數據,釋放內存空間。瀏覽器
本地方法接口提供了jvm調用本地其餘非java類庫的功能。oracle
類的生命週期包括加載、驗證、準備、解析、初始化、使用、清理七個階段。app
類加載器分爲啓動類加載器,擴展類加載器、應用程序類加載器、線程上下文類加載器。jvm
雙親委派機制,java的三種類加載器存在父子關係,子 加載器保存着附加在其的引用,當一個類加載器須要加載一個目標類時,會先委託父加載器去加載,而後父加載器會在本身的加載路徑中搜索目標類,父加載器在本身的加載範圍中找不到時,纔會交給子加載器加載目標類。ide
== 比較的是變量(棧)內存中存放的對象的(堆)內存地址,用來判斷兩個對象的地址是否相同,便是否是指相同一個對象。比較的是真正意義上的指針操做。equals用來比較的是兩個對象的內容是否相等,因爲全部的類都是繼承自java.lang.Object類的,因此適用於全部對象,若是沒有對該方法進行覆蓋的話,調用的仍然是Object類中的方法,而Object中的equals方法返回的倒是==的判斷。工具
String s="abcd"是一種很是特殊的形式,和new 有本質的區別。它是java中惟一不須要new 就能夠產生對象的途徑。以String s="abcd";形式賦值在java中叫直接量,它是在常量池中而不是象new同樣放在壓縮堆中。 這種形式的字符串,在JVM內部發生字符串拘留,即當聲明這樣的一個字符串後,JVM會在常量池中先查找有有沒有一個值爲"abcd"的對象,若是有,就會把它賦給當前引用.即原來那個引用和如今這個引用指點向了同一對象, 若是沒有,則在常量池中新建立一個"abcd",下一次若是有String s1 = "abcd";又會將s1指向"abcd"這個對象,即以這形式聲明的字符串,只要值相等,任何多個引用都指向同一對象.
而String s = new String("abcd");和其它任何對象同樣.每調用一次就產生一個對象,只要它們調用。
也能夠這麼理解: String str = "hello"; 先在內存中找是否是有"hello"這個對象,若是有,就讓str指向那個"hello".
若是內存裏沒有"hello",就建立一個新的對象保存"hello". String str=new String ("hello") 就是無論內存裏是否是已經有"hello"這個對象,都新建一個對象保存"hello"。
不必定。同時反過來equals爲true,hashCode也不必定相同。
類的hashCode方法和equals方法均可以重寫,返回的值徹底在於本身定義。
關於hashCode和equal是方法是有一些 常規協定 :
一、兩個對象用equals()比較返回true,那麼兩個對象的hashCode()方法必須返回相同的結果。
二、兩個對象用equals()比較返回false,不要求hashCode()方法也必定返回不一樣的值,可是最好返回不一樣值,億提搞哈希表性能。
三、重寫equals()方法,必須重寫hashCode()方法,以保證equals方法相等時兩個對象hashcode返回相同的值。
&和&&均可以用做邏輯與的運算符,表示邏輯與(and),當運算符兩邊的表達式的結果都爲true時,整個運算結果才爲true,不然,只要有一方爲false,則結果爲false。
&&還具備短路的功能,即若是第一個表達式爲false,則再也不計算第二個表達式,例如,對於if(str != null && !str.equals(「」))表達式,當str爲null時,後面的表達式不會執行,因此不會出現NullPointerException若是將&&改成&,則會拋出NullPointerException異常。If(x33 & ++y>0) y會增加,If(x33 && ++y>0)不會增加
&還能夠用做位運算符,當&操做符兩邊的表達式不是boolean類型時,&表示按位與操做,咱們一般使用0x0f來與一個整數進行&運算,來獲取該整數的最低4個bit位,例如,0x31 & 0x0f的結果爲0x01。
在java中,要想跳出多重循環,能夠在外面的循環語句前定義一個標號,而後在裏層循環體的代碼中使用帶有標號的的break語句,便可跳出
外層循環。例如:
ok: for(int i=0;i<10;i++) { for(int j=0;j<10;j++) { system.out.println("i="+i+",j="+j); if(j==5) break ok; } }
3.4是雙精度數,將雙精度型(double)賦值給浮點型(float)屬於下轉型(down-casting,也稱爲窄化)會形成精度損失,所以須要強制類型轉換float f =(float)3.4; 或者寫成float f =3.4F;。
對於short s1 = 1; s1 = s1 + 1;因爲1是int類型,所以s1+1運算結果也是int 型,須要強制轉換類型才能賦值給short型。而short s1 = 1; s1 += 1;能夠正確編譯,由於s1+= 1;至關於s1 = (short)(s1 + 1);其中有隱含的強制類型轉換。
round()方法能夠這樣理解:
將括號內的數+0.5以後,向下取值,
好比:round(3.4)就是3.4+0.5=3.9,向下取值是3,因此round(3.4)=3;
round(-10.5)就是-10.5+0.5=-10,向下取值就是-10,因此round(-10.5)=-10
switch可做用於char byte short int
switch可做用於char byte short int對應的包裝類
switch不可做用於long double float boolean,包括他們的包裝類 Long/Double
switch中能夠是字符串類型,String(jdk1.7以後才能夠做用在string上)
switch中能夠是枚舉類型
String strSeason = "Summer"; switch (strSeason.toLowerCase()) { case "spring": season = 1; break; case "summer": season = 2; break; case "fall": season = 3; break; case "winter": season = 4; break; default: season = -1;// 沒找到對應的季節 break; }
Java中方法的 overload 發生的條件是,同一個類裏,有兩個或以上的方法名稱徹底相同,但參數列表不一樣。另外一方面,方法的 override 是指,子類重定義了父類裏的同一個方法。Override 的方法必須方法名、參數列表和返回類型都徹底相同。Override 的方法不會限制原方法的訪問權限。
Java 中的 static 變量歸相應的類全部,它的值對於類的全部實例都是相同的。static 變量是在 JVM 加載類的時候初始化的。若是代碼試圖訪問非靜態的變量,並且不是經過類的實例去訪問,編譯器會報錯,由於這些非靜態變量尚未被建立呢,而且它們沒有與實例相關聯。
Java同時提供和支持抽象類和接口,它們的實現有一些共同的特色,也有以下不一樣: