Java 里面的 == 和equals的坑是在是太多了,即使做了多年java開發的程序員也不一定就能准確說出 a == b 或 a.equals(b) 這樣簡單的問題的答案。
請看下面這26道關於Long 和 bigdecimal 的相等比較,看看你是否可以准確說出每行代碼的輸出結果呢?
答案在文末,請先看題:
關於Long的相等比較:
1、System.out.println(Long.valueOf("9999999").equals(new Long(9999999L))); 輸出:true/false?
2、System.out.println(Long.valueOf("9999999") == new Long(9999999L)); 輸出:true/false?
3、System.out.println(Long.valueOf("1") == new Long(1L)); 輸出:true/false?
4、System.out.println(1L == new Long(1L)); 輸出:true/false?
5、System.out.println(new Long(1L) == new Long(1L)); 輸出:true/false?
6、System.out.println(999999L == new Long(999999L)); 輸出:true/false?
7、System.out.println(999999L == Long.valueOf("999999")); 輸出:true/false?
8、System.out.println(Long.valueOf("999999") == Long.valueOf("999999")); 輸出:true/false?
9、System.out.println(Long.valueOf("1") == Long.valueOf("1")); 輸出:true/false?
10、System.out.println(Long.valueOf("127") == Long.valueOf("127")); 輸出:true/false?
11、System.out.println(Long.valueOf("128") == Long.valueOf("128")); 輸出:true/false?
12、System.out.println(Long.valueOf("-128") == Long.valueOf("-128")); 輸出:true/false?
13、System.out.println(Long.valueOf("-129") == Long.valueOf("-129")); 輸出:true/false?
關於BigDecimal的相等比較:
1、System.out.println(BigDecimal.valueOf(0) == BigDecimal.ZERO); 輸出:true/false?
2、System.out.println(BigDecimal.valueOf(new Long(0)) == BigDecimal.ZERO); 輸出:true/false?
3、System.out.println(BigDecimal.valueOf(0.0) == BigDecimal.ZERO); 輸出:true/false?
4、System.out.println(BigDecimal.valueOf(0) == BigDecimal.valueOf(0)); 輸出:true/false?
5、System.out.println(BigDecimal.valueOf(11) == BigDecimal.valueOf(11)); 輸出:true/false?
6、System.out.println(BigDecimal.valueOf(10) == BigDecimal.valueOf(10)); 輸出:true/false?
7、System.out.println(BigDecimal.valueOf(11).equals(BigDecimal.valueOf(11))); 輸出:true/false?
8、System.out.println(BigDecimal.valueOf(9999).equals(BigDecimal.valueOf(9999))); 輸出:true/false?
9、System.out.println(BigDecimal.valueOf(9999.00).equals(BigDecimal.valueOf(9999.00))); 輸出:true/false?
10、System.out.println(BigDecimal.valueOf(9999.0).equals(BigDecimal.valueOf(9999.00))); 輸出:true/false?
11、System.out.println(BigDecimal.valueOf(9999.0).equals(new BigDecimal(9999.00))); 輸出:true/false?
12、System.out.println(BigDecimal.valueOf(0.0).equals(BigDecimal.ZERO)); 輸出:true/false?
13、System.out.println(BigDecimal.valueOf(9999.0).compareTo(new BigDecimal(9999.00)) == 0); 輸出:true/false?
---------------------------------------------------------------------------------------------------------------------------------------------------
答案來了
---------------------------------------------------------------------------------------------------------------------------------------------------
10
9
8
7
6
5
4
3
2
1
請看答案:
Long
1、System.out.println(Long.valueOf("9999999").equals(new Long(9999999L))); 輸出:true
2、System.out.println(Long.valueOf("9999999") == new Long(9999999L)); 輸出:false
3、System.out.println(Long.valueOf("1") == new Long(1L)); 輸出:false
4、System.out.println(1L == new Long(1L)); 輸出:true
5、System.out.println(new Long(1L) == new Long(1L)); 輸出:false
6、System.out.println(999999L == new Long(999999L)); 輸出:true
7、System.out.println(999999L == Long.valueOf("999999")); 輸出:true
8、System.out.println(Long.valueOf("999999") == Long.valueOf("999999")); 輸出:false
9、System.out.println(Long.valueOf("1") == Long.valueOf("1")); 輸出:true
10、System.out.println(Long.valueOf("127") == Long.valueOf("127")); 輸出:true
11、System.out.println(Long.valueOf("128") == Long.valueOf("128")); 輸出:false
12、System.out.println(Long.valueOf("-128") == Long.valueOf("-128")); 輸出:true
13、System.out.println(Long.valueOf("-129") == Long.valueOf("-129")); 輸出:false
總結
對於Long的比較,不要用等號,規律太多,根本記不住。而equals方法是非常安全的,可以放心用equals進行相等的比較。
BigDecimal
1、System.out.println(BigDecimal.valueOf(0) == BigDecimal.ZERO); 輸出:true
2、System.out.println(BigDecimal.valueOf(new Long(0)) == BigDecimal.ZERO); 輸出:true
3、System.out.println(BigDecimal.valueOf(0.0) == BigDecimal.ZERO); 輸出:false
4、System.out.println(BigDecimal.valueOf(0) == BigDecimal.valueOf(0)); 輸出:true
5、System.out.println(BigDecimal.valueOf(11) == BigDecimal.valueOf(11)); 輸出:false
6、System.out.println(BigDecimal.valueOf(10) == BigDecimal.valueOf(10)); 輸出:true
7、System.out.println(BigDecimal.valueOf(11).equals(BigDecimal.valueOf(11))); 輸出:true
8、System.out.println(BigDecimal.valueOf(9999).equals(BigDecimal.valueOf(9999))); 輸出:true
9、System.out.println(BigDecimal.valueOf(9999.00).equals(BigDecimal.valueOf(9999.00))); 輸出:true
10、System.out.println(BigDecimal.valueOf(9999.0).equals(BigDecimal.valueOf(9999.00))); 輸出:true
11、System.out.println(BigDecimal.valueOf(9999.0).equals(new BigDecimal(9999.00))); 輸出:false
12、System.out.println(BigDecimal.valueOf(0.0).equals(BigDecimal.ZERO)); 輸出:false
13、System.out.println(BigDecimal.valueOf(9999.0).compareTo(new BigDecimal(9999.00)) == 0); 輸出:true
總結
對於BigDecimal的比較,不用用 == 也不要用equals,規律太多,根本記不住,而應該用compareTo方法。
-----------------------------------------------------------------------------------------------------------------------------------------------
推薦閱讀: