Java中的==使用方法詳解
Java中的==
Java中的==表示的是什么呢?有時候很令人費解。比如,以下例子輸出是什么?
// 例一
String str = "wo";
String str1 = "wo";
System.out.println("例一:" + (str == str1));
// 例二
String str2 = new String("wo");
String str3 = new String("wo");
System.out.println("例二:" + (str2 == str3));
// 例三
int i1 = 1;
int i2 = 1;
System.out.println("例三:" + (i1 == i2));
// 例四
TestObject t1 = new TestObject();
TestObject t2 = new TestObject();
System.out.println("例四:" + (t1 == t2));
其中,TestObject是自定義的一個類,結構如下:
package com.yds.test;
public class TestObject {
public TestObject(){
}
}
最終的結果輸出什么呢?結果如下:
例一:true
例二:false
例三:true
例四:false
其實,在Java中,如果是基本數據類型,則 == 比較的是值;如果是對象類型,則 == 比較的是對象的地址。但是,有時候會疑惑,String不是對象類型么?為什么例一是true呢?這個就要談談字符串常量池的問題。
2 字符串常量池
String類是我們平常項目中使用頻率非常高的一種對象類型,JVM為了提升性能和減少開銷,避免字符串的重復創(chuàng)建,維護了一塊特殊的內存空間,即字符串常量池。當需要使用字符串時,先去字符串常量池查看該字符串是否已經存在,如果存在,則可直接使用;如果不存在,初始化,并將該字符串放入到字符串常量池中。
在JDK1.6及之前版本,字符串常量池在方法區(qū)中
在JDK1.7及以后版本,字符串常量池移到了堆中
使用String str=“wo”,可能創(chuàng)建一個或者不創(chuàng)建對象。如果“wo”在字符串常量池中已經存在,則不會再創(chuàng)建String類型的值為“wo”的對象,而是將str指向這個“wo”對象內存地址,后續(xù)無論用這種方式創(chuàng)建多少個指向“wo”的引用,在內存中,都只有一個“wo”內存地址被分配。而==判斷的是對象內存的地址,所以例一返回true。下圖是用這種方式創(chuàng)建字符串的示例圖。

對象存放在堆中,字符串常量池是堆中一塊特殊區(qū)域,new出來的是對象,字符串可以通過直接賦值創(chuàng)建一個對象,如上所述。
對象的引用存放在棧中,String str是對象的引用
在上圖中,棧存放的是字符串的引用,str和str1存放的都是對象“wo”的內存地址,==判斷對象時,判斷的是他們存儲的內存地址是否相同,由上圖可見,他們的內存地址是相同的,所以例一輸出的是true。

例二的兩個字符串都是通過new的方式創(chuàng)建對象的,所以在堆上有兩個String對象,且這兩個對象指向字符串常量池中的同一個對象“wo”,如上圖所示,此時str2和str3存儲的對象地址就不相同,所以例二返回的是false。
String str = new String(“wo”)創(chuàng)建了幾個對象?如果字符串常量池中沒有“wo”,則該句創(chuàng)建了兩個對象,首先會創(chuàng)建一個“wo”存放在字符串常量池中,其本身就是一個對象;然后會new 一個字符串對象,并將“wo”的引用返回給new出來的對象;如果字符串常量池中有“wo”,則該句只創(chuàng)建了一個對象,因為該句首先會查找字符串常量池中是否存在“wo”,如果存在則直接返回"wo"的引用給new出來的對象。
3 總結
==使用總結
如果是基本數據類型,==判斷的是值
如果是對象類型,==判斷的是對象的地址
通過直接賦值而不是new的方式給String賦值,如果字符串常量池中有該對象,則不會再創(chuàng)建,此時通過 == 判斷,返回的是true。如:String str=“wo”;String str1=“wo”;str == str1為true.
在JDK1.6及以前版本,字符串常量池在方法區(qū)中;在JDK1.7及以后,字符串常量池在堆中。
對象的引用保存在棧中
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注腳本之家的更多內容!
相關文章
SpringMVC中@ModelAttribute注解的使用教程
在SpringMVC中,我們可以通過使用@ModelAttribute注解標記方法,實現類似于Struts2中Preparable攔截器的效果,這篇文章主要給大家介紹了關于SpringMVC中@ModelAttribute注解使用的相關資料,需要的朋友可以參考下2021-08-08
解決java.lang.NoClassDefFoundError錯誤的問題
在Java開發(fā)過程中,NoClassDefFoundError是一個常見的運行時錯誤,是由于JVM在運行時找不到已編譯的類文件導致的,本文就來介紹一下如何解決,具有一定的參考價值,感興趣的可以了解一下2024-09-09
SpringSecurity頁面授權與登錄驗證實現(內存取值與數據庫取值)
Spring Security是一個能夠為基于Spring的企業(yè)應用系統(tǒng)提供聲明式的安全訪問控制解決方案的安全框架,本文主要介紹了SpringSecurity頁面授權與登錄驗證實現,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-06-06

