久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

JavaString對象是什么

182次閱讀
沒有評論

共計 2149 個字符,預計需要花費 6 分鐘才能閱讀完成。

這篇文章將為大家詳細講解有關 JavaString 對象是什么,文章內容質量較高,因此丸趣 TV 小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

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 對象是什么就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-07-28發表,共計2149字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 吴旗县| 图们市| 甘孜县| 清徐县| 呼图壁县| 图片| 镶黄旗| 崇礼县| 巴中市| 滨州市| 卢龙县| 江陵县| 吐鲁番市| 罗山县| 仁寿县| 会泽县| 宁乡县| 进贤县| 股票| 深州市| 安庆市| 台南县| 威远县| 井冈山市| 赣州市| 荣昌县| 扎兰屯市| 宁乡县| 长岭县| 财经| 大连市| 岚皋县| 桂林市| 图们市| 垫江县| 大理市| 焦作市| 阿瓦提县| 南开区| 洛南县| 岗巴县|