一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java中equals與==的用法和區(qū)別

Java中equals與==的用法和區(qū)別

2021-06-11 13:59blueskyli Java教程

這篇文章主要給大家介紹了關于Java中equals與==的用法和區(qū)別的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

背景介紹

== 比較的是變量(棧)內存中存放的對象的(堆)內存地址,用來判斷兩個對象的地址是否相同,即是否是指相同一個對象。比較的是真正意義上的指針操作。

equals用來比較的是兩個對象的內容是否相等,由于所有的類都是繼承自java.lang.object類的,所以適用于所有對象,如果沒有對該方法進行覆蓋的話,調用的仍然是object類中的方法,而object中的equals方法返回的卻是==的判斷。

java中的數據類型可以分為兩類:

基本數據類型

byte,short,char,int,long,float,double,boolean

基本數據類型之間的比較需要用雙等號(==),因為他們比較的是值

引用數據類型

接口、類、數組等非基本數據類型

java中的字符串string屬于引用數據類型。因為string是一個類

當他們用(==)進行比較的時候,比較的是他們在內存中的存放地址,所以,除非是同一個new出來的對象,他們的比較后的結果為true,否則比較后結果為false。因為沒new一次就會重新開辟一個新的堆內存空間

?
1
2
3
4
5
6
7
8
9
entity entity = new entity();
entity entity1 = new entity();
entity entity2 = entity;
 
system.out.println(entity==entity2);
system.out.println(entity.equals(entity2));
 
system.out.println(entity.equals(entity1));
system.out.println(entity==entity1);

執(zhí)行結果

true
true
false
false

equals()方法介紹

java中所有的類都是繼承與object這個基類的,在object類中定義了一個equals方法,這個方法的初始行為是比較對象的內存地址,但在一些類庫中已經重寫了這個方法(一般都是用來比較對象的成員變量值是否相同),比如:string,integer,date 等類中,所以他們不再是比較類在堆中的地址了、

object類中源碼

?
1
2
3
public boolean equals(object var1) {
 return this == var1;
}

string類中重寫后的代碼

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public boolean equals(object var1) {
  if (this == var1) {
   return true;
  } else {
   if (var1 instanceof string) {
    string var2 = (string)var1;
    int var3 = this.value.length;
    if (var3 == var2.value.length) {
     char[] var4 = this.value;
     char[] var5 = var2.value;
 
     for(int var6 = 0; var3-- != 0; ++var6) {
      if (var4[var6] != var5[var6]) {
       return false;
      }
     }
 
     return true;
    }
   }
 
   return false;
  }
 }

總結:

對于復合數據類型之間進行equals比較,在沒有覆寫equals方法的情況下,他們之間的比較還是內存中的存放位置的地址值,跟雙等號(==)的結果相同;如果被復寫,按照復寫的要求來。

 == 的作用:

  基本類型:比較的就是值是否相同

  引用類型:比較的就是地址值是否相同

equals 的作用:

  引用類型:默認情況下,比較的是地址值,重寫該方法后比較對象的成員變量值是否相同

string類的equals()方法

在之前文章介紹jvm的時候,提到過一個常量池,這里咱們再來介紹下

?
1
2
3
4
5
6
7
8
9
10
11
12
string a = "abc";// abc在常量池中
string b = "abc";//棧中b指向常量池中的abc
string c = new string("abc");// 在堆內存中重新開辟了一個abc的空間
string d = c.intern();//檢查字符串池里是否存在"abc"這么一個字符串,如果存在,就返回池里的字符串;如果不存在,該方法會 把"abc"添加到字符串池中,然后再返回它的引用。
  
 
system.out.println(a==b);
system.out.println(a.equals(b));
system.out.println(a==c);
system.out.println(a.equals(c));
system.out.println(a==d);
system.out.println(a.equals(d));

true
true
false
true
true
true

關于常量池的描述可以看我這篇文章: 深入java虛擬機學習 -- 內存管理機制

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對服務器之家的支持。

原文鏈接:https://www.cnblogs.com/blueskyli/p/9932017.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 欧美成年黄网站色高清视频 | 欧美精选欧美极品 | 亚洲成av人在线视 | 挺进白嫩老师下面视频 | 日本大片在线 | 国产亚洲福利精品一区二区 | 国产精品久久久久久久久久久久久久 | 四虎影视在线影院在线观看观看 | 91真人毛片一级在线播放 | 桃乃木香奈作品在线观看 | 北岛玲在线视频 | 久久免费看少妇高潮A片特爽 | 肉浦团在线观看 | 男人的j进入女人的j免费 | 日本69sex护士www | 好男人在线观看免费高清2019韩剧 | 暖暖免费高清完整版观看日本 | 国产香蕉一区二区在线网站 | 丁香五香天堂 | 国产成人精品视频一区二区不卡 | 免费人成网址在线观看国内 | 国产成人精品免费视频大全五级 | www日本高清视频 | 日韩欧美国产在线 | 视频污版 | 思久久| 男人日女人的b | 亚洲男人天堂影院 | 好大用力深一点 | 亚洲成在人网站天堂一区二区 | 日韩一级片免费观看 | 久久伊人久久 | 久久综合亚洲色hezyo | 成人蜜桃网 | 日韩视频在线观看中字 | 亚洲男人天堂2023 | 思思91精品国产综合在线 | 我与么公激情性完整视频 | 色综合伊人色综合网站中国 | 亚洲国产成人久久综合一区 | www.99精品视频在线播放 |