亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java 關(guān)于String字符串原理上的問(wèn)題

 更新時(shí)間:2022年04月07日 15:33:40   作者:崇尚學(xué)技術(shù)的科班人  
字符串廣泛應(yīng)用 在 Java 編程中,在 Java 中字符串屬于對(duì)象,Java 提供了 String 類(lèi)來(lái)創(chuàng)建和操作字符串,讓我們一起來(lái)了解它

1、String 是最基本的數(shù)據(jù)類(lèi)型嗎?

不是。

Java 中的基本數(shù)據(jù)類(lèi)型只有 8 個(gè) :byte、short、int、long、float、double、char、boolean;除了基本類(lèi)型,剩下的都是引用類(lèi)型,Java 5 以后引入的枚舉類(lèi)型也算是一種比較特殊的引用類(lèi)型。

2、字符型常量和字符串常量的區(qū)別?

  • 形式上: 字符常量是單引號(hào)引起的一個(gè)字符,字符串常量是雙引號(hào)引起的若干個(gè)字符;
  • 含義上: 字符常量相當(dāng)于一個(gè)整型值( ASCII 值),可以參加表達(dá)式運(yùn)算;字符串常量代表一個(gè)地址值(該字符串在內(nèi)存中存放位置,相當(dāng)于對(duì)象;
  • 占內(nèi)存大?。鹤址A恐徽?2 個(gè)字節(jié);字符串常量占若干個(gè)字節(jié)(至少一個(gè)字符結(jié)束標(biāo)志) (注意: char 在Java中占兩個(gè)字節(jié))。

3、什么是字符串常量池?

字符串常量池:jvm為了提升性能和減少內(nèi)存開(kāi)銷(xiāo),避免字符的重復(fù)創(chuàng)建,其維護(hù)了一塊特殊的內(nèi)存空間,即字符串常量池。當(dāng)需要使用字符串時(shí),先去字符串常量池中查看該字符串是否已經(jīng)存在,如果存在,則可以直接使用,如果不存在,初始化,并將該字符串放入字符串常量池中。

所處位置說(shuō)明

  • 在jdk6中,常量池的位置在永久代(方法區(qū))中,此時(shí)常量池中存儲(chǔ)的是對(duì)象。
  • 在jdk7中,常量池的位置在堆中,此時(shí),常量池存儲(chǔ)的就是引用了。
  • 在jdk8中,永久代(方法區(qū))被元空間取代了。

4、String str=new String(“aaa”)創(chuàng)建了幾個(gè)對(duì)象?

1個(gè)或者2個(gè)

  • 第一種情況:字符串常量池中已經(jīng)有了 "aaa" 字符串常量了,那么此時(shí)會(huì)在堆中通過(guò) new String()方法 創(chuàng)建 1 個(gè)字符串對(duì)象。
  • 第二種情況:那就是字符串常量池中沒(méi)有 "aaa" 字符串常量了,此時(shí)會(huì)創(chuàng)建 2 個(gè)對(duì)象。首先 "aaa" 該表達(dá)式會(huì)查看字符串常量池中是否含有 "aaa" 常量,如果沒(méi)有的話,那么在字符串常量池中就會(huì)生成一個(gè)值為 "aaa" 的字符串常量,然后再在堆中通過(guò) new String()方法 創(chuàng)建一個(gè)值為 "aaa" 的對(duì)象。

5、字符串的 intern 方法的執(zhí)行過(guò)程是怎樣的?

你學(xué) Java 的別這個(gè)高頻知識(shí)點(diǎn)都不知道呀,不知道的趕緊偷摸補(bǔ)一下。

在解析這個(gè)問(wèn)題之前,我們先來(lái)做個(gè)題目:

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 的處理是 先判斷字符串常量是否在字符串常量池中,如果存在直接返回該常量,如果沒(méi)有找到,則將該字符串常量加入到字符串常量區(qū),也就是在字符串常量區(qū)建立該常量;
  • 在JDK1.7中,intern 的處理是 先判斷字符串常量是否在字符串常量池中,如果存在直接返回該常量,如果沒(méi)有找到,說(shuō)明該字符串常量在堆中,則處理是把堆區(qū)該對(duì)象的引用加入到字符串常量池中,以后別人拿到的是該字符串常量的引用,實(shí)際存在堆中。

6、String,StringBuffer,StringBuilder 的區(qū)別是什么?

可變與不可變

String

// 源碼
private final char value[];

String 類(lèi)中使用字符數(shù)組保存字符串,因?yàn)橛?“final” 修飾符,所以 String 對(duì)象是不可變的。對(duì)于已經(jīng)存在的 String 對(duì)象的修改都是重新創(chuàng)建一個(gè)新的對(duì)象,然后把新的值保存進(jìn)去。

StringBufferStringBuilder

// 源碼
char[] value;

StringBufferStringBuilder 都繼承自 AbstractStringBuilder 類(lèi),在 AbstractStringBuilder 中也是使用字符數(shù)組保存字符串,這兩種對(duì)象都是可變的。

是否多線程安全

  • String 中的對(duì)象是不可變的,也就可以理解為常量,顯然線程安全。
  • StringBuilder 是非線程安全的。
  • StringBuffer 對(duì)方法加了同步鎖或者對(duì)調(diào)用的方法加了同步鎖,所以是線程安全的。
// StringBuffer 的追加操作
public synchronized StringBuffer append(StringBuffer sb) {
     toStringCache = null;
     super.append(sb);
     return this;
 }

