最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺析java中String類型中“==”與“equal”的區(qū)別

 更新時間:2020年08月21日 10:15:15   作者:計通羅主任  
這篇文章主要介紹了淺析java中String類型中“==”與“equal”的區(qū)別,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

一、前言

1.1、首先很多人都知道,String中用“==”比較的是地址,用equals比較的是內(nèi)容,很多人對此用的是記憶法,通過記憶來加強此的引用,但是其真正的原理其實并不難,當(dāng)我們真正明白其為什么的時候,用起來也會更加靈活,更加有底氣(形容得不太好,朋友別見怪);

二相關(guān)知識的準(zhǔn)備

  • 類型常量池
  • 運行時常量池
  • 字符串常量池

我們今天討論的主題是當(dāng)然是字符串常量池:
為什么在這要把另外兩個常量池拿出說一下呢,首先小生我在網(wǎng)上或者cnds上看到很多人在爭論字符串常量池是存在與方法區(qū)還是堆里面,因此我在這里面非常負(fù)責(zé)任的告訴各位讀者:
1、類型常量池,存放在方法區(qū)里面,每個class文件都有一個
2、運行時常量池、存放在方法區(qū)里面,所有class共用
3、字符串常量池:存放在堆區(qū)里面
而且字符串常量池有一個特點:存放的常量唯一:三、 開始

3.1,情況一

public class Test2 {
	public static void main(String[] args) {
		
		String a ="張敬軒";
		String b ="張敬軒";
		
		System.out.println(a == b);
		System.out.println(a.equals(b));
		
	}
}

運行結(jié)果:

在這里插入圖片描述

  • true
  • true

解釋:因為當(dāng)我們String a = “張敬軒”;的時候,會在堆里面的字符串常量池里面“搜索”是否有“張敬軒”這個對象,

  • 有:就會將“張敬軒這個對象的地址指向a”
  • 沒有:就會在字符串常量池里面新建立一個“張敬軒”,然后就會把地址引用賦值給a

當(dāng)再聲明String b = “張敬軒";和第一次聲明String = “張敬軒”;一樣,先”搜索“,然后因為已經(jīng)存在了”張敬軒“這個對象,那么就不會再創(chuàng)建對象,而是將存在的”張敬軒“的地址引用賦值給b,所以
a和b的地址一樣,內(nèi)容自然也一樣,所以兩個結(jié)果為true,不懂各位朋友懂沒懂?

3.2,情況二;

public class Test2 {
	public static void main(String[] args) {
		
		String a ="張敬軒";
		 
		String b = new String("張敬軒");
		
		System.out.println(a == b);
		System.out.println(a.equals(b));
		
	}
}

結(jié)果是

在這里插入圖片描述

false,true
解釋
String a = “張敬軒”;
已經(jīng)解釋過了,是在堆里面的字符串常量池創(chuàng)建對象
String b = new String(“張敬軒”);
這個也是在堆區(qū)里面創(chuàng)建對象,但是不是在字符串常量池里面創(chuàng)建對象
兩個不同的對象,地址自然不同,類容都是張敬軒,所以結(jié)果是false,true

3.3、情況三

public class Test2 {
	public static void main(String[] args) {
		
		String a = new String("張敬軒");
		 
		String b = new String("張敬軒");
		
		System.out.println(a == b);
		System.out.println(a.equals(b));
		
	}

}

結(jié)果:false,true

在這里插入圖片描述

解釋,因為new (“張敬軒”);表示在堆區(qū)的非字符串常量池里面創(chuàng)建了兩個不同的對象,兩次new就創(chuàng)建了兩個,所以地址是不同的,因此結(jié)果是false,true

3.4、情況四

public class Test2 {
	public static void main(String[] args) {
		
		String a = "張"+"敬軒";
		String b = "張敬軒";
		System.out.println(a == b);
		System.out.println(a.equals(b));
		
	}
}

結(jié)果是:true,true

在這里插入圖片描述

解釋:String = “張敬” + ”軒“;
在編譯的時候就已經(jīng)開始進(jìn)行計算:這是Java編譯的優(yōu)化機制,所以a指向的地址依舊是”張敬軒“;所以情況和前面的情況一一致,所以是true,true
(注意Java編譯優(yōu)化機制只針對常量不針對變量 a = a+ b(這個是沒有優(yōu)化機制的,關(guān)于Java編譯機制,各位小伙伴可以去百度了解一下))

3.5、情況五

public class Test2 {
	public static void main(String[] args) {
		
		String a = "張";
		String b = "敬軒";
		String c =a+b;
		String d = "張敬軒";
		System.out.println(d == c);
		System.out.println(d.equals(c));
		
	}
}

結(jié)果:

在這里插入圖片描述

解釋:因為a 和 b是變量,不存在什么Java優(yōu)化機制,而是將兩個c = a + b存放在的是堆區(qū)的非字符常量池里面,所以是兩個不同的對象,自然為false,true
3.6、最后一種情況

public class Test2 {
	public static void main(String[] args) {
		
		String a = "張";
		String b = "敬軒";
		String c =(a+b).intern();
		String d = "張敬軒";
		System.out.println(d == c);
		System.out.println(d.equals(c));
		
	}

}

結(jié)果:

在這里插入圖片描述

