基于String變量的兩種創(chuàng)建方式(詳解)
在java中,有兩種創(chuàng)建String類型變量的方式:
String str01="abc";//第一種方式
String str02=new String("abc");//第二種方式
第一種方式創(chuàng)建String變量時,首先查找JVM方法區(qū)的字符串常量池是否存在存放"abc"的地址,如果存在,則將該變量指向這個地址,不存在,則在方法區(qū)創(chuàng)建一個存放字面值"abc"的地址。
第二種方式創(chuàng)建String變量時,在堆中創(chuàng)建一個存放"abc"的對象,使變量str02指向堆中的對象。
根據(jù)上面的創(chuàng)建方式,觀察下面的示例:
String str01 = "abc";
String str02 = "abc";
String str03 = new String("abc");
String str04 = new String("abc");
System.out.println("str01==str02:" + (str01 == str02));
System.out.println("str03==str04:" + (str03 == str04));
System.out.println("str01==str03:" + (str01 == str03));
分析:
1、在創(chuàng)建str01時,方法區(qū)的字符串常量池中沒有存儲"abc"的地址,就在常量池中創(chuàng)建一個存放"abc"的地址,使變量str01指向該地址。創(chuàng)建str02時,字符串常量池已存在存放"abc"的地址,將str02變量指向該地址,此時str01與str02指向同一內(nèi)存地址,所以"str01==str02"為true。
2、使用new關鍵字創(chuàng)建對象時,每一次都會在堆中創(chuàng)建一個新的對象,所以str03與str04指向對象的地址不同,"str03==str04"為false。
3、str01指向方法區(qū),str03指向堆,所以"str01==str03"為false。

String對象被設計成不可改變的對象,即String對象所包含的字面值發(fā)生改變時,會開辟一個新的地址,創(chuàng)建一個新的對象,原地址不變。
String str01 = "abc"; String str02 = "abc"; str01="def";

在方法區(qū)的字符串常量池中建立一個新的存儲"def"的地址,str01指向該地址,str02的指向不變。
以上這篇基于String變量的兩種創(chuàng)建方式(詳解)就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Java并發(fā)編程中使用Executors類創(chuàng)建和管理線程的用法
這篇文章主要介紹了Java并發(fā)編程中使用Executors類創(chuàng)建和管理線程的用法,文中舉了用其啟動線程和設置線程優(yōu)先級的例子,需要的朋友可以參考下2016-03-03
Java并發(fā)編程之ReentrantLock實現(xiàn)原理及源碼剖析
ReentrantLock 是常用的鎖,相對于Synchronized ,lock鎖更人性化,閱讀性更強,文中將會詳細的說明,請君往下閱讀2021-09-09
IntelliJ IDEA2021.1 配置大全(超詳細教程)
這篇文章主要介紹了IntelliJ IDEA2021.1 配置大全(超詳細教程),需要的朋友可以參考下2021-04-04
關于maven打包時的報錯: Return code is: 501 , ReasonPhrase:HTTPS Requ
這篇文章主要介紹了關于maven打包時的報錯: Return code is: 501 , ReasonPhrase:HTTPS Required,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-09-09