性能

  • 每次對(duì) String 類(lèi)型進(jìn)行改變的時(shí)候,都會(huì)生成一個(gè)新的 String 對(duì)象,然后將指針指向新的 String 對(duì)象。
  • StringBuffer 每次都會(huì)對(duì) StringBuffer 對(duì)象本身進(jìn)行操作,而不是生成新的對(duì)象并改變對(duì)象引用。相同情況下使用 StringBuilder 相比使用 StringBuffer 僅能獲得 10%~15% 左右的性能提升,但卻要冒多線程不安全的風(fēng)險(xiǎn)。

7、String為什么要設(shè)計(jì)成不可變的?

  • 便于實(shí)現(xiàn)字符串常量池。
  • 使多線程安全
  • 避免安全問(wèn)題:在網(wǎng)絡(luò)連接和數(shù)據(jù)庫(kù)連接中字符串常常作為參數(shù),例如,網(wǎng)絡(luò)連接地址 URL,文件路徑path,反射機(jī)制所需要的String參數(shù)。其不可變性可以保證連接的安全性。如果字符串是可變的,黑客就有可能改變字符串指向?qū)ο蟮闹?,那么?huì)引起很?chē)?yán)重的安全問(wèn)題。
  • 加快字符串處理速度:由于String是不可變的,保證了hashcode的唯一性,于是在創(chuàng)建對(duì)象時(shí)其hashcode就可以放心的緩存了,不需要重新計(jì)算。這也就是Map喜歡將String作為Key的原因。

到此這篇關(guān)于Java 關(guān)于String字符串原理上的問(wèn)題的文章就介紹到這了,更多相關(guān)Java String內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • IDEA2020.1使用LeetCode插件運(yùn)行并調(diào)試本地樣例的方法詳解

    IDEA2020.1使用LeetCode插件運(yùn)行并調(diào)試本地樣例的方法詳解

    這篇文章主要介紹了IDEA2020.1使用LeetCode插件運(yùn)行并調(diào)試本地樣例的方法,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2020-09-09
  • Java使用POI導(dǎo)出大數(shù)據(jù)量Excel的方法

    Java使用POI導(dǎo)出大數(shù)據(jù)量Excel的方法

    今天需要寫(xiě)一個(gè)導(dǎo)出的Excel的功能,但是發(fā)現(xiàn)當(dāng)數(shù)據(jù)量到3萬(wàn)條時(shí),列數(shù)在23列時(shí),內(nèi)存溢出,CPU使用100%,測(cè)試環(huán)境直接炸掉。小編給大家分享基于java使用POI導(dǎo)出大數(shù)據(jù)量Excel的方法,感興趣的朋友一起看看吧
    2019-11-11
  • 在Java8中構(gòu)建Stream流的多種方式詳解

    在Java8中構(gòu)建Stream流的多種方式詳解

    當(dāng)我們處理集合數(shù)據(jù)時(shí),往往需要對(duì)其進(jìn)行各種操作,如過(guò)濾、映射、排序、歸約等,在 Java 8 中引入的 Stream 流為我們提供了一種更加簡(jiǎn)潔和靈活的方式來(lái)處理數(shù)據(jù),本文將介紹如何基于 Stream 構(gòu)建流,為你展示創(chuàng)建和操作流的多種方法
    2023-08-08
  • 解決fastjson從1.1.41升級(jí)到1.2.28后報(bào)錯(cuò)問(wèn)題詳解

    解決fastjson從1.1.41升級(jí)到1.2.28后報(bào)錯(cuò)問(wèn)題詳解

    這篇文章主要介紹了解決fastjson從1.1.41升級(jí)到1.2.28后報(bào)錯(cuò)問(wèn)題詳解,需要的朋友可以參考下
    2020-02-02
  • 如何動(dòng)態(tài)修改JavaBean中注解的參數(shù)值

    如何動(dòng)態(tài)修改JavaBean中注解的參數(shù)值

    這篇文章主要介紹了如何動(dòng)態(tài)修改JavaBean中注解的參數(shù)值操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-02-02
  • spring mvc利用ajax向controller傳遞對(duì)象的方法示例

    spring mvc利用ajax向controller傳遞對(duì)象的方法示例

    這篇文章主要給大家介紹了關(guān)于spring mvc利用ajax向controller傳遞對(duì)象的相關(guān)資料,文中通過(guò)示例代碼將步驟介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)跟著小編一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-07-07
  • java判斷兩個(gè)時(shí)間是不是同一天的方法

    java判斷兩個(gè)時(shí)間是不是同一天的方法

    這篇文章主要介紹了java判斷兩個(gè)時(shí)間是不是同一天的方法,需要的朋友可以參考下
    2014-02-02
  • Spring 使用Validation 驗(yàn)證框架的問(wèn)題詳解

    Spring 使用Validation 驗(yàn)證框架的問(wèn)題詳解

    Spring Boot在內(nèi)部通過(guò)集成hibernate-validation已經(jīng)實(shí)現(xiàn)了JSR-349驗(yàn)證規(guī)范接口,在Spring Boot項(xiàng)目中只要直接使用就行了。 一般用在Controller中用于驗(yàn)證前端傳來(lái)的參數(shù)。這篇文章給大家介紹Spring Validation 驗(yàn)證框架的相關(guān)知識(shí),感興趣的朋友一起看看吧
    2021-07-07
  • idea sql的xml文件出現(xiàn)紅色警告符的處理方式

    idea sql的xml文件出現(xiàn)紅色警告符的處理方式

    這篇文章主要介紹了idea sql的xml文件出現(xiàn)紅色警告符處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • Spring Data MongoDB中實(shí)現(xiàn)自定義級(jí)聯(lián)的方法詳解

    Spring Data MongoDB中實(shí)現(xiàn)自定義級(jí)聯(lián)的方法詳解

    這篇文章主要給大家介紹了關(guān)于Spring Data MongoDB中實(shí)現(xiàn)自定義級(jí)聯(lián)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-11-11

最新評(píng)論