1.基本類型的存儲
Java 8種基本類型都是存儲在堆棧中,例:int i = 1;String str = "hello world";也是存儲在堆棧中。
new基本類型的包裝器類型和new String()都是存儲在堆內存中。例Integer i = new Integer(1);String str = new String("hello world");
2.==和equels()比較的含義
1.==是比較對象的內存地址,基本類型就是比較值
2.java對象的equals()方法都是繼承Object.equals(Object o)方法的。比較的內容其實就是使用了“==”比較對象內存地址。
public boolean equals(Object obj) {
return (this == obj);
}
java8種基本類型包裝器類和String類都重寫了equals()方法,先比較類型在比較值,例如Long.equals(Object obj)
public boolean equals(Object obj) {
if (obj instanceof Long) {
return value == ((Long)obj).longValue();
}
return false;
}
3.實例==和equels()比較
int int3 = 3;
Integer integer3 = new Integer(3);
Integer integer3_2 = new Integer(3);
Integer integer3_3 = 3;
Integer integer3_4 = 3;
Integer integer321 = 321;
Integer integer321_2 = 321;
int int321 = 321;
int int321_2 = 321;
Long long3 = 3l;
System.out.println(integer3==integer3_2); //false #1
System.out.println(integer3_3==integer3_4); //true #2
System.out.println(integer3==int3); //true #3
System.out.println(integer3_3.equals(integer3_4)); //true #4
System.out.println(integer321==integer321_2); //false #5
System.out.println(int321==int321_2); //true #6
System.out.println(long3==int3); //true #7
System.out.println(long3.equals(int3)); //false #8
#1? new兩個Integer對象,分配內存在堆中,兩個地址塊不同
#2 Integer integer3_3 = 3;java編譯后的代碼為Integer integer3_3 = Integer.valueOf(3);
查看java Integer.valueOf(int)源碼public static Integer valueOf(int i) {
assert IntegerCache.high >= 127;
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}原來-128<=int<=127的值java棧中有緩存都指向同一個地址,不在這個范圍內的int值都是new一個新的Integer,所以#2為true,#5為false
#3 基礎類型和包裝類運算時,包裝類會拆包,所以就是兩個值運算
#7 btye,short,int,long運算時,都會向上轉型到同一類型運算
#8 equals()比較是先比較類型在比較值,類型不一樣所以為false
分享到:
2014-06-14 21:28
瀏覽 2176
評論