1. 首先String不屬於8種基本資料類型,String是物件。
因為物件的預設值是null,所以String的預設值也是null;但它又是一種特殊的對象,有其它物件沒有的一些特性。
2. new String()和new String("")都是申明一個新的空字串,是空白字串不是null;
3. String str="kvill";
String str=new String ( "kvill");的區別:
在這裡,我們不談堆,也不談棧,只先簡單引入常數池這個簡單的概念。
常數池(constant pool)指的是編譯期被確定,並保存在已編譯的。 class檔案中的一些資料。它包括了關於類別、方法、介面等中的常數,也包括字串常數。
看例1:
String s0="kvill"; String s1="kvill"; String s2="kv" + "ill"; System.out.println( s0==s1 ); System.out.println( s0==s2 );
結果為:
true
true
首先,我們要知道結果為道Java會確保一個字串常數只有一個拷貝。
因為例子中的s0和s1中的"kvill"都是字串常數,它們在編譯期就被確定了,所以s0==s1為true;而"kv"和"ill"也都是字串常數,當一個字串由多個字串常數連接而成時,它自己肯定也是字串常數,所以s2也同樣在編譯期就被解析為一個字串常數,所以s2也是常數池中"kvill"的一個引用。
所以我們得到s0==s1==s2;
用new String() 建立的字串不是常數,不能在編譯期就確定,所以new String() 建立的字串不放入常數池中,它們有自己的地址空間。
看例2:
String s0="kvill"; String s1=new String("kvill"); String s2="kv" + new String("ill"); System.out.println( s0==s1 ); System.out.println( s0==s2 ); System.out.println( s1==s2 );
結果為:
false
false
false
例2中s0還是常量池中"kvill"的應用,s1因為無法在編譯期內建立的新物件"的引用,s2因為有後半部newString("ill")所以也無法在編譯期確定,所以也是一個新創建物件"kvill"的應用;明白了這些也就知道為何得出此結果了。
4. String.intern():
再補充介紹一點:存在於。 class檔案中的常數池,在運作期間被JVM裝載,並且可以擴充。 String的intern()方法就是擴充常數池的一個方法;當一個String實例str呼叫intern()方法時,Java查找常數池中是否有相同Unicode的字串常數,如果有,則傳回其的引用,如果沒有,則在常數池中增加一個Unicode等於str的字串並回傳它的引用;看例3就清楚了
例3:
String s0= "kvill"; String s1=new String("kvill"); String s2=new String("kvill"); System.out.println( s0==s1 ); System.out.println( "**********" ); s1.intern(); s2=s2.intern(); //把常量池中"kvill"的引用赋给s2 System.out.println( s0==s1); System.out.println( s0==s1.intern() ); System.out.println( s0==s2 );
結果為:
false
**********
false //雖然執行了s1.intern(),但它的回傳值沒有賦給s1
true //說明s1.intern()回傳的是常數池中"kvill"的引用
true
最後我再破除一個錯誤的理解:
有人說,"使用String.intern()方法則可以將一個String類別的保存到一個全域String表中,如果具有相同值的Unicode字串已經在這個表中,那麼該方法返回表中已有字串的位址,如果在表中沒有相同值的字串,則將自己的地址註冊到表中"如果我把他說的這個全域的String表理解為常數池的話,他的最後一句話,"如果在表中沒有相同值的字串,則將自己的地址註冊到表中"是錯的:
看例4:
String s1=new String("kvill"); String s2=s1.intern(); System.out.println( s1==s1.intern() ); System.out.println( s1+" "+s2 ); System.out.println( s2==s1.intern() );
结果为:
false
kvill kvill
true
在这个类中我们没有声名一个"kvill"常量,所以常量池中一开始是没有"kvill"的,当我们调用s1.intern()后就在常量池中新添加了一个"kvill"常量,原来的不在常量池中的"kvill"仍然存在,也就不是"将自己的地址注册到常量池中"了。
s1==s1.intern()为false说明原来的"kvill"仍然存在;
s2现在为常量池中"kvill"的地址,所以有s2==s1.intern()为true.
5. 关于equals()和==:
这个对于String简单来说就是比较两字符串的Unicode序列是否相当,如果相等返回true;而==是比较两字符串的地址是否相同,也就是是否是同一个字符串的引用。
6. 关于String是不可变的
这一说又要说很多,大家只要知道String的实例一旦生成就不会再改变了,比如说:String str="kv"+"ill"+" "+"ans";
就是有4个字符串常量,首先"kv"和"ill"生成了"kvill"存在内存中,然后"kvill"又和" " 生成 "kvill "存在内存中,最后又和生成了"kvill ans";并把这个字符串的地址赋给了str,就是因为String的"不可变"产生了很多临时变量,这也就是为什么建议用StringBuffer的原因了,因为StringBuffer是可改变的。
更多Java中的String对象数据类型全面解析相关文章请关注PHP中文网!

本文討論了使用Maven和Gradle進行Java項目管理,構建自動化和依賴性解決方案,以比較其方法和優化策略。

本文使用Maven和Gradle之類的工具討論了具有適當的版本控制和依賴關係管理的自定義Java庫(JAR文件)的創建和使用。

本文討論了使用咖啡因和Guava緩存在Java中實施多層緩存以提高應用程序性能。它涵蓋設置,集成和績效優勢,以及配置和驅逐政策管理最佳PRA

本文討論了使用JPA進行對象相關映射,並具有高級功能,例如緩存和懶惰加載。它涵蓋了設置,實體映射和優化性能的最佳實踐,同時突出潛在的陷阱。[159個字符]

Java的類上載涉及使用帶有引導,擴展程序和應用程序類負載器的分層系統加載,鏈接和初始化類。父代授權模型確保首先加載核心類別,從而影響自定義類LOA


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

SublimeText3 Linux新版
SublimeText3 Linux最新版

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中