如果比較兩個數值相等的integer型別的整數,你可能會發現,用「==」比較(首先你必須明確「==」比較的是位址),有的時候返回true,而有的時候,返回false。比如:
integer i = 128;
integer j = 128;
system.out.println(i == j);//返回false
而
integer m = 127;
integer n = 127;
system.out.println(m == n);//返回true
為什麼兩個相差1的數,比較的結果卻不一樣呢。看一下原始碼
public static integer valueof(int i)
integer i = 128;這種方式賦值,會呼叫valueof方法。我們發現這裡做了一些關於integercache的操作。integercache原始碼:
private static class integercache
high = h;
cache = new integer[(high - low) + 1];
int j = low;
for(int k = 0; k < cache.length; k++)
cache[k] = new integer(j++);
}private integercache() {}
}
原來integer把-128到127(可調)的整數都提前例項化了, 所以你不管建立多少個這個範圍內的integer都是同乙個物件。
那麼,如何比較兩個integer型別是否相等呢,你肯定會想到equals,沒錯,就是equals,看下equals原始碼:
public boolean equals(object obj)
return false;
}
value值是int型別:
private final int value;
通過原始碼得知,是獲取integer的基本型別值來用==比較了。
所以,我們也可以這樣,通過integer.intvalue()獲取int值來直接比較。
其實,乙個int型別和integer直接「==」比較也是沒有問題的:
integer i = 128;
int j = 128;
system.out.println(i == j);//返回true
原因是integer型別會自動拆箱變為int型別來進行比較。
綜上:如果你用兩個integer型別的整數做相等比較
1.如果integer型別的兩個數相等,如果範圍在-128~127(預設),那麼用「==」返回true,其餘的範會false。
2.兩個基本型別int進行相等比較,直接用==即可。
3.乙個基本型別int和乙個包裝型別integer比較,用==也可,比較時候,integer型別做了拆箱操作。
4.integer型別比較大小,要麼呼叫integer.intvalue()轉為基本型別用「==」比較,要麼直接用equals比較。
擴充套件:long和short型別也做了相同的處理,只不過最大值是不可調的。
public static long valueof(long l)
return new long(l);
}
public static short valueof(short s)
return new short(s);
}
C 相等比較
c 中的物件都繼承自system.object物件,分為引用型別和值型別兩種,所以物件的相等比較而言就分兩種,一種是比較引用,一種是比較值。system.object預設提供了三個方法來進行物件的相等比較 靜態的referenceequals equals 靜態方法 equals 虛方法 子類可以去...
物件相等比較
對於string型別而言,一般用 或者equales做相等比較,前者比較字串的引用,後者比較字串的值。字串常量的值儲存於常量池中,只要值相同,那麼引用的就是同乙個字串常量,也就是說,和equals效果一樣。字串物件儲存於堆中,不同的物件在堆上的記憶體位址是不一樣的。因此,建立兩個值相等的string...
C 之相等比較(常規比較)
c 之相等比較 c 中的物件都繼承自system.object物件,分為引用型別和值型別兩種,所以物件的相等比較而言就分兩種,一種是比較引用,一種是比較值。system.object預設提供了三個方法來進行物件的相等比較 靜態的referenceequals 和equals 的兩個版本,加上 運算子...