Java中的==使用方法詳解
Java中的==符號(hào)是一個(gè)很令人費(fèi)解的點(diǎn),它究竟代表的是什么,下面由我來(lái)揭示一下它所包含的奧妙!
1.==在基本數(shù)據(jù)類型是比較值的大小
int a = 1; int b = 1; System.out.println(a==b);
上面的例子輸出的結(jié)果為
true
所以在基本數(shù)據(jù)類型比較的是數(shù)值是否相等
2.在包裝類中比較的是地址相等
2.1 Integer類類型==的運(yùn)用
看下面的例子:
Integer a = new Integer(1);
Integer b = new Integer(1);
System.out.println(a==b);
上面代碼的答案是
false
通過(guò)關(guān)鍵字new出來(lái)的對(duì)象都是存在堆棧里面的,每new一次則在
在堆棧中創(chuàng)建一個(gè)對(duì)象。所以a與b的地址不一樣。

我們?cè)倏聪旅娴睦?/p>
Integer a =1;
Integer b = 1;
Integer c =128;
Integer d = 128;
System.out.println(a==b);
System.out.println(c==d);
上面例子答案是
true
false
為什么會(huì)出現(xiàn)這樣子呢,我們先看看jdk中的源碼吧
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
上面的例子使用到了自動(dòng)裝箱的功能, Integer a =1;等同于
Integer a = Tnteger.valueOf(1)。從jdk的源碼可以得知valueOf方法在代碼運(yùn)行之前已經(jīng)把-128-127的Intege之間r的對(duì)象存在了緩存中了,在運(yùn)行的時(shí)候如果Integer對(duì)象在-128-127之間則返回緩存中的該對(duì)象,而不會(huì)重新生成對(duì)象,如果不在-128-127之間則會(huì)在堆中新創(chuàng)建一個(gè)對(duì)象。
2.2 String類類==的運(yùn)用
在兩個(gè)String用==來(lái)作比較的時(shí)候,比較的也是他的地址。
String a =new String( "abc");
String b =new String( "abc");
System.out.println(a==b);
上面的例子運(yùn)行結(jié)果為
false
通過(guò)關(guān)鍵字new出來(lái)的對(duì)象都是存在堆棧里面的,每new一次則在
在堆棧中創(chuàng)建一個(gè)對(duì)象。所以a與b的地址不一樣。和上面Integer的new例子是一樣的。
我們?cè)倏聪旅娴睦?/p>
String a ="abc";
String b ="abc";
System.out.println(a==b);
上面例子的結(jié)果是
true
String不通過(guò)new直接通過(guò)=的方式直接賦值,不是像new一個(gè)對(duì)象一樣直接在堆中賦值,是先遍歷常量池,看常量值有沒(méi)有直接賦值的對(duì)象,有的話直接返回該對(duì)象,如果沒(méi)有的話,則在常量池中新建一個(gè)String對(duì)象,返回新建的對(duì)象。因此在常量池中不會(huì)有相同的String對(duì)象。所以變量a與b指向的地址一樣所以返回true。
我們?cè)倏匆粋€(gè)例子:
String a = "abc";
String b = "d";
String c ="abc"+"d";
String d = a+b;
String e ="abcd";
System.out.println(c==e);
System.out.println(d==e);
上面代碼的結(jié)果是
true
false
String c ="abc"+"d";在編譯的時(shí)候已經(jīng)進(jìn)行了優(yōu)化了,"abc"+"d"編譯器把他看成了一個(gè)常量表達(dá)式,所以"abc"+"d"相當(dāng)于字符串常量abcd。而String d = a+b;存在變量不能進(jìn)行優(yōu)化,是在運(yùn)行的時(shí)候才進(jìn)行操作的,他同時(shí)在堆中創(chuàng)建了一個(gè)新的字符串對(duì)象并指向d。
到此這篇關(guān)于Java中的==使用方法詳解的文章就介紹到這了,更多相關(guān)Java ==使用方法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot使用Guava實(shí)現(xiàn)日志脫敏的示例代碼
本文主要介紹了SpringBoot使用Guava實(shí)現(xiàn)日志脫敏的示例代碼,使用Guava中的Strings、Maps和CharMatcher類來(lái)進(jìn)行日志脫敏,保護(hù)敏感數(shù)據(jù)的安全,感興趣的可以了解一下2024-01-01
Java中實(shí)現(xiàn)雙數(shù)組Trie樹(shù)實(shí)例
這篇文章主要介紹了Java中實(shí)現(xiàn)雙數(shù)組Trie樹(shù)實(shí)例,雙數(shù)組Trie就是一種優(yōu)化了空間的Trie樹(shù),本文給出了實(shí)現(xiàn)代碼、測(cè)試代碼和測(cè)試結(jié)果,需要的朋友可以參考下2015-01-01
詳解mybatis批量插入10萬(wàn)條數(shù)據(jù)的優(yōu)化過(guò)程
這篇文章主要介紹了詳解mybatis批量插入10萬(wàn)條數(shù)據(jù)的優(yōu)化過(guò)程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04
SpringBoot 集成MQTT實(shí)現(xiàn)消息訂閱的詳細(xì)代碼
本文介紹了如何在SpringBoot中集成MQTT并實(shí)現(xiàn)消息訂閱,主要步驟包括添加依賴、配置文件設(shè)置、啟動(dòng)類注解、MQTT配置類、消息處理器配置、主題緩存、動(dòng)態(tài)數(shù)據(jù)庫(kù)主題配置以及消息處理服務(wù),感興趣的朋友跟隨小編一起看看吧2024-11-11
基于SpringBoot實(shí)現(xiàn)Web應(yīng)用的登錄與退出功能
登錄與退出功能作為 Web 應(yīng)用中的基礎(chǔ)且重要的組成部分,直接關(guān)系到用戶的安全和隱私保護(hù),所以本文給大家介紹了基于SpringBoot實(shí)現(xiàn)Web應(yīng)用的登錄與退出功能,文中有詳細(xì)的代碼供大家參考,需要的朋友可以參考下2024-04-04

