浅谈Java中equals()和==的区别
一.先來說說Java的基本數據類型和引用類型
八大基本數據類型:Byte,short,int,long,double,folat,boolean,char,其中占一個字節的是byte,short和char占兩個字節,int,float占四個字節,double和long占8個字節,boolean只有true和false,這八種數據變量中直接存儲值
八大基本數據類型對應著各自的封裝類型,提供了更多的方法,且不進行初始化時值默認為空(基本數據類型必須初始化)
像String類型屬于引用類型,變量中存儲的是地址,對應的地址存儲數據
二.equals和==
equals是判斷兩個變量或者實例指向同一個內存空間的值是不是相同
而==是判斷兩個變量或者實例是不是指向同一個內存空間
舉個通俗的例子來說,==是判斷兩個人是不是住在同一個地址,而equals是判斷同一個地址里住的人是不是同一個
比如下面的代碼
public class EqualsTest {
? ? public static void main(String[] args) {
? ? ? ? // TODO Auto-generated method stub
? ? ? ? Integer aaa=new Integer(5);
? ? ? ? Integer bbb=new Integer(5);
? ? ? ??
? ? ? ? int a=10;
? ? ? ? int b=10;
? ? ? ? String str1=new String("justice");
? ? ? ? String str2=new String("justice");
? ? ? ? String str3;
? ? ? ? str3=str1;
? ? ? ??
? ? ? ??
? ? ? ? System.out.println(aaa==bbb);
? ? ? ? System.out.println(aaa.equals(bbb));
? ? ? ? System.out.println(a==b);
? ? ? ??
? ? ? ? System.out.println(str1==str2);
? ? ? ? System.out.println(str1.equals(str2));
? ? ? ??
? ? ? ??
? ? ? ? System.out.println(str1==str3);
? ? ? ? System.out.println(str1.equals(str3));
? ? }
}
?
對應結果如下
aaa和bbb都是Integer封裝類型,是不同的對象,變量存儲地址, 所以==結果為false,equals為true
a和b都是基本數據類型,變量存儲值,所以==為true,基本數據類型無equals方法(沒有意義)
str1和str2都是String類型,屬于引用類型,變量存儲地址,所以==為false,equals為true
創建str3的時候,str3指向了str1,所以str1和str3的指向同一個地址,存儲的數據自然相同,所以均為true
三.接下來看個有意思的事情(有點神奇)
看圖思考一下結果是什么???
結果。。。。。。。。。。。。。。。。。。。。。。。。
說下原因,之所以會有疑問,是大家覺得a和c是不同的對象,所以地址不同,所以結果為false才對,但是定義一個Integer變量時,會默認進行Integer.valueOf(a)操作,看一下這個方法的源碼(按住ctrl+鼠標左鍵進入該方法),
high的值為127,low的值為-128,當進行這個方法時如果值在-128-127之間,返回的值也就是地址是相同的,所以a和c的地址相同,a==c自然為true
————————————————
版權聲明:本文為CSDN博主「不劃水的易水寒」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_38162448/article/details/81611894
總結
以上是生活随笔為你收集整理的浅谈Java中equals()和==的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL 使用 OR 条件导致索引失效
- 下一篇: 周杰伦上海演唱会(2010李玉刚上海演唱