亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java中的String類是什么

發布時間:2020-06-18 17:18:06 來源:億速云 閱讀:168 作者:元一 欄目:編程語言

1、String類是final的,不可被繼承。public final class String。

2、String類是的本質是字符數組char[], 并且其值不可改變。private final char value[];

3、String類對象有個特殊的創建的方式,就是直接指定比如String x = "abc","abc"就表示一個字符串對象。而x是"abc"對象的地址,也叫做"abc"對象的引用。

4、String對象可以通過“+”串聯。串聯后會生成新的字符串。也可以通過concat()來串聯,這個后面會講述。

6、Java運行時會維護一個String Pool(String池),JavaDoc翻譯很模糊“字符串緩沖區”。String池用來存放運行時中產生的各種字符串,

并且池中的字符串的內容不重復。而一般對象不存在這個緩沖池,并且創建的對象僅僅存在于方法的堆棧區。

5、創建字符串的方式很多,歸納起來有三類:

其一,使用new關鍵字創建字符串,比如String s1 = new String("abc");

其二,直接指定。比如String s2 = "abc";

其三,使用串聯生成新的字符串。比如String s3 = "ab" + "c";

一. String問題答疑

  • String字符串是如何設計與實現考量的?String字符串緩存 intern()方法,由永久代移到堆中。String 的演化,Java 9 中底層把 char 數組換成了 byte 數組,占用更少的空間。在java中,String類是不可變的,對String類的任何改變,都是返回一個新的String類對象。

二. String的創建機理

由于String在Java世界中使用過于頻繁,Java為了避免在一個系統中產生大量的String對象,引入了字符串常量池。其運行機制是:創建一個字符串時,首先檢查池中是否有值相同的字符串對象,如果有則不需要創建直接從池中剛查找到的對象引用;如果沒有則新建字符串對象,返回對象引用,并且將新創建的對象放入池中。但是,通過new方法創建的String對象是不檢查字符串池的,而是直接在堆區或棧區創建一個新的對象,也不會把對象放入池中。上述原則只適用于通過直接量給String對象引用賦值的情況。博客

舉例:String str1 = "123"; //通過直接量賦值方式,放入字符串常量池
String str2 = new String(“123”);//通過new方式賦值方式,不放入字符串常量池

注意:String提供了inter()方法。調用該方法時,如果常量池中包括了一個等于此String對象的字符串(由equals方法確定),則返回池中的字符串。否則,將此String對象添加到池中,并且返回此池中對象的引用。

三. StringBuffer/StringBuilder

StringBuffer和StringBuilder都實現了AbstractStringBuilder抽象類,擁有幾乎一致對外提供的調用接口;其底層在內存中的存儲方式與String相同,都是以一個有序的字符序列(char類型的數組)進行存儲,不同點是StringBuffer/StringBuilder對象的值是可以改變的,并且值改變以后,對象引用不會發生改變;兩者對象在構造過程中,首先按照默認大小申請一個字符數組,由于會不斷加入新數據,當超過默認大小后,會創建一個更大的數組,并將原先的數組內容復制過來,再丟棄舊的數組。因此,對于較大對象的擴容會涉及大量的內存復制操作,如果能夠預先評估大小,可提升性能。

四. String類的考點分析

  • 通過 String 和相關類,考察基本的線程安全設計與實現,各種基礎編程實踐。
  • 考察 JVM 對象緩存機制的理解以及如何良好地使用。
  • 考察 JVM 優化 Java 代碼的一些技巧。
  • String 相關類的演進,比如 Java 9 中實現的巨大...

五. String技術點深入分析

5.1 String類是典型的Immutable類

是典型的 Immutable 類,被聲明成為 final class,所有屬性也都是 final 的。也由于它的不可變,類似拼接、裁剪字符串等動作,都會產生新的 String 對象。

5.2 字符串設計和實現考量

  • String 是 Immutable 類的典型實現,原生的保證了基礎線程安全,因為你無法對它內部數據進行任何修改,這種便利甚至體現在拷貝構造函數中,由于不可變,Immutable 對象在拷貝時不需要額外復制數據。
  • 為了實現修改字符序列的目的,StringBuffer 和 StringBuilder 底層都是利用可修改的(char,JDK 9 以后是 byte)數組,二者都繼承了 AbstractStringBuilder,里面包含了基本操作,區別僅在于最終的方法是否加了 synchronized。
  • 這個內部數組應該創建成多大的呢?如果太小,拼接的時候可能要重新創建足夠大的數組;如果太大,又會浪費空間。目前的實現是,構建時初始字符串長度加 16(這意味著,如果沒有構建對象時輸入最初的字符串,那么初始值就是 16)。我們如果確定拼接會發生非常多次,而且大概是可預計的,那么就可以指定合適的大小,避免很多次擴容的開銷。擴容會產生多重開銷,因為要拋棄原有數組,創建新的(可以簡單認為是倍數)數組,還要進行arraycopy。

5.3 字符串緩存

  • String 在 Java 6 以后提供了 intern()方法,目的是提示 JVM 把相應字符串緩存起來,以備重復使用。在我們創建字符串對象并調用 intern() 方法的時候,如果已經有緩存的字符串,就會返回緩存里的實例,否則將其緩存起來。
  • 在后續版本中,這個緩存被放置在堆中,這樣就極大避免了永久代占滿的問題,甚至永久代在 JDK 8 中被 MetaSpace(元數據區)替代了。而且,默認緩存大小也在不斷地擴大中,從最初的 1009,到 7u40 以后被修改為 60013。

六. String不可變的好處

6.1 可以緩存 hash 值 博客

因為 String 的 hash 值經常被使用,例如 String 用做 HashMap 的 key。不可變的特性可以使得 hash 值也不可變,因此只需要進行一次計算。

6.2 String Pool 的需要

如果一個String對象已經被創建過了,那么就會從 String Pool 中取得引用。只有 String 是不可變的,才可能使用 String Pool。

6.3 安全性

String 經常作為參數,String 不可變性可以保證參數不可變。例如在作為網絡連接參數的情況下如果 String 是可變的,那么在網絡連接過程中,String 被改變,改變 String 對象的那一方以為現在連接的是其它主機,而實際情況卻不一定是。

6.4 線程安全

String 不可變性天生具備線程安全,可以在多個線程中安全地使用。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

谷城县| 吴堡县| 霸州市| 秦皇岛市| 神农架林区| 晋江市| 天镇县| 渭南市| 阳东县| 延庆县| 读书| 晴隆县| 凉城县| 岚皋县| 鄂伦春自治旗| 靖州| 临漳县| 临邑县| 富宁县| 山东| 隆尧县| 宁波市| 布拖县| 潞城市| 深泽县| 宣化县| 盐池县| 皋兰县| 灵武市| 镇原县| 开远市| 南昌市| 黄骅市| 丰顺县| 万安县| 宁武县| 内江市| 北辰区| 宜州市| 南涧| 四平市|