大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專(zhuān)注Java教育14年 全國(guó)咨詢(xún)/投訴熱線(xiàn):400-8080-105
動(dòng)力節(jié)點(diǎn)LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁(yè) 學(xué)習(xí)攻略 Java學(xué)習(xí) Java字符串常量池的用法分析

Java字符串常量池的用法分析

更新時(shí)間:2022-11-24 10:42:34 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽1696次

當(dāng)您在 Java 中聲明一個(gè)新字符串時(shí),幕后會(huì)發(fā)生一些有趣的事情。這是一個(gè)基本的字符串聲明。我們創(chuàng)建一個(gè)名為employee的新字符串變量并為其賦值,如您在代碼中所見(jiàn):

String employee = "Edgar Allen Poe" ; 

Java 不僅會(huì)創(chuàng)建變量employee,還會(huì)在內(nèi)存中為文字值“Edgar Allen Poe”分配空間。內(nèi)存中的這個(gè)區(qū)域稱(chēng)為字符串常量池。它就像一個(gè)可供程序其他部分使用的字符串值池。

現(xiàn)在,如果您創(chuàng)建了另一個(gè)變量,比如employee2,并且還給它賦值“Edgar Allen Poe”,Java 將簡(jiǎn)單地重新使用池中已有的值。

您會(huì)注意到字符串常量池位于一段稱(chēng)為堆的內(nèi)存中。這是內(nèi)存的一部分,用于運(yùn)行時(shí)操作,處理類(lèi)和對(duì)象。把一堆想象成一塊花園土壤,當(dāng)你種植花園時(shí),你可以很容易地從中取出泥土和植物。Java 將這些新對(duì)象放在那里。如果你再創(chuàng)建一百個(gè)對(duì)象,Java 將在堆頂上再創(chuàng)建一百個(gè)文字。

用法解析

1. 直接使用雙引號(hào)聲明出來(lái)的String對(duì)象

String employee3 = new String ( "Edgar Allen Poe" );  

創(chuàng)建過(guò)程:JVM會(huì)使用常量池來(lái)管理字符串直接量。在執(zhí)行這句話(huà)時(shí),JVM會(huì)先檢查常量池中是否已經(jīng)存有"abc",若沒(méi)有則將"abc"存入常量池,否則就復(fù)用常量池中已有的"abc",將其引用賦值給變量a。

2. 使用new方法創(chuàng)建出來(lái)的String對(duì)象

可以使用String提供的intern方法。

String s2 = new String("abc");

在執(zhí)行這句話(huà)時(shí),JVM會(huì)先使用常量池來(lái)管理字符串直接量,String 先使用 intern 方法會(huì)從字符串常量池中查詢(xún)當(dāng)前字符串是否存在,若不存在就會(huì)將當(dāng)前字符串放入常量池中,即將"abc"存入常量池。然后再創(chuàng)建一個(gè)新

的String對(duì)象,這個(gè)對(duì)象會(huì)被保存在堆內(nèi)存中。并且,堆中對(duì)象的數(shù)據(jù)會(huì)指向常量池中的直接量。

例如下面代碼進(jìn)行對(duì)abc常量進(jìn)行檢測(cè)是否存在的測(cè)試:

String s1="abc";
String s2 = new String("abc");
System.out.println(s2.intern());

測(cè)試案例

運(yùn)行如下代碼:

public class Test{
    public class void main(String[] args){
		String s1 = "abc";
        String s2 = "abc";
        System.out.println("s1="+s1);//abc
        System.out.println(s1 == s2);//true
        System.out.println("=================");
        char[] charArray = {'a','b','c'};
        String s3 = new String(charArray);
        System.out.println("s3="+s3);//abc
        System.out.println(s1 == s3);//false
        System.out.println("=================");
        String s4 = new String("abc");
        System.out.println("s4="+s4);//abc
        System.out.println(s1==s4);
        System.out.println("=================");
?    }
}

運(yùn)行結(jié)果如下:

雖然兩個(gè)輸出兩個(gè)字符串的結(jié)果相同,都為abc,但比較兩者時(shí)則不同,這是因?yàn)楸容^的規(guī)則為:

引用類(lèi)型比較時(shí),比較的是其地址值;

基本數(shù)據(jù)類(lèi)型比較的是其數(shù)據(jù)值。

采用直接創(chuàng)建String類(lèi)型對(duì)象的方法創(chuàng)建對(duì)象時(shí),JVM首先會(huì)去字符串常量池中查找是否存在"abc" 這個(gè)對(duì)象,如果不存在,則在字符串常量池中創(chuàng)建”abc“這個(gè)對(duì)象,然后將池中”abc“對(duì)象的引用地址返回給對(duì)象s1,這樣s1的地址就在常量池中;

如果存在,則不創(chuàng)建任何對(duì)象,直接將存在的“abc”的地址返回給對(duì)象s2。這就是為什么s1等于s2的原因。

而通過(guò)new方法創(chuàng)建的String對(duì)象,其創(chuàng)建的字符串是放在堆當(dāng)中的,將堆當(dāng)中的字符串地址返回賦值給s3,s1和s3的存放地址不相同,一個(gè)在字符串常量池中,一個(gè)在堆當(dāng)中,字符串常量池外,因此返回的值是false。s4同樣如此。

提交申請(qǐng)后,顧問(wèn)老師會(huì)電話(huà)與您溝通安排學(xué)習(xí)

  • 全國(guó)校區(qū) 2025-06-26 搶座中
免費(fèi)課程推薦 >>
技術(shù)文檔推薦 >>
主站蜘蛛池模板: 黄色片网站大全 | 一区二区三区中文 | 久久亚洲视频 | 四虎成人免费视频 | 久青草视频免费视频播放线路1 | 久久综合九九亚洲一区 | oldwoman中国老女人tv | 久久免费区一区二区三波多野 | 免费在线成人网 | 久久色网 | 亚洲国产精品第一区二区三区 | 一级毛片一级毛片免费毛片 | 99精品亚洲 | 91热成人精品国产免费 | 日本欧美一区二区三区在线观看 | 香蕉视频免费在线播放 | 伊人一伊人色综合网 | 不卡猪 | 亚洲九色 | 成年人视频黄色 | 日韩欧美亚洲每日更新网 | 四虎www.| 岛国不卡 | 久久久福利| 一级寡妇乱色毛片全18 | 国产精品成人在线播放 | 国产视频欧美 | 国产欧美日韩中文久久 | 特黄特黄一级片 | 手机看福利 | 国产乱码视频 | 国产成人亚洲毛片 | 四虎在线免费视频 | 日日干日日摸 | 宅男影院在线观看 | 欧美激情在线播放一区二区 | 日本一线一区二区三区免费视频 | 久久这里只有精品国产 | 五月婷婷社区 | 91色桃| 看久久 |