最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

帶你一文深入認(rèn)識(shí)Java?String類

 更新時(shí)間:2022年06月22日 14:20:19   作者:蘿詩粉  
這篇文章主要介紹了帶你一文深入認(rèn)識(shí)Java?String類,String 類在Java中是很常用的類,很重要的類,在后續(xù)的學(xué)習(xí)中經(jīng)常會(huì)用到,是后續(xù)學(xué)習(xí)的基礎(chǔ), 文章圍繞主題展開更多詳細(xì)內(nèi)容,需要的小伙伴可以參考一下,希望對(duì)你的學(xué)習(xí)有所幫助

前言

String 類在Java中是很常用的類,很重要的類,在后續(xù)的學(xué)習(xí)中經(jīng)常會(huì)用到,是后續(xù)學(xué)習(xí)的基礎(chǔ)

一、認(rèn)識(shí)String

1.JDK中的String

首先我們看看JDK中的String類源碼,它實(shí)現(xiàn)了很多接口,可以看到String類被final修飾了,這就說明String類不可以被繼承,String不存在子類,這樣所有使用JDK的人,用到的String類都是同一個(gè),如果String允許被繼承,每個(gè)人都可以對(duì)String進(jìn)行擴(kuò)展,每個(gè)人使用的String都不是同一個(gè)版本,兩個(gè)不同的人使用相同的方法,表現(xiàn)出不同的結(jié)果,這就導(dǎo)致代碼沒辦法進(jìn)行開發(fā)了
繼承和方法覆寫在帶來靈活性的同時(shí),也會(huì)帶來很多子類行為不一致的問題

2.創(chuàng)建字符串的四種方式

方式一:直接賦值(常用)

String str = " hello word "

方式二:通過構(gòu)造方法產(chǎn)生對(duì)象

String str1 = new String(" hello word ");

方式三:通過字符數(shù)組產(chǎn)生對(duì)象

char[] data = new char[]{‘a’ , ‘b’ ,‘c’};

方式四:通過String的靜態(tài)方法valueOf(任意數(shù)據(jù)類型) = >轉(zhuǎn)為字符串(常用)

String str2 = String.valueOf(10);

3.字符串的字面量

字面量:直接寫出來的數(shù)值叫做字面量

10 – > int字面量
10.1 --> double字面量
true --> boolean字面量
" abc " – > String字面量

字符串的字面量其實(shí)就是一個(gè)字符串對(duì)象

String str = “hello word”;
String str2 = str;

此時(shí)這既是一個(gè)字符串的字面量,也是字符串的對(duì)象,為了方便理解,畫個(gè)圖,此時(shí)是為了方便理解我們暫時(shí)先認(rèn)為它儲(chǔ)存在堆上,其實(shí)實(shí)在方法區(qū)中存放

此時(shí)讓str2 = “Hello”;此時(shí)對(duì)str的輸出并沒有影響,因?yàn)楸?quot; "括起來的Hello也是一個(gè)字符串對(duì)象,說明此時(shí)在堆上新開辟了一塊空間,而此時(shí)str2保存的就是新對(duì)象的地址空間,對(duì)str沒有影響

4.字符串比較相等

所有的引用數(shù)據(jù)類型在比較是否相等時(shí),使用equals方法比較,JDK的常用類,都已經(jīng)覆寫了equals方法,直接使用即可
引用數(shù)據(jù)類型使用 == 比較的是地址
下圖是兩個(gè)引用指向了同一塊地址空間,和字符串的常量池有關(guān)

下圖產(chǎn)生了兩個(gè)對(duì)象,兩塊地址空間,使用==返回的就是false

equals的比較大小是區(qū)分大小寫的比較

equalsIgnoreCase方法是不區(qū)分大小寫的比較

二、字符串的常量池

1.什么是字符串常量池


當(dāng)使用直接賦值法產(chǎn)生字符串對(duì)象的時(shí)候,JVM會(huì)維護(hù)一個(gè)字符串的常量池,若該對(duì)象在堆中還不存,就產(chǎn)生一個(gè)字符串對(duì)象加入到字符串常量池中;當(dāng)繼續(xù)使用直接賦值法產(chǎn)生字符串對(duì)象的時(shí)候,JVM發(fā)現(xiàn)該引用指向的內(nèi)容在常量池中已經(jīng)存在了,此時(shí)就不再新建字符串對(duì)象,而是直接復(fù)用已有的對(duì)象,這也是為什么上圖的三個(gè)引用指向的是同一塊地址

當(dāng)?shù)谝淮萎a(chǎn)生對(duì)象的時(shí)候,常量池中還什么都沒有,就在常量池中產(chǎn)生一個(gè)字符串對(duì)象存入,當(dāng)?shù)诙谌萎a(chǎn)生對(duì)象時(shí),JVM發(fā)現(xiàn)常量池中已經(jīng)存在相同的內(nèi)容,就不再產(chǎn)生新的對(duì)象,直接指向和str1相同的地址空間

