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

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 學習攻略 Java學習 Java字符串常量池的用法分析

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

更新時間:2022-11-24 10:42:34 來源:動力節點 瀏覽1553次

當您在 Java 中聲明一個新字符串時,幕后會發生一些有趣的事情。這是一個基本的字符串聲明。我們創建一個名為employee的新字符串變量并為其賦值,如您在代碼中所見:

String employee = "Edgar Allen Poe" ; 

Java 不僅會創建變量employee,還會在內存中為文字值“Edgar Allen Poe”分配空間。內存中的這個區域稱為字符串常量池。它就像一個可供程序其他部分使用的字符串值池。

現在,如果您創建了另一個變量,比如employee2,并且還給它賦值“Edgar Allen Poe”,Java 將簡單地重新使用池中已有的值。

您會注意到字符串常量池位于一段稱為堆的內存中。這是內存的一部分,用于運行時操作,處理類和對象。把一堆想象成一塊花園土壤,當你種植花園時,你可以很容易地從中取出泥土和植物。Java 將這些新對象放在那里。如果你再創建一百個對象,Java 將在堆頂上再創建一百個文字。

用法解析

1. 直接使用雙引號聲明出來的String對象

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

創建過程:JVM會使用常量池來管理字符串直接量。在執行這句話時,JVM會先檢查常量池中是否已經存有"abc",若沒有則將"abc"存入常量池,否則就復用常量池中已有的"abc",將其引用賦值給變量a。

2. 使用new方法創建出來的String對象

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

String s2 = new String("abc");

在執行這句話時,JVM會先使用常量池來管理字符串直接量,String 先使用 intern 方法會從字符串常量池中查詢當前字符串是否存在,若不存在就會將當前字符串放入常量池中,即將"abc"存入常量池。然后再創建一個新

的String對象,這個對象會被保存在堆內存中。并且,堆中對象的數據會指向常量池中的直接量。

例如下面代碼進行對abc常量進行檢測是否存在的測試:

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

測試案例

運行如下代碼:

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("=================");
?    }
}

運行結果如下:

雖然兩個輸出兩個字符串的結果相同,都為abc,但比較兩者時則不同,這是因為比較的規則為:

引用類型比較時,比較的是其地址值;

基本數據類型比較的是其數據值。

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

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

而通過new方法創建的String對象,其創建的字符串是放在堆當中的,將堆當中的字符串地址返回賦值給s3,s1和s3的存放地址不相同,一個在字符串常量池中,一個在堆當中,字符串常量池外,因此返回的值是false。s4同樣如此。

提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 国外欧美一区另类中文字幕 | 99爱视频精品免视看 | 曰本还a大片免费无播放器 曰本黄色录像 | 日本亚洲精品一区二区三区 | 成人午夜久久精品 | 日本高清影院 | 性欧美视频a毛片在线播放 性欧美视频在线观看 | 欧美中文字幕视频 | 欧美激情精品久久久久久久九九九 | 欧美成人四级剧情在线播放 | 成人欧美一区二区三区在线 | 色黄网站成年女人色毛片 | 中文字幕综合网 | 成人免费黄色小视频 | 欧美成人网在线综合视频 | 亚洲精品一区二区三区美女 | 黑人和黑人激情一级毛片 | 天天射夜夜爱 | 欧美精品福利视频 | 国产成在线人视频免费视频 | 亚洲欧美日韩在线精品2021 | 亚洲国产综合久久精品 | 免费看一级特黄a大片 | 99在线在线视频免费视频观看 | 中文字幕97 | porno日本xxxx| 欧美精品久久一区二区三区 | 九一精品| 亚洲香蕉视频 | 久操社区 | 日韩在线手机看片免费看 | 国产精品伦理一区二区三区 | 欧日韩在线不卡视频 | 手机看福利 | 国产视频福利一区 | 一级a做爰片欧欧美毛片4 | 国产片欧美片亚洲片久久综合 | 欧美中文综合在线视频 | 中文字幕一区二区三区精彩视频 | 2021久久精品99精品久久 | 伊人色综合网 |