在這裏談談Java在編譯時,變量與常量在內存的機制。函數
總所周知,Java數據類型主要分爲3種:基本數據類型、布爾類型、引用類型。對象
下面先看看這個語句:內存
1.String str=new String("Hello"); 編譯
2.int a=5; 變量
3.static final boolean b=true;原理
String是一個類,定義了引用變量str,此時,並無爲其指定值,而是在棧上存儲這個地址,執行構造函數時,JVM先在內存堆生成常量「Hello」,而後在將棧地址指向改常量,完成步驟1.構造函數
步驟2在編譯時已經指定了值,可是,這個5是存儲在常量池當中。數據類型
static修飾的變量或類屬於類Filed,在編譯階段必須肯定下來,final修飾的類Filed的值一旦初始化完畢,值便不可再修改,底層內存運行機制與2類似。引用
再談談==與equals,相信極大部分Java碼農只知道如何使用,不知道底層的實現原理,其實這也與堆棧有關係。數據
==:若是運算符兩邊是基本類型數據和布爾類型,則只要考慮值相等便可,與equals實現的效果同樣。
對於引用類型的數據,必須嚴格要求在堆棧中引用了同一對象(廢話,在堆中也只能相同了。。。)
equals:對於基本類型和布爾類型,與==相同,對於引用類型,必需要求堆地址相等。以下例子:
String str1=new String("hello");
String str2=new String("hello");
String str3=str1;
System.out.println((str1==str2)+","+(str1.equals(str2)));//false,true
System.out.println(str1==str3);//true
正如上面所說的。