程序都是從右向左執(zhí)行的,此時(shí)第一行代碼的右邊就是一個(gè)字符串常量,也是一個(gè)字符串對(duì)象,所以先在常量池中開辟一塊空間,然后新建一個(gè)字符串對(duì)象存入,程序再往左執(zhí)行,遇到new關(guān)鍵字,此時(shí)新建一個(gè)對(duì)象存入堆中,然后str1 指向堆中的對(duì)象,在指向第二行第三行代碼時(shí),發(fā)現(xiàn)常量池中已經(jīng)存在該對(duì)象,不再新建,遇到new關(guān)鍵字就新建對(duì)象,

內(nèi)存圖如下:

2.手工入池方法

String類提供的intern方法,這是一個(gè)本地方法:

調(diào)用intern方法會(huì)將當(dāng)前字符串引用指向的對(duì)象保存到字符串常量池中,有兩種情況:

  • 1.若當(dāng)前常量池中已經(jīng)存在了該對(duì)象,則不再產(chǎn)生新的對(duì)象,返回常量池中的String對(duì)象
  • 2.若當(dāng)前常量池中不存在該對(duì)象,則將該對(duì)象入池,返回入池后的地址。

看一下下面這幾行代碼的輸出:

因?yàn)閕ntern方法是有返回值的,此時(shí)str1只是調(diào)用了intern方法,并沒有接收返回值,所以str1還是指向堆中的對(duì)象,str2指向常量池中的對(duì)象,所以返回false;

只要接收一下調(diào)用intern方法的返回值,就會(huì)返回true;

此時(shí)就將str1指向的對(duì)象手動(dòng)入池了,池中已有該對(duì)象,直接讓str1指向該對(duì)象

再看看下面這幾行代碼的輸出:

手動(dòng)入池時(shí),池中還沒有任何東西,直接移入常量池中

三、字符串的不可變性 1.為什么不可變

注意:所謂的字符串不可變,指的是字符串的內(nèi)容不可變,而不是字符串的引用不能變

這里的不可變指的是" hello " , " world " , " helloworld " , " !!! " , 以及拼接后的"helloworld!!!"這些已經(jīng)創(chuàng)建好的字符串對(duì)象,這些對(duì)象一旦聲明后就無法修改其內(nèi)容,但是引用是可以改變的,一會(huì)指向hello,一會(huì)指向helloworld,一會(huì)指向hello world?。?!,這都是可以的

字符串就是就是一個(gè)字符數(shù)組—> char[],字符串其實(shí)在字符數(shù)組中保存。字符串的內(nèi)容為什么不能改變?我們看看字符串的源碼就知道了。

我們可以看到String內(nèi)部的字符數(shù)組是被封裝起來的,String類的外部無法訪問到這個(gè)字符數(shù)組,更何談改變字符串的內(nèi)容

String str = " hello ";

2.如何修改字符串內(nèi)容

  • 1.在運(yùn)行時(shí)通過反射破壞value數(shù)組的封裝
  • 2.更換使用StringBuilder或者StringBuffer類 - - 已經(jīng)不是一個(gè)類型了
    • a.StringBuilder:線程不安全,性能較強(qiáng)
    • b.StringBuffer:線程安全,性能較差

除此之外兩個(gè)類的用法完全相同

若需要頻繁的進(jìn)行字符串的拼接,使用StringBuilder類的append方法,這里只產(chǎn)生了一個(gè)對(duì)象,一會(huì)變成hello,一會(huì)變成hello world

3.StringBuilder類的具體使用

StringBuilder類和String是兩個(gè)獨(dú)立的類,StringBuilder類就是為了解決字符串的拼接問題產(chǎn)生的

StringBuilder類和String類的相互轉(zhuǎn)換:

1.StringBuilder變?yōu)镾tring類調(diào)用toString方法即可

2.String類轉(zhuǎn)變?yōu)镾tringBuilder類,使用StringBuilder的構(gòu)造方法或者append方法

其他常用方法:

a.字符串的反轉(zhuǎn)操作,sb提供的reverse();

b.刪除指定范圍的數(shù)據(jù),delete(int start,int end);刪除從start開始,到end之前的所有內(nèi)容,左閉右開區(qū)間

c.插入操作,insert(int start,各種數(shù)據(jù)類型):從start索引位置開始插入,插入的起始索引為start

