Java 關(guān)于String字符串原理上的問題
1、String 是最基本的數(shù)據(jù)類型嗎?
不是。
Java 中的基本數(shù)據(jù)類型只有 8
個 :byte、short、int、long、float、double、char、boolean
;除了基本類型,剩下的都是引用類型,Java 5 以后引入的枚舉類型也算是一種比較特殊的引用類型。
2、字符型常量和字符串常量的區(qū)別?
- 形式上: 字符常量是單引號引起的一個字符,字符串常量是雙引號引起的若干個字符;
- 含義上: 字符常量相當(dāng)于一個整型值( ASCII 值),可以參加表達式運算;字符串常量代表一個地址值(該字符串在內(nèi)存中存放位置,相當(dāng)于對象;
- 占內(nèi)存大小:字符常量只占
2
個字節(jié);字符串常量占若干個字節(jié)(至少一個字符結(jié)束標(biāo)志) (注意: char 在Java中占兩個字節(jié))。
3、什么是字符串常量池?
字符串常量池:jvm為了提升性能和減少內(nèi)存開銷,避免字符的重復(fù)創(chuàng)建,其維護了一塊特殊的內(nèi)存空間,即字符串常量池。當(dāng)需要使用字符串時,先去字符串常量池中查看該字符串是否已經(jīng)存在,如果存在,則可以直接使用,如果不存在,初始化,并將該字符串放入字符串常量池中。
所處位置說明
- 在jdk6中,常量池的位置在永久代(方法區(qū))中,此時常量池中存儲的是對象。
- 在jdk7中,常量池的位置在堆中,此時,常量池存儲的就是引用了。
- 在jdk8中,永久代(方法區(qū))被元空間取代了。
4、String str=new String(“aaa”)創(chuàng)建了幾個對象?
1個或者2個
- 第一種情況:字符串常量池中已經(jīng)有了
"aaa"
字符串常量了,那么此時會在堆中通過new String()方法
創(chuàng)建1
個字符串對象。 - 第二種情況:那就是字符串常量池中沒有
"aaa"
字符串常量了,此時會創(chuàng)建2
個對象。首先"aaa"
該表達式會查看字符串常量池中是否含有"aaa"
常量,如果沒有的話,那么在字符串常量池中就會生成一個值為"aaa"
的字符串常量,然后再在堆中通過new String()方法
創(chuàng)建一個值為"aaa"
的對象。
5、字符串的 intern 方法的執(zhí)行過程是怎樣的?
你學(xué) Java
的別這個高頻知識點都不知道呀,不知道的趕緊偷摸補一下。
在解析這個問題之前,我們先來做個題目:
public class Test { public static void main(String[] args) { String s = new String("2"); s.intern(); String s1 = "2"; System.out.println(s == s1); String s3 = new String("3") + new String("3"); s3.intern(); String s4 = "33"; System.out.println(s3 == s4); } }
輸出結(jié)果
//jdk6
false
false
//jdk7
false
true
intern
方法在JDK1.6以前 和 JDK1.7以后有不同的處理:
- 在JDK1.6中,
intern
的處理是 先判斷字符串常量是否在字符串常量池中,如果存在直接返回該常量,如果沒有找到,則將該字符串常量加入到字符串常量區(qū),也就是在字符串常量區(qū)建立該常量; - 在JDK1.7中,
intern
的處理是 先判斷字符串常量是否在字符串常量池中,如果存在直接返回該常量,如果沒有找到,說明該字符串常量在堆中,則處理是把堆區(qū)該對象的引用加入到字符串常量池中,以后別人拿到的是該字符串常量的引用,實際存在堆中。
6、String,StringBuffer,StringBuilder 的區(qū)別是什么?
可變與不可變
String
// 源碼 private final char value[];
String
類中使用字符數(shù)組保存字符串,因為有 “final”
修飾符,所以 String
對象是不可變的。對于已經(jīng)存在的 String
對象的修改都是重新創(chuàng)建一個新的對象,然后把新的值保存進去。
StringBuffer
和 StringBuilder
// 源碼 char[] value;
StringBuffer
和 StringBuilder
都繼承自 AbstractStringBuilder
類,在 AbstractStringBuilder
中也是使用字符數(shù)組保存字符串,這兩種對象都是可變的。
是否多線程安全
String
中的對象是不可變的,也就可以理解為常量,顯然線程安全。StringBuilder
是非線程安全的。StringBuffer
對方法加了同步鎖或者對調(diào)用的方法加了同步鎖,所以是線程安全的。
// StringBuffer 的追加操作 public synchronized StringBuffer append(StringBuffer sb) { toStringCache = null; super.append(sb); return this; }
性能
- 每次對
String
類型進行改變的時候,都會生成一個新的String
對象,然后將指針指向新的String
對象。 StringBuffer
每次都會對StringBuffer
對象本身進行操作,而不是生成新的對象并改變對象引用。相同情況下使用StringBuilder
相比使用StringBuffer
僅能獲得 10%~15% 左右的性能提升,但卻要冒多線程不安全的風(fēng)險。
7、String為什么要設(shè)計成不可變的?
- 便于實現(xiàn)字符串常量池。
- 使多線程安全
- 避免安全問題:在網(wǎng)絡(luò)連接和數(shù)據(jù)庫連接中字符串常常作為參數(shù),例如,網(wǎng)絡(luò)連接地址
URL
,文件路徑path
,反射機制所需要的String
參數(shù)。其不可變性可以保證連接的安全性。如果字符串是可變的,黑客就有可能改變字符串指向?qū)ο蟮闹担敲磿鸷車乐氐陌踩珕栴}。 - 加快字符串處理速度:由于
String
是不可變的,保證了hashcode
的唯一性,于是在創(chuàng)建對象時其hashcode
就可以放心的緩存了,不需要重新計算。這也就是Map
喜歡將String
作為Key
的原因。
到此這篇關(guān)于Java 關(guān)于String字符串原理上的問題的文章就介紹到這了,更多相關(guān)Java String內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
IDEA2020.1使用LeetCode插件運行并調(diào)試本地樣例的方法詳解
這篇文章主要介紹了IDEA2020.1使用LeetCode插件運行并調(diào)試本地樣例的方法,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2020-09-09Java使用POI導(dǎo)出大數(shù)據(jù)量Excel的方法
今天需要寫一個導(dǎo)出的Excel的功能,但是發(fā)現(xiàn)當(dāng)數(shù)據(jù)量到3萬條時,列數(shù)在23列時,內(nèi)存溢出,CPU使用100%,測試環(huán)境直接炸掉。小編給大家分享基于java使用POI導(dǎo)出大數(shù)據(jù)量Excel的方法,感興趣的朋友一起看看吧2019-11-11解決fastjson從1.1.41升級到1.2.28后報錯問題詳解
這篇文章主要介紹了解決fastjson從1.1.41升級到1.2.28后報錯問題詳解,需要的朋友可以參考下2020-02-02如何動態(tài)修改JavaBean中注解的參數(shù)值
這篇文章主要介紹了如何動態(tài)修改JavaBean中注解的參數(shù)值操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02spring mvc利用ajax向controller傳遞對象的方法示例
這篇文章主要給大家介紹了關(guān)于spring mvc利用ajax向controller傳遞對象的相關(guān)資料,文中通過示例代碼將步驟介紹的非常詳細,對大家具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來跟著小編一起學(xué)習(xí)學(xué)習(xí)吧。2017-07-07idea sql的xml文件出現(xiàn)紅色警告符的處理方式
這篇文章主要介紹了idea sql的xml文件出現(xiàn)紅色警告符處理方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-04-04Spring Data MongoDB中實現(xiàn)自定義級聯(lián)的方法詳解
這篇文章主要給大家介紹了關(guān)于Spring Data MongoDB中實現(xiàn)自定義級聯(lián)的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-11-11