解釋:intern();方法是將堆區(qū)里面的非字符常量池里面的對象強行放到字符常量池里面,因為字符常量池里面對象的唯一性,如果字符串常量池里面已經(jīng)有了和”張敬軒“一樣的對象,就會將其地址引用賦值給c,沒有就相當(dāng)于創(chuàng)建一個(也就是和之前堆區(qū)里面那個對象一樣的對象),有了的話,就會將原來有的那個“張敬軒”對象賦值給c,因為地址一樣,所以為true

總結(jié):

== 比較的地址 (如果對象存在字符串常量池,而且類容相同,那么 == 返回的是true )
equal 比較的是內(nèi)容 (內(nèi)容相同返回便是true)(所以在以后的開發(fā)中一般是用equal比較字符串的

各位朋友如果有錯的及時評論區(qū)指出,謝謝大家的支持

到此這篇關(guān)于淺析java中String類型中“==”與“equal”的區(qū)別的文章就介紹到這了,更多相關(guān)java String類型 ==與equal內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Tomcat調(diào)優(yōu)詳解

    Tomcat調(diào)優(yōu)詳解

    這篇文章主要介紹了Tomcat調(diào)優(yōu)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • Java中的包(package)是什么和使用方法

    Java中的包(package)是什么和使用方法

    包是Java中一種強大的組織代碼的工具,它們幫助開發(fā)者將代碼分組,防止命名沖突,并通過控制訪問級別來增強代碼的安全性,這篇文章主要介紹了Java中的包(package)是什么和如何使用它們,需要的朋友可以參考下
    2024-07-07
  • 優(yōu)化Java內(nèi)存管理來防止“GC”錯誤的方法詳解

    優(yōu)化Java內(nèi)存管理來防止“GC”錯誤的方法詳解

    垃圾回收(GC)是 Java 中的一個重要機制,它可以管理內(nèi)存并回收不再使用的對象所占用的資源,在本文中,我們將探討一些技巧,幫助您避免這一錯誤,確保您的 Java 應(yīng)用程序順利運行,需要的朋友可以參考下
    2023-11-11
  • springcloud使用feign調(diào)用服務(wù)時參數(shù)內(nèi)容過大問題

    springcloud使用feign調(diào)用服務(wù)時參數(shù)內(nèi)容過大問題

    這篇文章主要介紹了springcloud使用feign調(diào)用服務(wù)時參數(shù)內(nèi)容過大問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • 一文搞懂java反射基本API

    一文搞懂java反射基本API

    這篇文章主要為大家介紹了一文搞懂java反射基本API,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • Java中轉(zhuǎn)義字符反斜杠\的代替方法及repalceAll內(nèi)涵解析

    Java中轉(zhuǎn)義字符反斜杠\的代替方法及repalceAll內(nèi)涵解析

    這篇文章主要介紹了Java中轉(zhuǎn)義字符反斜杠\的代替方法及repalceAll內(nèi)涵解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • 深入探究Java線程與進(jìn)程有哪些區(qū)別

    深入探究Java線程與進(jìn)程有哪些區(qū)別

    這篇文章主要介紹了Java并發(fā)編程之線程創(chuàng)建,進(jìn)程是代碼在數(shù)據(jù)集合上的一次運行活動,是系統(tǒng)進(jìn)行資源分配和調(diào)度的基本單位,線程則是一個實體,一個進(jìn)程中至少有一個線程,下文更多相關(guān)內(nèi)容需要的小伙伴可以參考一下
    2022-04-04
  • Java代碼的三根頂梁柱:循環(huán)結(jié)構(gòu)

    Java代碼的三根頂梁柱:循環(huán)結(jié)構(gòu)

    這篇文章主要介紹了JAVA 循環(huán)結(jié)構(gòu)的相關(guān)資料,文中講解的非常細(xì)致,示例代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2021-08-08
  • 解決微服務(wù)中關(guān)于用戶token處理到的坑

    解決微服務(wù)中關(guān)于用戶token處理到的坑

    這篇文章主要介紹了解決微服務(wù)中關(guān)于用戶token處理到的坑,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Java項目中如何引入Hutool工具類并正確使用它

    Java項目中如何引入Hutool工具類并正確使用它

    Hutool是一個小而全的Java工具類庫,通過靜態(tài)方法封裝,降低相關(guān)API的學(xué)習(xí)成本,提高工作效率,使Java擁有函數(shù)式語言般的優(yōu)雅,這篇文章主要給大家介紹了關(guān)于Java項目中如何引入Hutool工具類并正確使用它的相關(guān)資料,需要的朋友可以參考下
    2024-01-01

最新評論

额济纳旗| 临漳县| 遂平县| 龙口市| 达拉特旗| 石渠县| 榆中县| 滦南县| 桐柏县| 永清县| 榆中县| 泾源县| 长泰县| 资溪县| 温州市| 鄂尔多斯市| 安庆市| 广州市| 晴隆县| 万山特区| 丹东市| 彭水| 巴马| 游戏| 屯昌县| 泰来县| 嵊州市| 鄂尔多斯市| 哈密市| 临武县| 济南市| 赤城县| 兴义市| 根河市| 札达县| 双鸭山市| 玉山县| 枝江市| 乐亭县| 嘉黎县| 驻马店市|