到此這篇關(guān)于帶你一文深入認(rèn)識(shí)Java String類的文章就介紹到這了,更多相關(guān)Java String類內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot異步使用@Async的原理以及線程池配置詳解

    SpringBoot異步使用@Async的原理以及線程池配置詳解

    在項(xiàng)目中當(dāng)訪問其他人的接口較慢時(shí),不想程序一直卡在耗時(shí)任務(wù)上,想程序能夠并行執(zhí)行,我們可以使用多線程來并行的處理任務(wù),也可以使用spring提供的異步處理方式@Async,這篇文章主要給大家介紹了關(guān)于SpringBoot異步使用@Async的原理以及線程池配置的相關(guān)資料
    2021-09-09
  • Mybatis增刪改查mapper文件寫法詳解

    Mybatis增刪改查mapper文件寫法詳解

    這篇文章主要介紹了Mybatis增刪改查mapper文件寫法的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • Java實(shí)現(xiàn)用戶短信驗(yàn)證碼登錄功能實(shí)例代碼

    Java實(shí)現(xiàn)用戶短信驗(yàn)證碼登錄功能實(shí)例代碼

    現(xiàn)在不管是各類的網(wǎng)站,還是大小社交app,登錄方式是越來越多了,但是大部分還是以短信登錄為主,本文主要介紹了java短信驗(yàn)證碼登錄功能設(shè)計(jì)與實(shí)現(xiàn),感興趣的可以了解一下
    2021-11-11
  • Java基礎(chǔ)知識(shí)之StringWriter流的使用

    Java基礎(chǔ)知識(shí)之StringWriter流的使用

    這篇文章主要介紹了Java基礎(chǔ)知識(shí)之StringWriter流的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • gateway網(wǎng)關(guān)接口請(qǐng)求的校驗(yàn)方式

    gateway網(wǎng)關(guān)接口請(qǐng)求的校驗(yàn)方式

    這篇文章主要介紹了gateway網(wǎng)關(guān)接口請(qǐng)求的校驗(yàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Springboot整合redis實(shí)現(xiàn)發(fā)布訂閱功能介紹步驟

    Springboot整合redis實(shí)現(xiàn)發(fā)布訂閱功能介紹步驟

    發(fā)布訂閱作為一種設(shè)計(jì)思想在很多開源組件中都有體現(xiàn),比如大家熟知的消息中間件等,可謂把發(fā)布訂閱這一思想體現(xiàn)的淋漓盡致了
    2022-09-09
  • 一文帶你揭秘SpringMvc參數(shù)值映射

    一文帶你揭秘SpringMvc參數(shù)值映射

    這篇文章主要給大家介紹了關(guān)于SpringMvc參數(shù)值映射的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-01-01
  • 徹底解決java.lang.ClassNotFoundException: com.mysql.jdbc.Driver問題

    徹底解決java.lang.ClassNotFoundException: com.mysql.jdbc.Dr

    這篇文章給大家介紹了如如何徹底解決java.lang.ClassNotFoundException: com.mysql.jdbc.Driver問題,文中有詳細(xì)的解決思路以及解決方法,需要的朋友可以參考下
    2023-11-11
  • 基于Java實(shí)現(xiàn)簡單貪吃蛇游戲

    基于Java實(shí)現(xiàn)簡單貪吃蛇游戲

    這篇文章主要為大家詳細(xì)介紹了基于Java實(shí)現(xiàn)簡單貪吃蛇,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • Java通過動(dòng)態(tài)規(guī)劃設(shè)計(jì)股票買賣最佳時(shí)機(jī)

    Java通過動(dòng)態(tài)規(guī)劃設(shè)計(jì)股票買賣最佳時(shí)機(jī)

    動(dòng)態(tài)規(guī)劃可謂是大名鼎鼎,筆試面試中的高頻考點(diǎn),也是重點(diǎn)難點(diǎn),動(dòng)態(tài)規(guī)劃類型題目靈活多變,難度系數(shù)也相對(duì)較高,往往我們做不好動(dòng)態(tài)規(guī)劃的題目就會(huì)與心儀的offer失之交臂,本篇文章我們就一起來研究一下動(dòng)態(tài)規(guī)劃設(shè)計(jì)股票買賣最佳時(shí)機(jī)
    2022-10-10

最新評(píng)論

武穴市| 巴东县| 中牟县| 教育| 吉木萨尔县| 象山县| 定日县| 合作市| 罗甸县| 万州区| 南漳县| 盐源县| 图木舒克市| 平顶山市| 沙河市| 从江县| 宿州市| 天门市| 台中市| 丽水市| 邮箱| 宿松县| 阿图什市| 三穗县| 乡城县| 互助| 通河县| 鲁甸县| 嵊州市| 涟源市| 奉贤区| 海晏县| 洛川县| 北京市| 千阳县| 顺平县| 精河县| 武安市| 堆龙德庆县| 花莲市| 昌宁县|