您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關JavaString對象是什么,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
Java String 對象,你真的了解了嗎?
String對象是 Java 中使用最頻繁的對象之一,所以 Java 公司也在不斷的對String對象的實現進行優化,以便提升String對象的性能,看下面這張圖,一起了解一下String對象的優化過程。
在 Java6 以及之前的版本中String對象是對 char 數組進行了封裝實現的對象,主要有四個成員變量:char 數組、偏移量 offset、字符數量 count、哈希值 hash。String對象是通過 offset 和 count 兩個屬性來定位 char[] 數組,獲取字符串。這么做可以高效、快速地共享數組對象,同時節省內存空間,但這種方式很有可能會導致內存泄漏。2. 從 Java7 版本開始到 Java8 版本從 Java7 版本開始,Java 對String類做了一些改變。String類中不再有 offset 和 count 兩個變量了。這樣的好處是String對象占用的內存稍微少了些,同時 String.substring 方法也不再共享 char[],從而解決了使用該方法可能導致的內存泄漏問題。3. 從 Java9 版本開始將 char[] 數組改為了 byte[] 數組,為什么需要這樣做呢?我們知道 char 是兩個字節,如果用來存一個字節的字符有點浪費,為了節約空間,Java 公司就改成了一個字節的byte來存儲字符串。這樣在存儲一個字節的字符是就避免了浪費。在 Java9 維護了一個新的屬性 coder,它是編碼格式的標識,在計算字符串長度或者調用 indexOf() 函數時,需要根據這個字段,判斷如何計算字符串長度。coder 屬性默認有 0 和 1 兩個值, 0 代表Latin-1(單字節編碼),1 代表 UTF-16 編碼。如果 String判斷字符串只包含了 Latin-1,則 coder 屬性值為 0 ,反之則為 1。
通過字符串常量的方式String str= "pingtouge"的形式,使用這種形式創建字符串時, JVM 會在字符串常量池中先檢查是否存在該對象,如果存在,返回該對象的引用地址,如果不存在,則在字符串常量池中創建該字符串對象并且返回引用。使用這種方式創建的好處是:避免了相同值的字符串重復創建,節約了內存。2、String()構造函數的方式String str = new String("pingtouge")的形式,使用這種方式創建字符串對象過程就比較復雜,分成兩個階段,首先在編譯時,字符串pingtouge會被加入到常量結構中,類加載時候就會在常量池中創建該字符串。然后就是在調用new()時,JVM 將會調用String的構造函數,同時引用常量池中的pingtouge字符串,在堆內存中創建一個String對象并且返回堆中的引用地址。了解了String對象兩種創建方式,我們來分析一下下面這段代碼,加深我們對這兩種方式的理解,下面這段代碼片中,str是否等于str1呢?
我們逐一來分析這幾行代碼,首先從String str = "pingtouge"開始,這里使用了字符串常量的方式創建字符串對象,在創建pingtouge字符串對象時,JVM會去常量池中查找是否存在該字符串,這里的答案肯定是沒有的,所以JVM將會在常量池中創建該字符串對象并且返回對象的地址引用,所以str指向的是pingtouge字符串對象在常量池中的地址引用。
然后是String str1 = new String("pingtouge")這行代碼,這里使用的是構造函數的方式創建字符串對象,根據我們上面對構造函數方式創建字符串對象的理解,str1得到的應該是堆中pingtouge字符串的引用地址。由于str指向的是pingtouge字符串對象在常量池中的地址引用而str1指向的是堆中pingtouge字符串的引用地址,所以str肯定不等于str1。
從我們知道String對象的那一刻起,我想大家都知道了String對象是不可變的。那它不可變是怎么做到的呢?Java 這么做能帶來哪些好處?我們一起來簡單的探討一下,先來看看String 對象的一段源碼:
從這段源碼中可以看出,String類用了 final 修飾符,我們知道當一個類被 final 修飾時,表明這個類不能被繼承,所以String類不能被繼承。這是String不可變的第一點
再往下看,用來存儲字符串的char value[]數組被private 和final修飾,我們知道對于一個被final的基本數據類型的變量,則其數值一旦在初始化之后便不能更改。這是String不可變的第二點。Java 公司為什么要將String設置成不可變的,主要從以下三方面考慮:1、保證 String 對象的安全性。假設 String 對象是可變的,那么 String 對象將可能被惡意修改。2、保證 hash 屬性值不會頻繁變更,確保了唯一性,使得類似 HashMap 容器才能實現相應的 key-value 緩存功能。3、可以實現字符串常量池
關于JavaString對象是什么就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。